Skip to content

tcp重传机制

TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。但在错综复杂的网络,万一数据在传输过程中丢失了呢?所以 TCP 针对数据包丢失的情况,会用重传机制解决。

概念


  • RTT(Round-Trip Time):往返时延。是指数据从网络一端传到另一端所需的时间。
  • RTO(Retransmission Timeout):超时重传时间
    • RFC6298 建议使用以下的公式计算 RTO:
      • 1、首次计算 RTO ,R1 为第一次测量的 RTT
        • SRTT = R1
        • DevRTT = R1/2
        • RTO = μ * SRTT + ∂ * DevRT = μ * R1 + ∂ * (R1/2)
      • 2、后续计算 RTO,其中 R2 为最新测量的 RTT
        • SRTT = SRTT + α(RTT - SRTT) = R1 + α * (R2 - R1)
        • DevRTT = (1-β) * DevRTT + β*(|RTT-SRTT) = (1-β) * (R1/2) + β * (|R2-R1|)
        • RTO = μ * SRTT + ∂ * DevRTT
      • Linux 下,α = 0.125,β = 0.25, μ = 1,∂ = 4

常见重传方式

  • 超时重传
  • 快速重传
  • SACK
  • D-SACK

一、超时重传

超时重传:设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 报文,就会重发该数据,也就是超时重传。

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

  • 数据包丢失:数据包丢失,超过 RTO 没收到 ACK 就会重传数据包。
  • 确认应答丢失:ACK丢失,超过 RTO 没收到 ACK 就会重传数据包。

tcp超时重传

每当遇到一次超时重传的时候,都会将下一次 RTO 设为之前两倍

超时触发重传存在的问题是,超时周期可能相对较长。那是不是可以有更快的方式呢?

于是就可以用「快速重传」机制来解决超时重发的时间等待。

一、快速重传