TCP-重传机制(分享)

一、概述

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息,这是TCP实现可靠传输的策略之一。

但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢?

 所以 TCP 针对数据包丢失的情况,会用重传机制解决。

常见的重传机制:

超时重传

快速重传

SACK

D-SACK

二、超时重传

在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据,就是我们常说的超时重传。

TCP会在以下两种情况发生超时重传

数据包丢失

确认应答丢失

既然是超时重传,那么超时时间应该设置为多少呢?

RTT(Round-Trip Time 往返时延)

RTO(Retransmission Timeout 超时重传时间)

假设在重传的情况下,超时时间RTO「较长或较短」时,会发生什么事情呢?下图中有两种超时时间不同的情况。

当超时时间RTO 较大时,重发就慢,效率低,性能差;

当超时时间RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。

根据以上情况,我们可以得知,超时重传时间 RTO 的值应该略大于报文往返RTT 的值。

是否可以这样处理?

发送端发包时记下t0,收到接收端ack回来后记t1, RTT = t1- t0; RTO 设置成一个略大于RTT的值。

因为我们的网络也是时常变化的。也就因为「报文往返RTT 的值」是经常波动变化的,所以「超时重传时间 RTO 的值」应该是一个动态变化的。

Linux 是如何计算RTO?

核心问题是要通过采样RTT时间,然后进行加权平均,算出一个平滑RTT的值,而且这个值还因为网络是不断变化的原因是一个不断变化的值。

Jacobson / Karels 算法

SRTT = SRTT + α (RTT – SRTT)  —— 计算平滑RTT

DevRTT = (1-β)*DevRTT + β*(|RTT-SRTT|) ——计算平滑RTT和真实的差距(加权移动平均)

RTO= µ * SRTT + ∂ *DevRTT

在 Linux 下,α = 0.125,β = 0.25, μ = 1,∂ = 4。别问怎么来的,问就是大量实验中调出来的。这个算法在被用在Linux 源代码的TCP协议中。

如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍。

iOS 系统中,TCP RTO 的超时实验数据:[ 1s,1s,1s,2s,4.5s,9s,13.5s,26s,26s … ]

二、快速重传

超时重传存在的问题是,超时周期相对较长。TCP 还有一种快速重传机制,不以时间为驱动,而是以数据为驱动。

图中,发送方发出了 1,2,3,4,5 份数据:

第一份 Seq1 先送到了,于是就 Ack 回 2;

结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;

后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;

发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。

最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。

所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。

快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。

三、SACK方法

还有一种重传的方式叫:SACK (Selective Acknowledgment 选择性确认)

这种方式需要在 TCP 头部「选项」字段里加一个SACK的东西,它可以将缓存的地图发送给发送方。

如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过SACK信息发现只有200~299这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。

如果要支持SACK,必须双方都要支持。在 Linux 下,可以通过net.ipv4.tcp_sack参数打开。

四、Duplicate SACK

Duplicate SACK 又称D-SACK,其主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。下面举例两个栗子,来说明D-SACK的作用。

例子1:ACK 丢包

「接收方」发给「发送方」的两个 ACK 确认应答都丢失了,所以发送方超时后,重传第一个数据包(3000 ~ 3499)。

于是「接收方」发现数据是重复收到的,于是回了一个 SACK = 3000~3500,告诉「发送方」3000~3500 的数据早已被接收了,因为 ACK 都到了 4000 了,已经意味着 4000 之前的所有数据都已收到,所以这个 SACK 就代表着D-SACK。

这样「发送方」就知道了,数据没有丢,是「接收方」的 ACK 确认报文丢了。

例子2

数据包(1000~1499)被网络延迟了,导致「发送方」没有收到 Ack 1500 的确认报文。而后面报文到达的三个相同的 ACK 确认报文,就触发了快速重传机制,但是在重传后,被延迟的数据包(1000~1499)又到了「接收方」;

所以「接收方」回了一个 SACK=1000~1500,因为 ACK 已经到了 3000,所以这个 SACK 是 D-SACK,表示收到了重复的包。

这样发送方就知道快速重传触发的原因不是发出去的包丢了,也不是因为回应的 ACK 包丢了,而是因为网络延迟了。

D-SACK有这么几个好处:

可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;

2. 可以知道是不是「发送方」的数据包被网络延迟了;

3. 可以知道网络中是不是把「发送方」的数据包给复制了;

在 Linux 下可以通过net.ipv4.tcp_dsack参数开启/关闭这个功能。

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

推荐阅读更多精彩内容