
耐性与骨气为您分享以下优质知识
二进制校验和的计算方法主要分为发送端和接收端两个步骤,具体如下:
一、发送端计算步骤
将校验和字段设置为0。
分组求和
- 将数据按16位(2字节)为单位进行分组。
- 对每组数据进行二进制反码求和。反码求和的规则是先进行二进制加法,然后将结果取反(0变1,1变0)。
处理进位
- 若最高位有进位,则将进位1加到最低位。
存储校验和
- 将最终结果存入校验和字段中。
二、接收端验证步骤
初始化校验和字段
将校验和字段设置为0。
分组求和(含校验和)
- 将数据按16位(2字节)为单位进行分组,包括校验和字段。
- 对每组数据进行二进制反码求和,同样采用循环移位加法(即先加后取反)。
检查结果
- 若计算结果为全1(即二进制反码中的0),则校验和正确,数据包有效。
- 若结果不为全1,则校验和错误,数据包需丢弃。
三、示例说明(以IP首部为例)
假设IP首部校验和字段为16位,数据包首部为:
`1100 1010 1011 1100 1010 1011`
发送端计算
- 将首部按16位分组:`1100 1010` 和 `1011 1100`
- 反码求和:
- `1100 1010` → `0011 0101`
- `1011 1100` → `0100 0010`
- 总和:`0011 0101 + 0100 0010 = 0111 0111`
- 反码结果:`1000 1000`
- 存入校验和字段。
接收端验证
- 重新计算校验和(含原校验和):
- `1100 1010` → `0011 0101`
- `1011 1100` → `0100 0010`
- `1000 1000` → `0111 0000`
- 总和:`0011 0101 + 0100 0010 + 0111 0000 = 1100 0111`
- 反码结果:`0011 0000`(即全1)
- 校验通过。
四、注意事项
溢出处理:
若16位加法产生溢出,需将进位1加到最高位。
协议差异:不同协议(如ICMP、UDP)可能对数据分组方式不同,需按协议规范计算。
通过上述步骤,可确保数据传输的完整性。