IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP协议中如何保证数据传输的可靠性和效率 -> 正文阅读

[网络协议]TCP协议中如何保证数据传输的可靠性和效率

本章主要通过一段对话来说明 TCP?协作的数据传输过程,主要内容是:

? 1.丢包问题,怎么知道丢包,丢包了怎么办?

? 2.乱序,网络不可靠,如何知道那些数据已被正确接收,那些没有?

? 3.如何实现最大传输效率。

client、server 和 network

lient:Hi network,我想向 server 传输数据,需要什么条件?

network:?哦,这个简单,你只需要告诉我你的 IP 和端口号、server 的 IP 和端口号(四元组)以及你要传输的内容。

client:Ok,那我试试。

client:确实发送成功了,但是我怎么知道 server 有没有接收成功?Hi server, 你能告诉我么?

server:这个嘛...,要不这样吧,我接受到你的数据的时候,我给你返回一个 ACK, 表示我已正确接收了你的消息(等停协议),如何?

client:Ok,可以,那我也设置一个超时时间,如果在指定时间内,你都没回复我 ACK,我就认为这个数据你没有收到,我重发一次(超时重传机制)。

????????client 按这个方式发送了一段时间之后,陷入了一个苦思,它觉得这样的效率太慢了,每发送一个数据就需要等到一个 ACK,然后才能继续发送下一个,于是就去找 server 聊了起来。

client:server, 我觉得按这样的方式传输效率太慢了,每次都要等你回复之后才能进行下一个数据的传输。

server:确实是这样的,不然我们试试这样,你不用等待我的回复,你有数据就发给我,我收到数据就给你返回对应的 ACK。

?

?????????client 和 server 就按这个方式走了一会,发现挺好的,效率也高了很多。就在此时,network 打了个喷嚏。突然出现一个问题。

client:?server,我是按照 ABCD 这样的顺序给你发的,理论上你应该给返回一个 1, 怎么会返回 0。

server:let me check..., 没有问题,根据我记录我收到是 DABC, 你是不是自己弄错了。

client:没有啊,我这边记录了 ABCD 啊...。如果我们都没问题,难道是 network 搞错了。Hey network,别装死了,吭一声,这个问题怎么回事?

network:what...,上面的问题么?这个在复杂的网络中确实会出现这个问题(乱序),这个顺序我是没办法保证的,你们要自己保证啊?

client:?啊..., 难道我要回到一个数据一个 ACK 的版本么,那效率谁受得住。

server:嗯..., 也不至于,要不你告诉每个数据的发送顺序,我处理一下如何(序列号 ISN)。

client:这个是个好办法,那就这样,每个数据我都携带一个编号,你通过编号来对数据排序。

server:?Ok,那我在每次收到数据之后,我也告诉你我下一个要接收的数据编号(ACK = ISN+1)。

?????????跑了一段时间,没啥问题,准备投入正式环境使用。client 愉快的狂发数据。

server:Hey client, 你一下发那么多数据给我,我也处理不过来啊。我只能将无法处理数据被迫丢弃了。

client:啊...., 那这样我不是得重发很多数据,那怎么行。

server:是滴,所以你得控制你发送速度?

client:这也行,但是我总不能写死一个固定速率吧,你有时候比较闲,有时候有比较忙。我也不知道什么时候应该多发,什么时候该少发。

server:嗯, 这样吧,我每次ACK,我都告诉你我的能处理的数据窗口。你可以根据这个窗口值,动态调节你的发送速率(awnd 接收端窗口)。

client:好,那么我们再试试(流量控制)。

????????过了一段时间, network 突然冒出来。?

network:?两位大佬,你们是爽了,考虑过我的心情么。我处理不过来啊。

client:啊..., 你不是数据的搬运工么,怎么你也遇到瓶颈了。

server:确实,我只考虑我和 client, 忘了 network 在复杂的网络中,每个节点的传输和处理数据能力大小不一样。

network:?是的,所以为了保证效率,你们要考虑我的传输能力。

client:好吧,要不你也告诉我,你能接受多少数据量,我在你们两者之间取个最小值?

network:我咋知道我接受能力是多少,我这边那么都中间商,每个中间商的能力不一样,而且我也不知道你要用到那些中间商。

client:...

server:client, 尝试自己去探测一下 network 的传输能力吧(拥塞控制),比如你先发1个数,如果没问题,就发2个,然后发4个,然后发8(2的指数增长),以此类推,直到出现丢包(慢启动)。

client:?这是个好办法,那如果出现丢包了,我怎么办?退回上一个吗?虽然上一个是不会出现丢包。但也不是最佳值,我如何逼近这个最佳值呢?

server:嗯,我觉得可以考虑线性增加,比如每一个RRT时间,就将当前的值加一,至于具体算法如何,你可以根据自己的情况考虑(拥塞避让)。

client:?好。

?

?

?

????????好了,现在传输速率大家都满意了,总不会在出什么幺蛾子吧。过了一段时间,server进入了一段深思,那就是,难道每个数据报我都需要 ACK,我能不能积累一下,一次告诉你。于是跟发送端聊了一下。

server:?要不我多个连续的数据报,我只告诉你我收到最大的连续序列号,比如你发了1,2,3,4,5, 当我接收到 1,2,3,5 的时候,我就返回给你 收到 3,这样1,2 就等于默认收到了如何(累计 ACK)。

client:let me think, 可以。

network:这样不错,这样我就不用那么累了,少了很多工作量。

????????又发了一段时间,server 抱怨。?

server:为啥当有数据丢包的时候,我总是要等一段时间,你才发给我,每次为了一个数据,要等那么久。你能不能快点啊?我很忙的。

client:我也很无奈啊,我也不能马上知道你丢了数据,我只是在长时间等不到对应数据的 ACK,我才会重新发给你。

server:好吧,那确实也不是你的问题,不如这样,上次我说过,我会将收到的最大连续序列号的ACK 告诉你么。你看,如果你发送 1,2,3,4,5。 如果2丢失了, 收到3的时候,我给你的是2,收到4也是2, 5的时候也是2,。那能不能通过这种规律,确定我是不是丢包了?(快速重传)

client:你的意思是说,如果我连续收到同一个 ACK, 那我可以认为对应序列号的数据丢失么?我觉得的可以,那收到几次算呢?(重复ACK)

server:几次我就不知道了,开放给使用者吧,默认3就挺好。(阈值)

????????又过了一段时间,client 抱怨了。

client:?每次收到重复 ACK, 我就只能发生一个数据报,我也只知道对应那个ACK的数据丢失,重发完之后,又会来一个重复 ACK,我又得重发一次。比如:

????????我发 1,2,3,4,5,6,7,8,9

????????你只收到了1,3,4,7,8,9

?我收到了2的累计 ACK,我重发了2, 但是5,6 也缺失,下次还还得重新发5,6,这样效率一点不高,不如你顺便告诉我,你已接收的序列号,比如上面这种场景, 要就告诉我 ACK=2,? SACK= 3-4,7-9。那就可以推断出2,5,6需要重发。

server:嗯,可以也是一个好办法,那这样吧,如果你开启了某个标记位,缺失需要这个功能,那我就按你的说的,告诉你一定数量的缺失序列(SACK

client:合作愉快。

总结

? ? ? ? 本章主要介通过一个虚构故事,来阐述??TCP?协议如何保证在复杂的网络中,解决丢包、乱序、可靠性以及效率问题。其中牵扯几个概念比如 ACK、ISN、拥塞控制、慢启动、累计 ACK、快速重传等将在下一章进行解释。

参考

1.《TCP/IP 详解 卷一》 13章至17章

2.https://mp.weixin.qq.com/s/h89R86KhWiQKsBvfZpyF5Q?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:50:08  更:2021-08-22 13:51:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:23:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码