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

IP头部校验和计算unsigned short checksum(unsigned short *buf, int nword) { unsigned long sum;for(sum = 0; nword > 0; nword--)sum += *buf++;sum = (sum>>16) + (sum&0xffff);sum += (sum>>16);return -sum;}让我们假设一个IP头数据,来解cksum的惑IP头数据:01000101 /*ver_hlen*/00000000 /*tos*/00000000 00000010 /*len*/00000000 00000000 /*id*/00000000 00000000 /*offset*/00000100 /*ttl*/00010001 /*type*/00000000 00000000 /*cksum(0)*/ 01111111 00000000 00000000 00000001 /*sip*/ 01111111 00000000 00000000 00000001 /*dip*/(1)16比特分组;(2)校验和清‘0’(3)求所有16比特之和01000101 00000000 /*ver_hlen*/ 00000000 00000010 /*len*/---------------------01000101 0000001000000000 00000000 /*id*/---------------------01000101 0000001000000000 00000000 /*offset*/---------------------01000101 0000001000000100 00010001 /*ttl*//*type*/---------------------01001001 0001001100000000 00000000 /*cksum(0)*/---------------------01001001 0001001101111111 00000000 /*sip*/---------------------11001000 0001001100000000 00000001 /*sip*/---------------------11001000 0001010001111111 00000000 /*dip*/---------------------101000111 0001010000000000 00000001 /*dip*/---------------------101000111 00010101 sum(4)把求得的和模(216-1)00000000 00000001 (sum>>16) 01000111 00010101 (sum&0xffff) ---------------------01000111 00010110(5)在(4)的基础上求二进制反码10111000 11101001 cksum说白了就是循环加,然后在取反!对方机器调用checksum()计算校验和,如果校验和为0表明IP包传输正确----------------------------------------------------------- 01000101 /*ver_hlen*/00000000 /*tos*/00000000 00000010 /*len*/00000000 00000000 /*id*/00000000 00000000 /*offset*/00000100 /*ttl*/00010001 /*type*/10111000 11101001 /*cksum(0)*/01111111 00000000 00000000 00000001 /*sip*/01111111 00000000 00000000 00000001 /*dip*/01000101 0000000000000000 00000010---------------------01000101 0000001000000000 00000000---------------------01000101 0000001000000000 00000000--------------------- 01000101 00000010 00000100 00010001 --------------------- 01001001 00010011 10111000 11101001 --------------------- 100000001 11111100 01111111 00000000--------------------- 110000000 11111100 00000000 00000001--------------------- 110000000 11111101 01111111 00000000--------------------- 111111111 11111101 0000000000000001--------------------- 111111111 11111110 sum00000000 00000001 (sum>>16)11111111 11111110 (sum&0xffff)----------------------11111111 11111111~sum00000000 00000000现在我们所用的机器设备大多数是使用二进制补码算法进行计算的。
首部校验和的计算例子详细

首部校验和的计算例子详细在计算机网络中,数据的传输是通过分组完成的。
为了确保数据的可靠传输,每个分组都包含了一些必要的信息,其中一个重要的字段是首部校验和。
首部校验和是一种用于检测传输数据是否完整和错误的校验机制。
它通过对数据的每个字节进行运算,计算出一个校验和值。
接收方在接收到数据后,同样会进行首部校验和计算,并将结果与发送方的校验和进行比较,以验证数据的完整性和错误情况。
让我们来看一个简单的计算例子,假设我们要发送一个包含6个字节的分组,分别是01100101、01100100、01100101、01100011、01101111、01100100(二进制数据)。
我们将每两个字节分为一组,然后将每个字节的二进制值相加。
具体计算过程如下:第一步,将每两个字节分组:01100101 0110010001100101 0110001101101111 01100100第二步,将每一组的二进制值相加:01100101 + 01100100 = 1100100101100101 + 01100011 = 1100100001101111 + 01100100 = 11010011第三步,将每组相加的结果再相加:11001001 + 11001000 + 11010011 = 110000110第四步,将相加的结果按位求反,得到首部校验和值:110000110 -> 001111001在这个例子中,我们计算出的首部校验和值为001111001。
发送方将这个校验和值附加在数据分组的首部中,一起发送给接收方。
接收方在接收到数据分组后,同样进行相同的计算过程,计算出一个校验和值。
然后,接收方将计算出的值与发送方的校验和值进行比较,如果两者相等,则说明数据没有发生错误或丢失,否则,数据可能存在错误或丢失。
首部校验和的计算过程可以有效地检测出单比特错误和部分数据损坏的情况,但对于多比特错误无法进行检测。
此外,校验和机制也无法纠正错误,它只能用于检测错误。
IP校验和计算

当发送IP包时,需要计算IP报头的校验和:
1、把校验和字段置为0;
2、对IP头部中的每16bit进行二进制求和;
3、如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值;
4、将该16bit的值取反,存入校验和字段。
◆当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。
IP头:
45 00 00 31
89 F5 00 00
6E 06 00 00(校验字段)
DE B7 45 5D ->222.183.69.93
C0 A8 00 DC ->192.168.0.220
计算:
4500 + 0031 +89F5 + 0000 + 6e06+ 0000 + DEB7 + 455D + C0A8 + 00DC =3 22C4
高位溢出位会加到低位: 0003 + 22C4 = 22C7
~22C7(求反) =(15-2,15-2,15-c,15-7)= DD38 ->即为应填充的校验和
当接受到IP数据包时,要检查IP头是否正确,则对IP头进行检验,方法同上:
计算:
4500 + 0031 +89F5 + 0000 + 6E06+ DD38 + DEB7 + 455D + C0A8 + 00DC =3 FFFC
0003 + FFFC = FFFF
~FFFF = 00000 ->正确。
IP首部检验和算法

IP⾸部检验和算法原创博⽂,转载请注明。
在学习TCP/IP 详解的过程中遇到了不⽌⼀次的关于检验和的概念,在吸取了他⼈理解的前提下,我决定⽤Wireshark 进⾏抓包分析。
⾸先我们得知道IP数据包格式⾸先把检验和字段置为 0 。
然后,对⾸部中每个 16 bit 进⾏⼆进制反码求和(整个⾸部看成是由⼀串 16 bit的字组成),结果存在检验和字段中。
当收到⼀份I P数据报后,同样对⾸部中每个 16 bit进⾏⼆进制反码的求和。
由于接收⽅在计算过程中包含了发送⽅存在⾸部中的检验和,因此,如果⾸部在传输过程中没有发⽣任何差错,那么接收⽅计算的结果应该为全 1。
如果结果不是全1 (即检验和错误),那么I P就丢弃收到的数据报。
但是不⽣成差错报⽂,由上层去发现丢失的数据报并进⾏重传。
再来看看Wireshark抓取结果观察此图,我们可以看到这是⼀个源地址为123.151.152.231 ⽬的地址为10.22.66.206即为本机地址的IP数字报传送。
注意图中标深蓝颜⾊的数字,每当我们点击分类信息时,下⽅的数字就会跟随着发⽣变化,因此我们就可以得到IP数据报的内容。
、解释如下:(本内容部分取⾃)版本号4,占了4位,表⽰ipv4.接下来是包头长度,⼜占了4位,指明ipv4协议包头长度的字节数包含多少个32位。
由于IPv4的包头可能包含可变数量的可选项,所以这个字段可以⽤来确定IPv4数据报中数据部分的偏移位置。
IPv4包头的最⼩长度是20个字节,因此IHL这个字段的最⼩值⽤⼗六进制表⽰就是5(5x4(4个字节32位) = 20字节)。
就是说,它表⽰的是包头的总字节数是4字节的倍数。
图中即为header length为20表⽰是20个字节,所以经过计算此处⽤⼗六进制表⽰为5,⼆进制表⽰为1001。
再往下是服务类型为0x00。
服务类型此处⼀共占了8位,涵义如下:过程字段: 3位,设置了数据包的重要性,取值越⼤数据越重要,取值范围为:0(正常)~ 7(⽹络控制)延迟字段: 1位,取值:0(正常)、1(期特低的延迟)流量字段: 1位,取值:0(正常)、1(期特⾼的流量)可靠性字段: 1位,取值:0(正常)、1(期特⾼的可靠性)成本字段: 1位,取值:0(正常)、1(期特最⼩成本)未使⽤: 1位接着是总长度total length:⼗六进制是0x0028标识字段:占16位。
ip校验规则

ip校验规则一、IP校验规则简介IP校验规则是指用于验证IP地址格式和范围的规则,以确保网络通信的顺畅进行。
IP地址是互联网上设备之间互相通信的唯一标识,因此IP校验规则在保证网络稳定运行中起着至关重要的作用。
二、IP地址分类与表示方法1.IPV4地址IPV4地址是互联网最常用的地址类型,它采用32位二进制表示,总共分为A、B、C、D、E五类。
其中,A类地址范围为1.0.0.0至126.255.255.255,B类地址范围为128.0.0.0至191.255.255.255,C类地址范围为192.0.0.0至223.255.255.255,D类地址为组播地址,范围为224.0.0.0至239.255.255.255,E类地址为保留地址,范围为240.0.0.0至255.255.255.255。
2.IPV6地址IPV6地址是下一代互联网地址,采用128位二进制表示。
相较于IPV4,IPV6具有更多的地址空间,提高了网络安全性和隐私保护能力。
IPV6地址分为单播、组播和任播三种类型,用于不同场景的通信。
三、IP校验算法1.子网掩码子网掩码是一种用于划分IP地址的网络部分和主机部分的算法。
通过子网掩码,可以将一个大型网络划分为多个较小的子网,提高IP地址的利用率。
子网掩码通常用一个32位的二进制数表示,其中网络部分为1,主机部分为0。
2.CIDR(无类别域间路由)CIDR是一种用于表示网络地址的编码方式,它将IP地址和子网掩码合并为一个统一的表示形式。
CIDR地址格式为“IP地址/子网掩码”,如“192.168.1.0/24”。
CIDR有效地简化了网络地址的表示和计算,便于网络管理和规划。
3.网络层协议校验网络层协议校验是指对IP数据报进行校验,确保数据在传输过程中不被篡改。
主要方法有校验和算法、加密算法等。
这些算法可以检测到数据报在传输过程中的错误,保证数据完整性。
四、IP校验实例与应用1.网络诊断与故障排查通过IP校验规则,可以快速定位网络故障,如IP地址冲突、子网划分不当等问题。
IP首部解析

IP头部:
45 00 00 30
52 52 40 00
40 11 2c 23
c0 a8 01 01
d8 03 e2 15
“45”,其中“4”是IP协议的版本(Version),说明是IP4。
“5”表示IP头部的长度,说明是20字节,这是标准的IP头部长度,头部报文中没有发送可选部分数据
“00”是服务类型
“0030”是IP数据报文总长,包含首部以及数据,这里表示48字节
“5252”是两个字节的标识字段(Identification):转换为十进制就是21074。
这个是让目的主机来判断新来的分段属于哪个分组
“40”,转换为二进制就是“01000000”,标志字段(flag)占3 bit,其中第一位是IP协议目前没有用上的,为0。
接着的是两个标志DF和MF。
DF为1表示不要分段,MF为0表示后面没有分段。
然后的“00000”和“00000 00000000”是片偏移
“40”是TTL,转换为十进制就是64
“11”表示协议类型,转换为十进制就是17,表示传输层是UDP协议
“2c23”首部校验和
“c0 a8 01 01”,是源IP地址,转换为十进制的IP地址就是:192.168.1.1
“d8 03 e2 15”,是目的IP地址,转换为十进制的IP地址就是:216.3.226.21。
ip校验规则

ip校验规则摘要:一、IP 校验规则简介1.IP 地址的重要性2.IP 校验规则的作用二、IP 校验规则的分类1.网络层IP 校验规则2.传输层IP 校验规则三、IP 校验规则的应用1.网络安全防护2.网络通信优化3.网络设备配置四、IP 校验规则的发展趋势1.IPv6 地址的普及2.安全策略的完善3.智能化技术的融入正文:随着互联网的飞速发展,IP 地址在网络通信中扮演着越来越重要的角色。
IP 校验规则作为保障网络通信正常进行的关键技术,越来越受到人们的关注。
本文将为您介绍IP 校验规则的相关知识。
IP 校验规则主要用于检查IP 数据包的合法性,确保数据包在网络中的正确传输。
它主要包括网络层IP 校验规则和传输层IP 校验规则。
在网络层,IP 校验规则主要针对IP 地址进行校验,确保数据包的发送方和接收方能够正确识别对方。
例如,IPv4 地址采用32 位二进制数表示,其中前12 位表示网络地址,后24 位表示主机地址。
通过IP 校验规则,可以避免数据包在网络中的错误传输。
传输层IP 校验规则主要针对传输层协议进行校验,如TCP 和UDP。
这些协议在传输数据时需要确保数据的完整性和正确性。
传输层IP 校验规则通过对数据包的校验和进行计算,以验证数据在传输过程中是否发生错误。
IP 校验规则在实际应用中具有广泛的应用。
首先,在网络安全防护方面,IP 校验规则可以防止非法IP 地址入侵,保障网络的安全稳定。
其次,在网络通信优化方面,IP 校验规则可以提高数据包的传输效率,降低网络拥堵。
最后,在网络设备配置方面,IP 校验规则可以确保设备参数的正确性,提高设备的稳定性和可靠性。
随着互联网技术的不断发展,IP 校验规则也将不断完善。
IPv6 地址的普及将为IP 校验规则带来更大的挑战,同时也为网络安全提供了更丰富的策略。
此外,随着智能化技术的融入,IP 校验规则将变得更加智能化、自动化,以满足不断变化的需求。
IP 首部校验和的计算 zz

IP 首部校验和的计算zz1IP数据包的头信息格式:+-------------------------------------------------+| 版本 (4位) |+-------------------------------------------------+| 首部长度(4位) |+-------------------------------------------------+| 服务类型(TOS)8位 |+-------------------------------------------------+| 数据包总长度(16位) |+-------------------------------------------------+| 标识ID号(16位) |+-------------------------------------------------+| 标志位(3位) |+-------------------------------------------------+| 片偏移(13位) |+-------------------------------------------------+| 生存时间(TTL)(8位) |+-------------------------------------------------+| 协议类型 (8位) |+-------------------------------------------------+| 首部校验和(16位) |+-------------------------------------------------+| 源IP地址(32位) |+-------------------------------------------------+| 目的IP地址 (32位) |+-------------------------------------------------+* IP选项(若有) (32位) *+-------------------------------------------------+* 数据 *+-------------------------------------------------+这里要说的是首部校验和字段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IP首部校验算法IP Header Checksum AlgorithmLIU 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 eitherend-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,并转发的情况。
如果仍旧按照传统的计算检验和的方式进行计算,特别是当数据包长度很大时,为了重新计算校验和而将整个数据包的数据遍历一边,反码求和,效率肯定比较低。
为提高转发效率,要求重校验算法尽可能快,故出现了如下所示的重校验算法:UpdateTTL(struct ip_hdr *ipptr, unsigned char n) { unsigned long sum;unsigned short old;old = ntohs(*(unsigned short *)&ipptr->ttl);ipptr->ttl -= n;sum = old + (~ntohs(*(unsigned short *)&ipptr->ttl) & 0xffff);sum += ntohs(ipptr->Checksum);sum = (sum & 0xffff) + (sum>>16);ipptr->Checksum = htons(sum + (sum>>16));}算法的实现依据是这样的.假设包头原校验和为~C,改变的字段的原始值是m,更改后的值是m',设~C'为重校验和,RFC1017中给出 ~C' =~(C+(-m)+m') = ~C+(m-m'),但由于该式不是更新的校验和的反码,而且反码减法运算在机器内较难实现,于是RFC1141给出适合在机器内运算的式子~C+m+~m' ,该等价关系的成立基于反码的运算性质:取反运算满足结合律,按位取反运算与符号取反(及相反数)是等价的(即~C=-C)。
4 可能存在的问题及其解决4.1 存在的问题RFC1071和1141所提出的增量式修改校验和有一个BUG,就是按照公式计算新的检验和时,有可能出现计算结果为0XFFFF的情况,则意味着数据包中所有部分相加的结果为0x0000。
这是不可能的。
例如:一个IP包头16位域 m = 0x5555 变为m’ = 0x3285. 包头其它部分反码和为0xCD7A.HC旧的检验和HC' 新的检验和m 某个域(16-bit字)修改前的值m'某个域修改后的值包头校验和是:HC =~(0xCD7A + 0x5555) =~0x22D0 = 0xDD2FHC' =~(0xCD7A + 0x3285) =~0xFFFF = 0x0000如用RFC1141给出的公式~C' =~C + m + ~m'HC' = HC + m + ~m'= 0xDD2F + 0x5555 + ~0x3285= 0xFFFF与不用加速算法计算出的结果不一样4.2 问题解决1) RFC1141里规定:对于更新了的头校验值为+0时,它会改为-0,因为它假定反码有一个分布式的属性,当结果为0时它不会一直保持不变2) RFC1624里假定上面的属性成立从而避免了这个可能出现的问题,正确的等式如下HC’ =~(C + (-m) + m’)HC' =~(C + (-m) + m')=~(0x22D0 + ~0x5555 + 0x3285)=~0xFFFF= 0x0000希望以上资料对你有所帮助,附励志名言3条:1、宁可辛苦一阵子,不要苦一辈子。
2、为成功找方法,不为失败找借口。
3、蔚蓝的天空虽然美丽,经常风云莫测的人却是起落无从。
但他往往会成为风云人物,因为他经得起大风大浪的考验。