TCP的SACK(选择性确认)机制详解
字数 1365 2025-11-05 23:47:54
TCP的SACK(选择性确认)机制详解
一、SACK机制的产生背景
- 传统TCP确认机制的局限性:标准TCP采用累积确认机制,接收方只能确认连续数据包的最高序列号。例如已收到包1、2、4、5时,只能确认包2,导致发送方重传包3及之后所有包(即包4、5也被重复传输)。
- 网络效率问题:在高丢包率环境中,累积确认会引发大量不必要的重传,严重浪费带宽。SACK机制通过允许接收方告知发送方已成功接收的非连续数据块,实现精准重传。
二、SACK的工作原理
-
TCP选项字段扩展:
- 在TCP头部选项部分定义SACK选项(Kind=5),结构为
[Kind=5][Length][Left Edge1][Right Edge1]...[Left Edgen][Right Edgen]。 - 每个数据块由两个32位序列号表示:左边界(已接收数据块的起始序列号)和右边界(结束序列号+1)。
- 受TCP选项长度限制(最多40字节),实际可携带不超过4个数据块信息。
- 在TCP头部选项部分定义SACK选项(Kind=5),结构为
-
接收方行为:
- 当收到乱序数据包时,在ACK包中携带SACK选项。例如收到序列号1000-1999、3000-3999的包,但2000-2999丢失,则ACK包确认号仍为1000(期望下一个包),SACK选项记录3000-4000的块。
- 重复ACK(如收到新乱序包时)会持续发送最新SACK信息,帮助发送方更新网络状态。
-
发送方行为:
- 维护一个"SACK重传队列",记录接收方已确认的非连续数据块。
- 当检测到丢包(如收到3个重复ACK)时,仅重传缺失的数据段。例如缺失2000-2999,则只重传该段,避免重传已SACK确认的3000-3999段。
三、SACK与快速重传的协同
- 触发条件:发送方收到3个重复ACK且SACK信息表明有乱序数据时,立即重传缺失包,无需等待超时。
- 示例流程:
- 发送包1-5,接收方收到包1、2、4、5。
- 接收方回复ACK=3(期望包3),并SACK块[4-6](包4、5的范围)。
- 发送方收到3次ACK=3且SACK显示包4、5已收到,判断包3丢失,仅重传包3。
四、SACK的边界处理与算法优化
- 数据块合并:接收方维护接收队列,合并相邻数据块(如收到[1000-2000]和[2000-3000]时合并为[1000-3000]),减少SACK选项占用空间。
- 发送方重传策略:
- 优先重传最旧缺失段(如缺包3和包5时先重传包3)。
- 结合拥塞控制:重传期间可能减少拥塞窗口,但SACK避免过度重传,更高效利用窗口。
五、SACK的实践注意事项
- 网络设备兼容性:部分老旧防火墙或NAT设备可能错误处理TCP选项,需确保路径设备支持。
- 与TSOPT(时间戳选项)的协作:SACK常与时间戳选项共用,时间戳提供更精确的RTT计算,避免重传歧义。
- Linux内核参数调优:如
net.ipv4.tcp_sack可启用/禁用SACK,tcp_max_sack_bytes控制单次重传最大字节数。
六、总结
SACK机制通过反馈非连续数据块信息,将重传精度从"全部重传"提升至"按需重传",尤其在高丢包率网络(如无线环境)中显著提升吞吐量。它是TCP可靠性传输演进中的重要优化,与快速重传、拥塞控制共同构成现代TCP的核心能力。