📜  TCP定时器

📅  最后修改于: 2021-09-28 09:28:45             🧑  作者: Mango

TCP 使用多个计时器来确保在通信过程中不会遇到过大的延迟。其中一些计时器非常优雅,可以处理在第一次分析时并不明显的问题。以下部分将检查 TCP 使用的每个计时器,其中揭示了它在确保数据从一个连接正确发送到另一个连接方面的作用。

TCP 实现使用四个定时器 –

  1. 重传定时器——为了重传丢失的段,TCP 使用重传超时 (RTO)。当 TCP 发送一个段时,计时器在收到确认时启动和停止。如果定时器超时,则发生超时并重传该段。 RTO(重传超时为1个RTT)计算重传超时我们首先需要计算RTT(往返时间)。
    RTT 三种类型——
    • 测量的 RTT(RTTm) –测量的段往返时间是该段到达目的地并被确认所需的时间,尽管确认可能包括其他段。
    • 平滑 RTT(RTTs) –它是 RTTm 的加权平均值。 RTTm 很可能会发生变化,并且其波动很大,以至于无法使用单一测量来计算 RTO。
      Initially -> No value
      After the first measurement -> RTTs=RTTm
      After each measurement -> RTTs= (1-t)*RTTs + t*RTTm
      Note: t=1/8 (default if not given)
      
    • 偏离的 RTT(RTTd) –大多数实现不单独使用 RTT,因此还计算偏离的 RTT 以找出 RTO。
      Initially -> No value
      After the first measurement -> RTTd=RTTm/2
      After each measurement -> RTTd= (1-k)*RTTd + k*(RTTm-RTTs)
      Note: k=1/4 (default if not given)
      

    重传超时:RTO 计算 – RTO的值基于平滑的往返时间及其偏差。大多数实现使用以下公式来计算 RTO:

    Initial value -> Original (given in question)
    After any measurement -> RTO=RTTs + 4*RTTd
    

    #注意:每次重传时,RTO 的值都会加倍。 ( RTO(new) = RTO(before retransmission) *2 ) 这在 Karn’s Algorithm 中有解释

  2. 持久计时器——为了处理零窗口大小的死锁情况,TCP 使用持久计时器。当发送 TCP 收到窗口大小为零的确认时,它启动一个持久计时器。当持久性计时器关闭时,发送方 TCP 会发送一个称为探测的特殊段。该段仅包含 1 个字节的新数据。它有一个序号,但它的序号从未被确认;在计算其余数据的序列号时甚至会忽略它。探测导致接收 TCP 重新发送丢失的确认。
  3. 保持活动定时器 – 保持活动定时器用于防止两个 TCP 之间的长时间空闲连接。如果客户端打开到服务器的 TCP 连接传输一些数据并变得无声,则客户端将崩溃。在这种情况下,连接将永远保持打开状态。因此使用了保活定时器。每次服务器收到客户端的消息时,它都会重置此计时器。超时时间通常为 2 小时。如果服务器在 2 小时后没有收到来自客户端的消息,它会发送一个探测段。如果在 10 次探测后没有响应,每次探测间隔 75 秒,则假定客户端已关闭并终止连接。
  4. Time Wait Timer –此计时器在 tcp 连接终止期间使用。计时器在发送第二个 FIN 的最后一个 Ack 并关闭连接后启动。

    TCP 连接关闭后,仍在通过网络的数据报有可能尝试访问关闭的端口。安静计时器旨在防止刚刚关闭的端口再次快速重新打开并接收这些最后的数据报。

    安静计时器通常设置为最大段寿命的两倍(与 IP 报头中的生存时间字段相同的值),以确保所有仍在前往端口的段都已被丢弃。

参考 –
TCP 计时器 – Que10