Appearance
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
- 1、首次计算 RTO ,R1 为第一次测量的 RTT
- RFC6298 建议使用以下的公式计算 RTO:
常见重传方式
- 超时重传
- 快速重传
- SACK
- D-SACK
一、超时重传
超时重传:设定一个定时器,当超过指定的时间后,没有收到对方的 ACK
报文,就会重发该数据,也就是超时重传。
TCP 会在以下两种情况发生超时重传
- 数据包丢失:数据包丢失,超过 RTO 没收到 ACK 就会重传数据包。
- 确认应答丢失:ACK丢失,超过 RTO 没收到 ACK 就会重传数据包。
每当遇到一次超时重传的时候,都会将下一次 RTO 设为之前两倍。
超时触发重传存在的问题是,超时周期可能相对较长。那是不是可以有更快的方式呢?
于是就可以用「快速重传」机制来解决超时重发的时间等待。
一、快速重传