IPv4 TCP校验和计算结果与Wireshark捕获值不匹配问题咨询
TCP校验和计算错误原因及修正方案
错误1:未加入TCP伪首部的必填字段
TCP校验和计算需要先构造IPv4伪首部,除了你已经加入的源IP、目的IP外,还需要额外加入两个16位字段:
0x0006:高8位为伪首部保留位(固定为0),低8位为TCP协议号(固定为0x06)0x0014:本次TCP段的总长度(IP总长度0x0028减去IP首部长度20字节,得到TCP段长度20字节即0x0014)
错误2:错误累加了以太网帧填充字节
你捕获的帧末尾的三组0000是以太网为了满足最小帧长要求添加的填充数据,不属于TCP段的内容,不需要加入校验和计算。
正确计算过程
第一步:累加所有参与校验的16位字段
# 伪首部部分 0xc0a8 + 0x0096 + 0xc0a8 + 0x0072 + 0x0006 + 0x0014 = 0x18272 # TCP首部部分(校验和字段置0) + 0xb26e + 0xfdb8 + 0x42c6 + 0x1f88 + 0x68dc + 0x6995 + 0x5010 + 0x01f6 + 0x0000 + 0x0000 = 0x4b95d
第二步:处理溢出位
总和0x4b95d的最高位溢出值为0x4,剩余16位值为0xb95d,将溢出位回加:0xb95d + 0x4 = 0xb961
第三步:按位取反得到校验和
16位按位取反等价于0xffff - 0xb961 = 0x469e,与Wireshark捕获的校验和完全一致。
内容的提问来源于stack exchange,提问作者Doug R
相关产品推荐
相关产品推荐

