自定义TCP实现中各类TCP选项的添加时机与频次问询
TCP选项添加时机与频次指南
握手阶段(SYN/SYN-ACK/ACK)
你之前的判断是对的,握手阶段需要携带核心协商类选项,但每个选项的规则有细微差别:
- MSS(最大段长):仅在SYN和SYN-ACK段中携带,ACK段不需要。MSS是连接级别的单次传输最大长度协商,握手敲定后全程生效,后续段携带会被忽略。
- Window Scaling(窗口缩放):必须在SYN和SYN-ACK中双向携带,任意一方没在SYN里发,整个协商就不生效。握手完成后无需重复发送,缩放因子会作为连接的固定参数使用。
- SACK Permitted(允许选择性确认):同样在SYN和SYN-ACK中双向发送,用于确认双方支持SACK能力。这个是“能力协商”标记,不是实际的SACK数据。
- Timestamp(时间戳):SYN、SYN-ACK、ACK都要带,用于同步双方的时间戳初始值,为后续RTT计算、序列号回绕防护(PAWS)提供基础。
握手完成后的传输阶段
大部分选项无需重复发送,只有时间戳是例外:
- MSS/Window Scaling/SACK Permitted:完全不需要再出现在后续段中。MSS和缩放因子是连接固定参数,SACK Permitted只是能力声明,后续实际丢包时直接发送带段范围的SACK选项即可,不用再发“允许”标记。
- Timestamp:必须在所有非RST的TCP段中携带。因为RTT计算需要每个段的时间戳来更新,PAWS也依赖持续的时间戳输入校验序列号合法性。如果后续段不带,部分实现会触发异常逻辑(比如丢弃段),影响互通性。
特殊场景下的重新添加
只有以下情况需要重新携带协商类选项:
- 发送SYN段(包括初始SYN、SYN重传):只要是带SYN标记的段,都需要重新携带MSS、Window Scaling、SACK Permitted、Timestamp这些协商选项,相当于重新发起能力协商。
- 触发TCP连接恢复(比如从长时间空闲状态恢复,部分实现会重新校验能力):这种情况极少,但如果遇到对方发送带协商选项的段,你可以回应对应选项来重新确认,但正常握手后的连接不需要主动触发。
内容的提问来源于stack exchange,提问作者Narmondur
相关产品推荐
相关产品推荐

