TCP 校验和为什么要包含伪首部?它能防止哪些错误?
简化版
TCP 校验和用于检测 TCP 首部、数据以及部分 IP 层关键信息是否在传输中出错。它不仅覆盖 TCP 报文段本身,还覆盖一个“伪首部”,其中包含源 IP、目的 IP、协议号和 TCP 长度。伪首部不真正发送在 TCP 首部里,但参与校验,能帮助发现报文被投递到错误地址或协议的问题。
详细版
TCP 校验和覆盖范围:
伪首部:源 IP、目的 IP、协议号、TCP 长度
TCP 首部
TCP 数据
接收方用同样范围重新计算校验和。如果结果不正确,说明报文可能损坏,通常丢弃。校验和是差错检测,不是加密认证,不能防恶意篡改。
完整版教学
一、校验和解决什么问题
网络传输中比特可能因为链路、设备、内存或驱动问题出错。TCP 校验和用于让接收端发现数据损坏。
发送端计算 checksum
接收端重新计算 checksum
不匹配则丢弃报文
它保证的是“尽量发现错误”,不是修复错误。
二、TCP 校验和覆盖哪些内容
TCP 校验和不仅覆盖 TCP 首部和数据,还覆盖 IP 层的一小段伪首部。
| 内容 | 是否真实属于 TCP 报文 | 是否参与校验 |
|---|---|---|
| TCP 首部 | 是 | 是 |
| TCP 数据 | 是 | 是 |
| 源 IP | 否 | 是 |
| 目的 IP | 否 | 是 |
| 协议号 | 否 | 是 |
| TCP 长度 | 否 | 是 |
关键点:伪首部不随 TCP 单独传输,它来自 IP 首部,但会参与 TCP 校验和计算。
三、为什么需要伪首部
如果只校验 TCP 首部和数据,某些投递错误可能不容易被 TCP 层发现。伪首部把源/目的 IP、协议号、长度纳入校验,能增强端到端一致性检查。
例如目的 IP 错误、协议号错误、长度不一致,都可能导致校验失败。
四、它是不是安全机制
不是。TCP 校验和是简单的差错检测机制,不能抵御恶意攻击者。
随机错误:有较大概率被检测
恶意篡改:攻击者可重新计算校验和
安全认证需要 TLS、IPsec、MAC 或数字签名等机制。
五、和链路层 CRC 的区别
链路层通常也有 CRC,用于检测单跳链路上的错误。TCP 校验和是端到端的,跨越整个路径。
链路层 CRC:每一跳检查
TCP checksum:端到端检查
两者层次不同,可以互相补充。
六、IPv4 和 IPv6 中的注意点
IPv4 首部有自己的首部校验和,但不覆盖数据;TCP 校验和覆盖 TCP 数据。IPv6 去掉了 IP 首部校验和,因此传输层校验更重要。
对 UDP 来说,IPv4 中 UDP 校验和可选,IPv6 中通常是必需的;TCP 校验和一直是 TCP 的基本字段。
七、常见误区与追问
- 误区:伪首部会作为 TCP 首部发送。 它只是参与计算,不是 TCP 报文的一部分。
- 误区:校验和能防黑客篡改。 它不是密码学认证,攻击者可重算。
- 误区:有链路层 CRC 就不需要 TCP 校验和。 一个是单跳,一个是端到端,层次不同。
- 追问:伪首部包含什么? 源 IP、目的 IP、协议号、TCP 长度等。
- 追问:校验失败会怎样? 接收方通常丢弃报文,依赖 TCP 重传恢复。
- 追问:为什么 IPv6 下传输层校验更重要? IPv6 没有 IP 首部校验和。
八、加强记忆
TCP 校验和要记住“三块”:伪首部、TCP 首部、TCP 数据。伪首部来自 IP 层但不真正属于 TCP,它让 TCP 校验能覆盖地址和协议上下文。它防随机错误,不防恶意篡改。