首页  > 教育解读  > 二进制校验和怎么计算

二进制校验和怎么计算

2025-05-01 10:17:59
耐性与骨气
耐性与骨气已认证

耐性与骨气为您分享以下优质知识

二进制校验和的计算方法主要分为发送端和接收端两个步骤,具体如下:

一、发送端计算步骤

初始化校验和字段

将校验和字段设置为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)可能对数据分组方式不同,需按协议规范计算。

通过上述步骤,可确保数据传输的完整性。