TCP重传机制

TCP重传机制

​ 为了保证数据的正确性,TCP协议会重传丢失的数据包。TCP通过接收端返回的一系列确认信息来判断是否丢包。TCP有两套独立机制进行重传:超时重传和快速重传。

1.超时重传

​ 当发送端发送数据包后,会启动一个定时器,如果在一定时间阈值内没能收到接收端的ACK确认包,就会进行重传。

超时时间的确定

​ RTT(Round Trip Time):往返时延,也就是数据包从发出去到收到对应 ACK 的时间。RTT 是针对连接的,每一个连接都有各 自独立的 RTT。

​ RTO(Retransmission Time Out):重传超时,也就是超时时间。

SRTT <- (1 - α)·SRTT + α·RTT //求 SRTT 的加权平均

rttvar <- (1 - h)·rttvar + h·(|RTT - SRTT |) //计算 SRTT 与真实值的差距(称之为绝对误差|Err|),同样用到加权平均

RTO = SRTT + 4·rttvar //估算出来的新的 RTO,rttvar 的系数 4 是调参调出来的

​ 这个算法的整体思想就是结合平均值(就是基本方法)和平均偏差来进行估算,

2.快速重传

​ 当发现接收到失序数据包后,TCP会立刻生成确认信息,来表明出现了丢包现象。如接收端收到序号为101的段后,接收端期望收到102段,但收到了103段,此时接收端会立刻向发送端发送确认102段的ACK信息,直到102段被接受。重复ACk也可能在另一种情况下出现,即当网络中出现失序分组时,若接收端收到当前期盼序列号的后续分组时,当前期盼的段可能丢失,也可能仅为延迟到达。通常我们无法得知是哪种情况,因此TCP等待一定数目的重复ACK.,决定数据是否丢失并触发快速重传。当重复ACK累计到阈值的时候,发送端立即重传。

带选择确认的重传(SACK)

​ 发送端通过重传来填补丢失的数据段,但同时也要保证不重传已经正确接收到的数据,只需要重传接收端没收到的段。

​ 接收端向发送端指明SACK数据,指导发送端重传数据。

​ SACK选项结构:

sack

​ 其中Kind表示SACK选项被启用,Length是SACK信息总长度,L和R指明了接收端已经接受到的块,每个ACK段中的SACK信息最多包含三个块。

​ 第一个SACK块内包含的是最近接收到的报文段的序列号范围。由于SACK选项的空间有限,应尽可能确保向TCP发送端提供最新信息。其余的SACK块包含的内容也按照接收的先后依次排列。

sack1

3.为什么选择在传输层将数据分成多个段,而不是等到网络层再去分片?

​ 如果网络层分片,那么如果出现丢包现象,那么只能去重传整个数据包,在传输层分段的话,可以只重传丢失的部分,提高效率

a20d4103c3164557a8b4121c82857dcf