IP首部校验算法共7页文档

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IP首部校验算法

IP Header Checksum Algorithm

LIU Pai

(School of Software Engineering,Beijing University of Posts and Telecommunications, Beijing 100876, China)

Abstract: In order to increase the efficiency of data transmission, IP simplifies the protocol by not providing a reliable communication facility. There are no acknowledgments either

end-to-end or hop-by-hop.There is no error control for data, only a header checksum provides a verification that the information used in processing internet datagram has been transmitted correctly. There are no retransmissions. There is no flow control. The RFC documents give the algorithms used to compute the checksum and the wireshark software provides the function of catching the IP packets. This data can be used to verify the algorithms . The research also shows there is a bug in the algorithm and can be overcomed and optimised.

1 IP 首部

如图1所示,IP数据报首部的固定部分中的各字段:

1) 版本占4位,指IP协议的版本。

2) 首部长度占4位,可表示最大十进制数值是15。

3) 区分服务占8位,用来获得更好地服务。总长度总长度是指首部和

数据之和的长度。

4) 标识占16位,IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将该值赋给标识字段。

5) 标志占3位,但目前只有两位有意义。MF = 1 还有分片 DF = 1 不能分片

6) 片偏移占13位。片偏移指出较长的分组在分片后,某片在分组中的相对位置。

7) 生存时间占8位,表明数据报在网络中的寿命

8) 协议占8位,指出此数据报携带的数据时使用何种协议

9) 首部检验和占16位。这个字段只检验数据报的首部但不包括数据部分

10) 源地址 32位

11) 目的地址 32位

2 IP校验和算法

2.1 发送方

1) 将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;

2) 对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;

3) 发送数据包。

2.2 接收方

1) 将IP包头按16比特分成多个单元,如包头长度不是16比特的倍

数,则用0比特填充到16比特的倍数;

2) 对各个单元采用反码加法运算,检查得到的和是否符合是全1(有

的实现可能对得到的和会取反码,然后判断最终值是不是全0);

3) 如果是全1则进行下步处理,否则意味着包已变化从而丢弃之.需要强调的是反码和是采用高位溢出加到低位的,如3比特的反码和运

算:100b+101b=010b(因为100b+101b=1001b,高位溢出1,其应该加到低位,即001b+1b(高位溢出位)=010b)

2.3 校验和源码

in 6 {

register long sum = 0;

while( count > 1 ){sum += * (unsigned short) addr++;count -= 2;}if( count > 0 )sum += * (unsigned char *) addr;while (sum>>16)sum = (sum & 0xffff) + (sum >> 16);checksum = ~sum;}

第1个while循环是做普通加法,因为IP包头和TCP整个报文段比较短(没达到2^17数量级),所以不可能导致4字节的 sum溢出.紧接着的一个判断语句是为了能处理输入数据是奇数个字节的这种情况.再接着的数据循环是实现反码算法, 由反码和的高位溢出加到低位的性质,可得到"32位的数据的高位比特移位16比特,再加上原来的低16比特,不影响最终结果" 这个等价运算,因为sum的最初值(刚开始循环时)可能很大,所以这个等价运算需循环进行,直到sum的高比特(16比特以上)全为0.对于32 位的 sum,事实上这个运算循环至多只有两轮,所以也有程序直接用两条"sum = (sum & 0xffff) + (sum >> 16);"代替了整个循环.最后,对和取

反返回。

2.4 校验和算法特性

1)奇、偶字节可任意排列组合;2)字节顺序独立;

3)并行计算。

2.5 采取反码而不用补码的原因

1) 反码和的溢出有后效性(蔓延性)

反码和将高位溢出加到低位,导致这个溢出会对后面操作有永久影响,有后效性;而补码和直接将高位和溢出,导致这个溢出对后面的操作再无

影响,因此无后效性

2) 反码校验无需考虑字节序

正因为反码和的溢出有后效性,导致大端字节序(big-endian)和小端字节序(little-endian)对同一数据序列(如两个16 比特的序列)产生的

校验和也只是字节序相反,而补码和因为将溢出丢掉了,不同字节序之间

的校验和大不相同且没什么联系。

2.6 wireshark抓包验证算法

如图2所示。

3 增量式修改校验和的加速算法

在实际的应用中,存在对收到的数据包进行修改若干个地方,并回送

至发送方或者转发的情况。此时需要重新计算数据包的检验和。最常见的可能就是将收到的数据包的TTL字段减1,并转发的情况。如果仍旧按照传统的计算检验和的方式进行计算,特别是当数据包长度很大时,为了重新

计算校验和而将整个数据包的数据遍历一边,反码求和,效率肯定比较低。

相关文档
最新文档