IP首部校验和字段计算方法
IP首部有16bit的校验和,因此,IP首部以16bit为单位计算校验和,IP首部的长度一定是16bit的整倍数,这是由于首部长字段是以32bit为单位计算的,不足的补0。
发送方计算方法:
1.首先把校验和的16bit置0。
2.将首部以16bit为单位异或(或模2加,结果相同)。
3.将异或结果取反,并填入校验和字段。
接收方计算方法:
1.将首部以16bit为单位异或(或模2加,结果相同)。
2.异或结果如果所有位全为1,则无差错。
例子:为计算方便,简化为以5位为单位计算校验和,校验和放在最后5位:
1.发送方
(1)首先把校验和的5bit置0:
11010 10111 00000
(2)将首部以16bit为单位异或(或模2加,结果相同):
①如果是异或:
11010
10111
00000
------
01101 // 结果
②如果是模2加,模2加为不带进位的二进制加法:
11010
10111
00000
------
01101 // 结果
可见两种方法的结果相同。
(3)将异或结果取反,并填入校验和字段:
11010 10111 10010
2.接收方
(1)将首部以5bit为单位异或(或模2加,结果相同):
11010
10111
10010
-----
11111 // 结果
(2)可见结果位全为1,传输未出错。
计算原理:
一个二进制位与另一个二进制位的异或结果取反后的结果再和这两个二进制位异或,结果为1:
0 xor 0 = 0;
~0 = 1;
0 xor 0 xor 1 = 1;
1 xor 1 = 0;
~0 = 1;
1 xor 1 xor 1 = 1;
0 xor 1 = 1;
~1 = 0;
0 xor 1 xor 0 = 1;
1 xor 0 = 1;
~1 = 0;
1 xor 0 xor 0 = 1;
而计算开始时,把首部校验和字段全置为0,而0与任何数异或都等于这个数本身,因此,发送端相当于把除首部校验和字段之外的值异或后取反并放在校验和字段,之后接收方计算时,相当于把求反后的值与原值计算校验和,每一位必定是1,否则就是出错(但全为1时不一定是正确的,false positive几率可忽略不计,但仍存在)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
2021-05-05 Linux程序设计 学习笔记 第八章 MySQL(部分)