《IP数据报首部校验和算法说明》
1. IP数据报首部校验主要用于保证IP数据报头的完整性。
2. 该算法为“反码求和校验”,”反码求和校验“是一个专用术语,区别于先求反码再求和。
3. 该算法过程如下文所示例。
=> 发送方
i. 将校验和字段初始化为0,然后将IP报头按照16bit分成多个单元,如果报头长度不是
16bit整数倍,则填充0;
ii. 对上述各个单元(16bit)采用“反码求和”运算,即将各个单元直接相加,高位溢出位
加到最低位(不同于通常补码运算是直接丢掉溢出位),将得到的和取其反码,填入校验和字段即可;
iii. IP数据报头发送完毕后,接着发送数据报内容;
=> 接收方
i. 将校验和字段初始化为0,然后将IP报头按照16bit分成多个单元,如果报头长度不是
16bit整数倍,则填充0;ii. 对上述各个单元(16bit)采用“反码加法”运算,包括发送方发送的校验和字段,
然后检查得到的结果每个数据位是否全部为1;
iii. 如果满足,则进行下步处理,否则表明该帧数据报在传输过程中发生错误,舍弃该帧数据;
4. “反码求和”运算示例
例如,位宽为3bit的两个数值100b和101b进行反码求和运算。
i. 100b + 101b = 1_001b,高位存在溢出;
ii. 高位溢出的1,加到最低位。即 001b + 1b(溢出位) = 010b;
iii. 上述两数反码求和结果为010b,然后取反,为101b即为校验和发送给接收端;说明:在接收端会接收到三个数值(包含校验和),100b, 101b, 101b。
按照“反码求和”运算,结果为
100b + 101b + 101b = 1_110b, 溢出位加到最低位后,结果为111b,每个数据位全部为1;(为什么全部为1,不难理解,原码010b与反码101b求和,其结果各数据位必然为1)
备注:参考博客文章链接为http://www.360doc.com/content/15/0910/23/27653981_498345868.shtml