
孙老师为您分享以下优质知识
IP数据报的校验和计算方法如下:
一、发送端计算步骤
将IP首部中的校验和字段(16位)置为0。
分段求和
- 将IP首部按16位为单位分成若干组(最后一组不足16位时用0填充)。
- 对每组16位数据进行二进制反码求和(即先求和再取反)。
- 若某组数据相加产生进位,需将进位加到下一组的最低位(采用32位加法)。
存储结果
将最终求和结果(16位)存入校验和字段。
二、接收端验证步骤
重新计算校验和
- 将IP首部(含原始校验和)按16位为单位分成若干组。
- 对每组16位数据进行二进制反码求和,包括原始校验和字段。
- 同样处理进位问题(最高位进位加到最低位)。
结果判断
- 若计算结果为全1(即0xFFFF),则校验和正确,数据包可正常处理。
- 若结果不为全1,则校验和错误,数据包需丢弃。
三、示例说明
假设发送端IP首部十六进制为:
`4510 0054 7e02 4000 4006`
校验和字段初始为0。
分段与求和:
- 按16位分段后:
`4510 + 0054 = 456E`
`7E02 + 4000 = 7E02`
`4006 + C0A8 = C0A8`
`031F + 030E = 0327`
- 二进制反码求和后:
`456E → 3514`
`7E02 → 3514`
`C0A8 → 3514`
`0327 → 3514`
- 总和为:`3514 + 3514 + 3514 + 3514 = 14056`(十进制)
- 转换为二进制:`1100101011101011`
- 取反后:`00110100010100`(即`3514`的补码)。
- 将`3514`存入校验和字段,发送数据包。
- 接收端重新计算时,包含原始校验和`3514`,求和结果为全1,验证通过。
四、注意事项
进位处理:需使用32位加法处理进位,避免溢出。
协议兼容性:IP、ICMP等协议均采用此算法,确保不同协议间的校验和计算一致。
通过上述步骤,可确保数据传输的可靠性,检测出传输过程中的错误。