1. TCP 序列号、累计确认与 SACK 如何协同恢复多个丢失报文段?
请说明 TCP 的序列号、累计确认与 SACK 如何协同,以恢复多个丢失的报文段?
- 序列号与编号
- 累计确认(cumulative ACK)与 SACK
- 多段丢失的恢复
TCP 用序列号给每个字节编号,接收端按序接收。累计确认(cumulative ACK)表明"该序列号之前的所有字节都已收到",但面对多个丢失段,累计确认只反映连续接收的最高序列号,无法表达"中间空洞后还有哪些收到了",导致发送端只能重传最早丢失的段(Go-Back-N 式,效率低)。SACK(Selective ACK)在 ACK 中携带"已接收的不连续段"范围,让发送端明确知道哪些段已收到、哪些丢了,从而精确重传缺失的段,避免重复重传已收到的段。协同机制:序列号标识数据位置,累计确认提供连续进度,SACK 补充"空洞中的已收段",发送端据此重传所有缺失段,一次 RTT 内恢复多个丢失段。
累计确认是"连续进度",SACK 是"不连续详情",结合两者才能高效恢复多个丢失段。SACK 解决了多段丢失时"冗余重传"与"重传延迟"问题。