TCP/IP卷一:73---TCP超时与重传之(基于计时器的重传)
分类:
文章
•
2022-10-12 17:50:05
一、计时器的工作原理
- 一旦TCP发送端得到了基于时间变化的RTT测量值,就能据此设置RTO,发送报文段时应确保重传计时器设置合理
计时器的工作原理
- 在设定计时器前,需记录被计时的报文段***,若及时收到了该报文段的ACK,那么计时器被取消。之后发送端发送一个新的数据包时,需设定一个新的计时器,并记录新的***
- 因此每一个TCP连接的发送端不断地设定和取消一个重传计时器;如果没有数据丢失,则不会出现计时器超时

二、计时器超时的重传
- 若在连接设定的RTO内,TCP没有收到被计时报文段的ACK,将会触发超时重传。我们已经在https://blog.****.net/qq_41453285/article/details/104082482文章的演示案例中看到这一过程
- TCP将超时重传视为相当重要的事件,当发生这种情况时,它通过降低当前数据发送率来对此进行快速响应。实现它有两种方法:
- 第一种方法是基于拥塞控制机制减小发送窗口大小(见后面“TCP拥塞控制”)
- 另一种方法为每当一个重传报文段被再次重传时,则增大RTO的退避因子,即前面提到的Karn算法的“第二部分”。特别是当同一报文段出现多次重传时,RTO值(暂时性地)乘上值γ来形成新的超时退避值:
- 在通常环境下,γ值为1。随着多次重传,γ呈加倍增长:2,4,8,等等
- 通常γ不能超过最大退避因子(Linux确保其RTO设置不能超过TCP_RTO_MAX,其默认值为120s)
- 一旦接收到相应的ACK,γ会重置为1

三、演示案例

- 在本例中,我们可以利用一个特殊函数将某个***的报文段多次丢弃。这与“Linux实现RTO的原理”的演示案例相比,将会使RTT引人一定的延时。连接建立之初与之前类似,仅当发送***为1和1401的报文段时,后一个包才被丢弃。当一个报文段到达接收端时,接收端并没有立即给出响应而是延迟发送ACK。在219ms内都没有得到回应,发送端的计时器超时,导致***为1的包被重传(此时的TSV值为577)。随即该包的到达使得接收端返回一个ACK。由于该ACK确认了数据被成功接收,并使得窗口前移,其TSER值被用于更新srtt和RTO分别为34和234
- 接着返回了三个ACK,带星号(*)的ACK为重复ACK,包含了SACK信息。我们将在后面两篇文章讨论重复ACK和SACK。现在,由于这些ACK并没有使发送窗口前移,这些TSER值不会被采用
- 随着最后一次重传以及报文段1401到达(在TCP时钟接收端返回***为7001的ACK,为911的时刻),修复阶段完成,表明所有数据已成功接收
四、附加