TCP快速重传与选择性重传(SACK)机制详解
字数 1495 2025-11-13 19:48:37
TCP快速重传与选择性重传(SACK)机制详解
题目描述
TCP快速重传与选择性重传(SACK)是TCP可靠性传输的重要优化机制。当数据包丢失时,标准TCP超时重传需要等待RTO(重传超时时间),而快速重传通过重复ACK快速触发重传;SACK则进一步允许接收方告知发送方具体哪些数据块已成功接收,从而避免重传已正确到达的数据。请详细解释这两种机制的工作原理和交互过程。
核心概念铺垫
- 重复ACK(Duplicate ACK):当接收方收到乱序数据包时,会立即发送已确认数据的最后一个序列号的ACK。例如已确认序列号1000,收到序列号2000的数据包(缺少1001-1999),会再次发送ACK 1000。
- 重复ACK阈值:通常设为3次,即收到3个相同ACK时认为数据丢失。
- SACK选项:TCP头部选项字段,允许接收方通过"SACK blocks"描述非连续接收的数据块范围。
快速重传机制分步详解
步骤1:乱序数据包触发重复ACK
- 发送方发送序列号1-1000、1001-2000、2001-3000、3001-4000的数据包。
- 假设1001-2000丢失,2001-3000先到达接收方。
- 接收方发现序列号不连续(期望1001却收到2001),立即发送ACK 1001(确认1000及之前数据)。
步骤2:重复ACK累积与快速重传触发
- 后续3001-4000到达时,接收方再次发送ACK 1001(累计2次重复ACK)。
- 当发送方收到第3个ACK 1001时(可能由后续数据包触发),立即判定1001-2000数据包丢失,不等待超时直接重传该段。
步骤3:重传后恢复确认
- 接收方收到重传的1001-2000后,发送ACK 4001(确认所有连续数据,因2001-4000已缓存)。
SACK机制增强详解
场景:多数据包丢失时的优化
假设发送序列号1-1000(成功)、1001-2000(丢失)、2001-3000(成功)、3001-4000(丢失)。
步骤1:SACK信息反馈
- 接收方收到2001-3000时,发送ACK 1001,并在SACK块中记录[2001,3000]。
- 收到后续数据包(如4001-5000)时,持续发送ACK 1001,并更新SACK块为[2001,3000]、[4001,5000]。
步骤2:发送方解析SACK避免冗余重传
- 发送方通过SACK块知悉2001-3000和4001-5000已成功接收,仅需重传1001-2000和3001-4000。
- 若无SACK,发送方在收到ACK 1001后可能误判仅1001-2000丢失,重传后需等待后续超时才能发现3001-4000丢失。
交互流程对比
- 无SACK时:重传1001-2000 → 接收方ACK 3001 → 超时未收到3001-4000的ACK → 重传3001-4000。
- 有SACK时:直接同时重传1001-2000和3001-4000,减少一轮等待。
技术细节补充
- SACK块结构:每个SACK块包含[左边界,右边界),如[2001,3000)表示2001-2999已接收。
- SACK协商:TCP连接时通过SYN包中的SACK-permitted选项协商支持。
- 重传策略:发送方维护"SACK重传队列",结合SACK信息和重复ACK计数决策重传范围。
总结
快速重传通过重复ACK提前触发重传,SACK通过精确反馈接收情况避免无效重传,二者结合显著提升TCP在丢包环境下的传输效率。实际网络中(如无线环境多丢包),这是保证高吞吐量的关键机制。