TCP如何实现可靠传输、流量控制、拥塞控制

上一篇文章中讲述了TCP首部的存储的数据,这一篇来聊聊这些数据帮助TCP实现一些特性。

可靠传输

TCP传输会保障数据的可靠和完整,如果数据传输过程丢失了,会重新传输。

保障的第一种协议方式是 停止等待ARQ协议,发送一条数据,收到确认消息之后再发送第二条数据,如果等待了一定的时候还没有收到确认消息,则重新发送刚刚那条数据。

2_超时重传.jpeg

此时接收方可能存在相同的数据,那么它会丢弃重复数据,并重传确认的消息。发送方也有可能因为确认消息超过了设定的重传时间,而收到多条确认消息。

3_重传时发送方和接收方表现.jpeg

停止等待ARQ协议简单,但信道的利用率低,每次要等到确认才会发送下一条数据。那有没有办法提升信道的利用率,一次多传些数据呢?

连续ARQ和滑动窗口协议提供了解决方案,在接收方和发送方分别存在缓存区域,数据发送或确认后,窗口滑动到下一片区域。

其中发送缓存暂存发送应用程序传给发送方TCP准备发送的数据及TCP已发送但尚未收到确认的数据,接收缓存暂存按需到达的、但尚未被接收应用程序读取的数据及未按序到达的数据。

4_缓存区域.jpeg

发送方将多条数据按一定时间间隔发送,接收方确认该次传递数据的最后一条,发送方收到确认的请求之后,窗口滑动到下一批次需要发送请求的范围。

5_连续arp+滑动窗口.jpeg

那么如果在发送过程中存在数据丢失的请求呢,比如M1-M4的数据,其中M3丢失了,此时接收方会发送确认M2的数据,发送方会重新发送M3和M4。

但M4是被接收方正常接收的,无需再重复发送,这时候需要用到选择确认ACK,这部分的数据保存在TCP首部的选项部分,接收方通过它告知发送方,需要重传的内容,比如M3丢失,那么范围值就会少了M3这部分,发送方通过TCP首部得知只需要重传M3。

6_sack数据.png

使用连续ARQ、滑动窗口协议和选择确认ACK保障TCP的可靠传输。

流量控制

如果接收方的缓存区满了,而发送方仍然不停的发送数据,这样接收方只能将收到的数据包丢掉,这样造成了极大的网络资源浪费,流量控制就是为了避免这样的问题出现。

通过确认报文中TCP首部的窗口属性,来限制发送方的发送速率,数据发送越大,缓存区内可存储的范围越小,那么窗口的大小也会发生变化。

7_滑动窗口进行流量控制.jpeg

如果发送方接收到的窗口大小为0,那么发送方就会停止发送,但它同时会开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小,如果接收的窗口大小还是为0,则发送方再次刷新启动定时器,这样当接收方的缓存区有空余时,发送方就可以继续发送数据。

流量控制是点对点通信量的控制,是接收端控制发送端的问题,抑制发送端的发送速率,以便接收端来得及接收。但当网络设备过多,即使限制了每个设备的发送数据大小,仍然可能链路过载,这时候需要一个全局性的通信控制。

拥塞控制

拥塞控制,防止过多的数据注入到网络中,避免网络中的路由器或链路过载。实际中的拥塞控制并不会任由吞吐量稳步到达负载的最大值,然后在顶峰保持,而是指数增长到一定值后缓存上升。

因为当负载总量为1000时,最大能达到可能就800、900,当达到300左右就会轻度拥塞(丢包),达到800就会到达拥塞顶部,再持续输出吞吐量降低,如果没有拥塞控制,可能会丢包严重最后死锁。

8_拥塞控制的作用.jpeg

在了解拥塞控制的方法前,首先要知道几个名词

  • MSS(Maxium segment size) 每个段最大的数据部分大小,建立连接时确认,存在选项属性中,首部共计32字节,发送方和接收方可能不一样,取最小值
  • cwnd(congestion window) 拥塞窗口,在发送方,根据网络情况而定,比如5000
  • rwnd(receive window) 接收窗口,在接受方,告诉发送方所有段加起来的总和,比如3000
  • swnd(send window) 发送窗口,取拥塞窗口和接收窗口的最小值,此时为3000
  • swnd = min(cwnd, rwnd)

拥塞控制的算法有四种,慢开始(slow start)、拥塞避免(congestion avoidance)、
快速重传(fast retransmit)、快速恢复(fast recovery)。

慢开始:刚开始发的很慢,比如rwnd为3000,mss为100,一次最多可以发30个段,但cwnd不会发这么多,而是从100到200,到400再到800,指数增加。

9_慢开始.jpeg

拥塞避免:拥塞窗口(cwnd)缓慢增大,以免网络过早出现拥塞。

  • 加法增大 --- 慢开始有一个阈值ssthresh(slow start threshold),比如cwnd为2400,阈值1600,那么当拥塞窗口达到1600以后,就不指数增长,而是以线性增加(每次加一点)
  • 乘法减小 --- 当网络拥塞(发送方发了很多数据但没有收到接收方确认)时,将ssthresh减为拥塞窗口的一半(1200),【与此同时,执行慢开始算法,cwnd恢复初始值(100)】(旧版本)
  • 如果网络频繁拥塞,ssthresh值会下降得很快,因为不断的减半

快速重传:接收方收到错误顺序的数据时,比如m1、m2都成功确认,m3丢失,m4发送成功,此时会重复确认m2、发送方收到三个连续的m2重复确认,立刻重传m3,在此之前使用的是超时重传(等待一定的时间没有收到确认的报文再重传)。

10_快重传.jpeg

快速恢复:当网络拥塞,ssthresh减为拥塞峰值的一半时,拥塞窗口给(cwmd)不恢复到初始值,直接从ssthresh减半后的阈值1200开始,再加法增大。

这四个算法形成了TCP的拥塞控制,初始发送请求使用慢开始,线性增长阈值后,开启加法增大到拥塞窗口的值后,减法减小将阈值减小为拥塞窗口的一半,如果此时再使用慢开始从初始值开始,发送数据会比较小,快速恢复在从图标5处,直接从阈值开始,增加发送窗口数据。

11_拥塞控制.jpeg

TCP协议通过可靠传输、流量控制、拥塞控制保障数据的完整、网络的顺畅。TCP还有一个非常重要的属性,连接管理,它是如何建立连接和断开连接呢?敬请期待我下一篇文章~

以上就是关于 TCP如何实现可靠传输、流量控制、拥塞控制的内容 , 更多有关 前端网络协议的内容可以参考我其它的博文,持续更新中~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容