TCP中丢失恢复的速率减半技术
速率减半是一种丢包恢复算法,它克服了快速恢复算法的问题。速率减半意味着它将数据包传输速率减半,这样接收方的应用程序就不会停止。它避免了半静音窗口,否则如果接收者在此期间没有收到数据包,这会使接收者感到沮丧。因此,不是等待一半的持续时间,然后在剩余的一半持续时间内每个 DUP-ACK 发送一个数据包,而是速率减半每两个 DUP-ACK 到达发送一个数据包。传输的数据包总数与快速恢复相同,但已明智地管理等待时间。它允许网络逐渐脱离拥塞状态,而不是自身在半段时间内保持沉默,并让 inflight 下降到 cwnd 值。这是对快速恢复限制的一个很好的优化。
与快速恢复技术不同,当发送方进入恢复阶段时,速率减半不会将 cwnd 降低 50%。它逐渐减少 50%。
没有 SACK 的速率减半技术
快速恢复阶段的初始状态:
ssthresh = 5
cwnd = 10
inflight = 1
- DUP-ACK到达时,pipe=10-1=9;发件人没有回应并保持沉默。
- DUP-ACK到达时,pipe=9-1=8;现在,发送方向网络发送一个新数据包,管道=8+1=9。
- DUP-ACK到达时,pipe=9-1=8;发件人没有回应并保持沉默。
- DUP-ACK到达时,pipe=8-1=7;现在,发送者向网络发送一个新数据包,管道=7+1=8。
- DUP-ACK到达时,pipe=8-1=7;发件人没有回应并保持沉默。
- DUP-ACK到达时,pipe=7-1=6;现在,发送方向网络发送一个新数据包,管道=6+1=7。
- DUP-ACK到达时,pipe=7-1=6;发件人没有回应并保持沉默。
- DUP-ACK到达时,pipe=6-1=5;现在,发送者向网络发送一个新数据包,管道=5+1=6。
- DUP-ACK到达时,pipe=6-1=5;发件人没有回应并保持沉默。
- DUP-ACK到达时,pipe=5-1=4;现在,发送者向网络发送一个新数据包,管道=4+1=5。
因此,发送方逐渐发送新数据包,而不是停止接收方的应用程序。
这种技术有一个缺点,它不能用于所有类型的 TCP。它只能在发生丢包时 cwnd 降低到 50% 的情况下使用。像 CUBIC 这样 cwnd 减少 30% 的 TCP 不能使用速率减半算法。谷歌为此发明了另一种优化算法,称为比例降速(PRR)。
使用 SACK 的速率减半技术
当发生丢包时,
pipe = 10, cwnd = 10, ssthresh = 5.
然后 pipe 和 cwnd 在 sender 收到 9 个 ACK 并传输 4 个新段后减少到 5(见上图)。
接收方收到乱序的数据包时会发送 SACK。这会在接收缓冲区中创建漏洞,并让发送者知道它,并且发送者发送丢失的数据包以抵消丢失。
当前场景:
1 DUP-ACK 带有 SACK 信息。 SACK 表示有 2 个数据包丢失。
pipe=5-1-2=2, -1 for DUP-ACK and -2 for lost packets.
pipe = 2 segments
cwnd = 5 segments
Sender sends one new packet, pipe=2+1=3
1 DUP-ACK comes, pipe=3-1=2
Sender sends new packet, pipe=2+1=3
这个过程继续。这种方法的问题在于,即使pipe < cwnd,每个收到的 DupACK 都会发送一个新段。如果pipe << cwnd,这个问题会导致传输的保守方法。
减半率的限制:
不适合 TCP CUBIC 等 TCP 丢包时 cwnd 不降低 50% 的情况。在这种情况下,发送方不能在每 2 个 DUP-ACK 到达后发送一个新数据包。所有 TCP 都不会在丢包时将 cwnd 减少一半。这可以通过 PRR(Proportional Rate Reduction)来解决。