Wireshark中TCP接收端校验和头部值的疑问及原理解析
TCP校验和常见疑问解答
接收端校验和头部的处理规则
接收端不需要填写TCP校验和字段——这个字段由发送端计算完成后填入TCP头部,接收端仅需执行验证操作:用收到的数据包(含伪头部)重新计算校验和,再与头部中的校验和值相加,若结果为全1(0xFFFF)则判定数据包无损坏。
为什么实际看到的校验和不是0xFFFF?
你提到的计算逻辑有两个关键遗漏点,这也是实际值不为全1的核心原因:
- 分组单位错误:TCP校验和是按16位(2字节)为一组拆分数据求和,而非1字节分组。
- 伪头部的强制参与:TCP校验和计算必须包含一个「伪头部」,该伪头部不属于TCP报文本身,仅用于校验IP层传输的正确性,包含以下内容:
- 源IP地址(4字节)
- 目的IP地址(4字节)
- 保留位(1字节,值为0)
- 协议号(1字节,TCP对应值为6)
- TCP报文总长度(2字节)
完整的计算流程:
- 将TCP头部+数据按16位拆分,若总长度为奇数,则在末尾补1字节0凑整;
- 把伪头部同样按16位拆分;
- 将所有16位分组累加,若累加过程中产生进位(和超过16位),则把进位值加到低16位上;
- 对最终的累加和取反,得到的结果就是TCP校验和。
由于伪头部的存在,整个累加和几乎不可能是全0(取反后为0xFFFF),所以实际抓包看到的校验和都是类似0x34EF这样的随机值。
内容的提问来源于stack exchange,提问作者why
相关产品推荐
相关产品推荐

