TCP/IP卷一:73---TCP超时与重传之(基于计时器的重传)
发布日期:2021-06-29 22:33:30 浏览次数:2 分类:技术文章

本文共 1294 字,大约阅读时间需要 4 分钟。

一、计时器的工作原理

  • 一旦TCP发送端得到了基于时间变化的RTT测量值,就能据此设置RTO,发送报文段时应确保重传计时器设置合理

计时器的工作原理

  • 在设定计时器前,需记录被计时的报文段序列号,若及时收到了该报文段的ACK,那么计时器被取消。之后发送端发送一个新的数据包时,需设定一个新的计时器,并记录新的序列号
  • 因此每一个TCP连接的发送端不断地设定和取消一个重传计时器;如果没有数据丢失,则不会出现计时器超时

二、计时器超时的重传

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

三、演示案例

  • 我们通过建立一个与中的演示案例和前面“Linux实现RTO的原理”相似的连接来观察重传计时器的行为。这里故意两次将序列号为1401的报文段丢弃(见下图)

  • 在本例中,我们可以利用一个特殊函数将某个序列号的报文段多次丢弃。这与“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的时刻),修复阶段完成,表明所有数据已成功接收

四、附加

  • 在下一篇介绍快速重传:
  • 当网络无法正常传输数据时,重传计时器为TCP连接提供了“最后一招的重新启动” 。 在大多数情况下,计时器超时并触发重传是不必要的(也不是期望的),因为RTO的设置通常大于RTT(约2倍或更大),因此基于计时器的重传会导致网络利用率的下降。幸运的是,TCP有另一种方法来检测和修复丢包,它比超时重传更为高效。由于它并不需要计时器超时来触发,因此称为快速重传

转载地址:https://dongshao.blog.csdn.net/article/details/104092415 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TCP/IP卷一:74---TCP超时与重传之(快速重传(重复ACK))
下一篇:Linux(内核剖析):31---内核同步之(信号量(semaphore)、读写信号量(rw_semaphore))

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月07日 17时41分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章