关于checksum校验和算法

这篇博客详细介绍了checksum校验和算法在IP、ICMP、UDP、TCP中的应用,以及计算过程。通过实例展示了二进制反码求和步骤,并探讨了原码、反码、补码的概念及其在计算机存储中的作用,帮助理解数据表示和校验的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天复习计网的时候看到了UDP头部有差错校验,其中的checksum算法没理的太清楚,索性写一篇博客,顺便回顾一下其他的。

校验和覆盖的内容:

IP校验和:IP首部。
ICMP校验和:ICMP首部+ICMP数据;
UDP、TCP校验和:首部+数据+12个字节伪首部(源IP地址、目的IP地址、协议、TCP/UDP包长)。

计算校验和的步骤:

[1]把校验和字段设置为0。
[2]把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和。
[3]把得到的结果存入校验和字段中。
另外UDP、TCP数据报的长度可以为奇数字节,因为计算时是16位为单位,所以此时计算校验和时需要在最后增加一个填充字节0(只是计算校验和用,不发送出去)。

接收端校验校验和步骤:

把需要校验的内容(包括校验和字段)看成以16位为单位的数字,依次进行二进制反码求和,如果结果是0表示正确,否则表示错误。

二进制反码求和步骤:

[1]二进制反码求和,就是先把这两个数取反,然后求和,如果最高位有进位,则向低位进1。

[2]另外,先取反后相加与先相加后取反,得到的结果是一样的。因此实现代码都是先相加,最后再取反。

下面我们来写个栗子

以4bit(计算方便一点,和16bit是一样的)做检验和来验证。

假设原始数据为 1100 1010 | 0000(校验位)(初始化为0000)
那么把他们按照4bit一组进行按位取反相加。 1100 取反0011 , 1010 取反是0101,校验位的计算就是 0011加上0101 是1000,填入到校验位上
于是发送的数据就是
1100 1010 | 1000
收到数据后同样进行按位取反相加。0011+0101+0111 =1111;全为1表示正确 。 等于是 自己加上自己的取反, 那么 结果肯定应该是全1 。如果传输正确的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值