摘要
- TCP 校验和覆盖 TCP 报头和数据,也覆盖由下层 IP 信息构成的概念性伪报头。
- 伪报头不是在线上传输的 TCP 字节;发送端和接收端分别重建它。
- 它能够发现部分错误和误投递,但不是身份认证、授权或路径证明。
TCP 段看起来从源端口和目的端口开始,但校验和的输入还包括更低层的上下文。发送端把源地址、目的地址、协议身份和 TCP 长度加入概念性的计算结构;接收端用相同信息重建输入,然后检查结果。
RFC 793 为 IPv4 规定了 96 位伪报头:两个地址、一个零字节、IP 协议号和计算得到的 TCP 长度。这些字段本来就在 IP 上下文中,因此 TCP 不会把它们再复制到自己的线格式中。它们通过 TCP 与网络层之间的接口提供。
这样设计是为了扩大错误证据的范围。只对 TCP 字节求和,可能发现不了封装数据的地址或协议身份已经改变。把选定的 IP 上下文纳入计算后,TCP 可以发现某些仅靠 TCP 报头和数据无法发现的损坏或误投递。
计算采用 16 位字的反码加法,再取反码。计算时校验和字段视为零。若被覆盖内容有奇数个八位字节,则只为补齐最后一个字而在右侧添加零字节,该字节不在线上传输。TCP 长度只计算 TCP 报头和数据,不包括 IPv4 伪报头的十二个概念性字节。
RFC 9293 保留了这一机制,并明确要求发送端必须生成、接收端必须检查 TCP 校验和。任何承载 TCP 的下层协议都必须提供源地址、目的地址、协议身份以及确定 TCP 长度的方法。
IPv6 伪报头为 320 位,包含两个 IPv6 地址、上层分组长度、三个零字节和标识 TCP 的 Next Header 值。若中间存在扩展报头,应使用扩展链末端标识 TCP 的值,而不一定是固定 IPv6 报头中的直接 Next Header 值。使用源路由时,校验和采用最初源地址和最终目的地址,而非途中地址。
匹配的校验和只说明双方重建的被覆盖字可能一致。它不证明发送者身份、连接授权或实际路径,也不能阻止能够修改流量并重新计算校验和的攻击者。伪报头的历史意义在于层间契约:IP 提供地址上下文,TCP 将其纳入完整性计算,而线上无需增加一份报头。
来源
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
