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位) *+-------------------------------------------------+* 数据 *+-------------------------------------------------+这里要说的是首部校验和字段。
IP头部校验和计算
IP头部校验和计算IP头部校验和是一种用于检测IP数据报正确传输的校验机制,它通过对IP数据报头部字段进行求和运算,然后对结果进行补码操作得到校验和值。
在传输过程中,发送方计算校验和,并将其存储在IP头部的校验和字段中。
接收方在接收到IP数据报时,也计算校验和,并与接收到的校验和字段进行比较,以确定数据是否正确传输。
1.将IP头部中校验和字段的值设置为0。
2.将IP头部中的数据按16位(2字节)为一组进行划分,对每一组进行16位求和。
3.如果IP头部的长度是奇数个字节,则将最后一个字节视为16位的一部分,对其进行求和。
4.将得到的16位求和结果与高16位相加,直到得到的结果只有16位为止,得到最终的校验和。
在传输过程中,每当一个IP数据报通过一个路由器或主机时,都会重新计算校验和,并将计算的结果存储在校验和字段中。
这样,接收方就可以通过计算校验和来验证数据的完整性。
IP头部校验和的计算是一种简单但有效的校验和算法。
它可以快速计算出校验和,并且可以对数据进行快速校验。
然而,它并不能提供完全可靠的错误检测,因为可能存在一些特殊数据情况,导致校验和相等但数据依然错误的情况发生。
为了提高可靠性,IP还引入了其他一些机制,如检验长度(检查IP报文的长度是否正确)、检验标识符(每个IP数据包都有唯一的标识符,用于检查重复或丢失的数据包)等。
这些机制可以与IP头部校验和相结合,进一步提高数据传输的可靠性。
总结起来,IP头部校验和是一种用于检测IP数据报正确传输的校验机制。
它通过对IP数据报头部字段进行求和运算,并将结果存储在校验和字段中。
接收方在接收到IP数据报时,还会计算校验和,并与接收到的校验和字段进行比较,以确定数据是否正确传输。
IP头部校验和算法简单但有效,在与其他机制结合使用时,可以提高数据传输的可靠性。
ip首部校验和算法
实验报告(3)——首部检验和的编程实现一、实验人员二、实验内容和要求(一)实验内容编写一个计算IP报文中首部校验和的程序,并且通过抓包随机选择一个数据报,提取出IP报文首部部分,根据程序计算出校验和的计算值,与报文中检验和对比,检验程序的正确性,计算结果为0保留数据报,否则丢弃。
(二)实验要求1.掌握IP数据报的结构,通过wireshark抓包随机选择一个TCP数据报,提取IP报部分,并找到首部。
2.学习理解并运用IP首部校验和的计算算法,通过程序实现。
三、实验环境Wireshark抓包工具Microsoft visual studio 2010 C#四、实验过程与结果分析(一)实验过程1.利用wireshark抓包分析包格式并提取IP首部(1)IP数据报格式如图1,IP数据报的首部为前20字节。
因为首部校验和的计算只需要IP数据报的首部20个字节即可,数据部分不参加运算。
所以只需要把IP数据包中的前20个16进制数提取出来作为运算的数据即可。
图1 IP数据包格式(2)抓包得到的数据报图2 TCP数据报如图2,通过wireshark抓包,随机选择一个TCP数据报,根据TCP数据报的格式,我们分析数据报内容可以知道:首先开始6个字节为目的mac地址,后面6个字节为目的mac地址,后面2个字节为协议类型为0800,是IP协议包。
所以再后面的20个字节就是IP数据报的首部部分。
也就是实验所需要的数据。
IP首部为:450000280000400034060ab73baf84710a687191并且,通过包的计算的校验和结果,此包被留下,校验和的值为0。
也是座位后面对设计程序计算得到结果的一个验证。
2.设计计算首部校验和的的算法(1)程序设计的函数模块关系输入IP首部string IP0转化为二进制字符串并划分为10个字段IP1~IP10,函数Getziduan()求字段反码,函数FanMa()反码求和函数FanSum();FanSum0();求出由上一布得到的结果的反码,输出结果(2)算法流程首先将IP首部即40位16进制的字符串转化为二进制字符串,然后以每16位为一个字段,分为10个二进制字段。
IP校验和计算
IP校验和计算下面摘自《TC P/IP协议簇》的I P头校验和算法:发送时:1. 将校验和字段置为0;2. 将整个首部分为16bi t的部分,求和;3. 取反码,填入到校验和字段中;接收时:1. 直接将整个首部分为16b it的部分,求和;2. 取反码,若结果为0,取合法;否则丢弃;这上面有两个细节没有描述清楚:1.计算时的字节顺序(l itter endi an和bi g end ian)问题;2. 取和溢出时的改进计算方法;根据实验结果,及参考网络上的资料,实际上几乎现有所有的系统对校验和算法已经有点小小的补充,也许《TCP/I P协议簇》这里没有更新罢了,自我安慰吧,如下:◆当发送I P包时,需要计算IP报头的校验和:1、把校验和字段置为0;2、对IP头部中的每16b it进行二进制求和;3、如果和的高16bi t不为0,则将和的高16bit和低16b it反复相加,直到和的高16b it为0,从而获得一个16bi t的值;4、将该16b it的值取反,存入校验和字段。
◆当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。
算法:u nsign ed sh ort C heckS um(un signe d sho rt *_pBuff, int _Siz e) {unsig ned i nt ck Sum = 0; uns igned shor t *tm pBuff = _p Buff; in t tmp Size= _Si ze; whi le (t mpSiz e > 1){ ckS um += *tmp Buff++;tmpSi ze -= size of(un signe d sho rt); } if(tmpS ize > 0) {c kSum+= *(unsig ned c har*)tmpBu ff; } ckSu m = (ckSum >> 16) +(ckSu m & 0xFFFF); //将高16b it与低16bit相加c kSum+= (c kSum>> 16); //将进位到高位的16b it与低16bit再相加 ret urn (unsig ned s hort)(~ckS um); }关于计算时的字节顺序,一般以网络字节顺序(big endi an)为准,但仍然有个十分模糊的地方,就是为什么校验和这个字段不用进行网络转换了,如X86系统,直接以本地字节顺序(li tterendia n)发送就可以了,这也让我十分纠结。
IP首部检验和的算法
65536计算对IP首部检验和的算法如下:(1)把IP数据包的校验和字段置为0;(2)把首部看成以16位为单位的数字组成,依次进行二进制求和(注意:求和时应将最高位的进位保存,所以加法应采用32位加法);(3)将上述加法过程中产生的进位(最高位的进位)加到低16位(采用32位加法时,即为将高16位与低16位相加,之后还要把该次加法最高位产生的进位加到低16位)(4)将上述的和取反,即得到校验和。
其中,二进制反码求和的计算方法:首先,计算如图B-1所示的部分和。
把每一列相加,如果有进位,就加到下一列。
注意以下几点:1------------------------第16列的进位1 1------------------------第15列的进位| 1| 1 0| | 1 1| | | 1 0| | | | 1 0| | | | | 1 1| | | | | | | 1 0| | | | | | | | 1 0| | | | | | | | | 1 1| | | | | | | | | | 1 1| | | | | | | | | | 1 0 0-----------第3列的进位| | | | | | | | | | | 1 0 0-----------第2列的进位| | | | | | | | | | | | | 1 1---------第1列的进位| | | | | | | | | | | | | | |1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 00 0 0 0 1 0 0 0 0 1 1 0 1 0 0 11 0 1 0 1 0 1 1 0 0 0 0 0 0 1 00 0 0 0 1 1 1 0 0 0 0 0 1 0 1 00 0 0 0 0 0 0 0 0 0 0 1 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 1 0 0 0 0 1 1 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 1 1 0 10 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 1 0 1 0 1 0 0 0 1 0 0 0 1 0 10 1 0 1 0 0 1 1 0 1 0 1 0 1 0 00 1 0 0 1 0 0 1 0 1 0 0 1 1 1 00 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0__________________________________1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 部分和图B-1 二进制记法的部分和1,当我们加第1列(最右边一列)的时候,我们得到7。
ip首部校验和计算例题
ip首部校验和计算例题
【1.简介】
本文将分析input holdplace 的颜色对于文本内容的影响。
我们将从文本内容分析、颜色在文本中的作用以及颜色对文本读者的影响三个方面进行探讨。
【2.文本内容分析】
在input holdplace 中,颜色作为文本的一部分,承担着传达信息的重要任务。
通过对文本内容的分析,我们可以发现不同的颜色在文本中具有不同的含义和表达方式。
【3.颜色在文本中的作用】
颜色在文本中的作用主要表现在以下几个方面:
1) 突出重点:通过使用不同颜色,可以使关键信息更加醒目,便于读者快速捕捉重要信息。
2) 情感表达:颜色可以传达作者的情感态度,如红色表示热情、蓝色表示冷静等。
3) 提高阅读体验:恰当的颜色搭配可以使文本更具吸引力,提高读者的阅读体验。
【4.颜色对文本读者的影响】
颜色对文本读者的影响主要体现在以下几个方面:
1) 信息传递:颜色可以帮助读者更快地理解文本内容,提高阅读效率。
2) 情感共鸣:恰当的颜色搭配可以引起读者的情感共鸣,增强文本的感染力。
3) 审美享受:颜色可以为读者带来审美上的愉悦,使阅读变得更加有趣。
【5.结论】
颜色在input holdplace 中扮演着至关重要的角色。
通过对文本内容的分析,我们可以发现颜色在文本中有突出重点、情感表达和提高阅读体验等作
用。
同时,颜色对文本读者的影响也不容忽视,它可以帮助读者更好地理解文本内容、产生情感共鸣以及享受审美愉悦。
校验和计算
2007-11-02 10:52
IP数据包的头信息格式: +-------------------------------------------------+ | 版本 (4位) | +-------------------------------------------------+ | 首部长度(4位) | +-------------------------------------------------+ | 服务类型(TOS)8位 | +-------------------------------------------------+ | 数据包总长度(16位) | +-------------------------------------------------+ | 标识ID号(16位) | +-------------------------------------------------+ | 标志位(3位) | +-------------------------------------------------+ | 片偏移(13位) | +-------------------------------------------------+ | 生存时间(TTL)(8位) | +-------------------------------------------------+ | 协议类型 (8位) | +-------------------------------------------------+ | 首部校验和(16位) | +-------------------------------------------------+ | 源IP地址(32位) | +-------------------------------------------------+ | 目的IP地址 (32位) | +-------------------------------------------------+ * IP选项(若有) (32位) * +-------------------------------------------------+ * 数据 * +-------------------------------------------------+ 这里要说的是首部校验和字段。 在发送数据时,为了计算数IP据报的校验和。应该按如下步骤: (1)把IP数据报的校验和字段置为0。 (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。 (3)把得到的结果存入校验和字段中。 在接收数据时,计算数据报的校验和相对简单,按如下步骤: (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。 (2)检查计算出的校验和的结果是否等于零。 (3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。 首先,查看了Linux 2.6内核中的校验算法,使用汇编语言编写的,显然效率要高些。代码如下: unsigned short ip_fast_csum(unsigned char * iph, unsigned int ihl) { unsigned int sum; __asm__ __volatile__( "movl (%1), %0 ;\n" "subl $4, %2 ;\n" "jbe 2f ;\n" "addl 4(%1), %0 ;\n" "adcl 8(%1), %0 ;\n" "adcl 12(%1), %0 ;\n" "1: adcl 16(%1), %0 ;\n" "lea 4(%1), %1 ;\n" "decl %2 ;\n" "jne 1b ;\n" "adcl $0, %0 ;\n" "movl %0, %2 ;\n" "shrl $16, %0 ;\n" "addw %w2, %w0 ;\n" "adcl $0, %0 ;\n" "notl %0 ;\n" "2: ;\n" /* Since the input registers which are loaded with iph and ihl are modified, we must also specify them as outputs, or gcc will assume they contain their original values. */ : "=r" (sum), "=r" (iph), "=r" (ihl) : "1" (iph), "2" (ihl) : "memory"); return(sum); }
IP数据报首部checksum的计算
一、首先区别下面两个概念:(1)one's complement:正数=原码,负数=反码(2)two's complement:就是通常所指的补码二、计算ip首部校验和1.发送IP数据报计算checksum(1)将校验和字段置为0;(2)对首部中(一般为20B)每个16位字进行二进制反码求和;(3)将(2)中得到的和再取反码,即得checksum,写入校验和字段中。
抓个IP数据包,取IP数据报报头部分(20B),数据如下:45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d下面我来计算一下校验和:(1)将校验和字段置为0:将b5 2e置为00 00,即变成:45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 7b cb 51 15 3d(2)反码求和4500+0030+804c+4000+8006+0000+d343+117b+cb51+153d=34ace 将将进位(3)加到低16位(4ace)上:0003+4ace=4ad1(3)取反码将4ad1取反得:checksum=b52e2.接收IP数据报检验IP校验和(1)对首部中每个16 bit进行二进制反码求和;(2)将(1)中得到的和再取反码,看是否为0.接收到的IP数据报首部:45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d下面来验证下:(1)反码求和4500+0030+804c+4000+8006+b52e+d343+117b+cb51+153d=3fffc 0003+fffc=ffff(2)取反码:~ffff=0 正确三、求IP数据报首部校验码代码已将IP首部校验和0xb52e置为0x0000#include<stdio.h>2void main()3{4intbuff[10]={0x4500,0x0030,0x804c,0x4000,0x8006,0x0000,0xd343,0x117b,0xcb51,0x153d} ;5int checksum=0,i=0;6for(i=0;i<10;i++)7 {8 checksum+=buff[i];9 }10 printf("checksum=%x/n",checksum);11 checksum=(checksum>>16)+(checksum & 0xffff);12 checksum+=(checksum>>16);13 checksum=0xffff-checksum;14 printf("checksum=%04x/n",checksum);15}。
ip校验正则表达式
ip校验正则表达式
摘要:
1.IP 地址的概述
2.正则表达式的概念
3.IP 校验正则表达式的作用和应用场景
4.IP 校验正则表达式的编写方法
5.IP 校验正则表达式的示例
正文:
1.IP 地址的概述
IP 地址,即互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address 的缩写。
IP 地址是IP Address 的一种表现形式,它是一种用于唯一标识互联网上设备的地址。
IP 地址通常分为IPv4 和IPv6 两种,其中IPv4 地址是32 位的,通常用四个十进制数表示,如192.168.0.1;IPv6 地址是128 位的,用八组十六进制数表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
2.正则表达式的概念
正则表达式(Regular Expression,简称regex),是一种用于处理字符串的强大工具,其可以用来检查字符串是否符合某种模式、提取字符串中的特定部分等。
正则表达式的基本语法包括字符集、量词、分组、选择等。
3.IP 校验正则表达式的作用和应用场景
IP 校验正则表达式主要用于验证一个字符串是否符合IP 地址的格式。
在
许多网络编程、网站开发等场景中,需要对用户输入的IP 地址进行校验,以确保输入的IP 地址格式正确。
通过使用IP 校验正则表达式,可以方便、高效地完成这一任务。
IP首部校验算法
IP首部校验算法
IP首部校验算法
刘派
【期刊名称】《电脑知识与技术》
【年(卷),期】2010(006)019
【摘要】IP协议为提高数据传输效率,简化了协议,舍弃了许多为提供可靠性所需要的工作(如建立连接、维护连接、拆除连接、确认应答、时间片处理等).其唯一的正确性检验即依靠头部校验和,以保证头部数据的完整性.为了研究IP首部校验算法,查看了相关的RFC文档并利用wireshark工具进行了抓包,并对抓包取得的数据进行了计算验证.研究发现了一些算法存在一定的问题并对它的改进算法进行了研究.
【总页数】3页(5194-5196)
【关键词】IP;头部校验和;算法;验证
【作者】刘派
【作者单位】北京邮电大学,软件学院,北京,100876
【正文语种】中文
【中图分类】TP393
【相关文献】
1.IP首部校验和算法研究 [J], 乔世成; 张智丰; 廉洁
2.工商15位注册号校验位校验算法探索r——JavaScript实现方法 [J], 朱勋程; 袁斌; 曹磊; 杨弋
3.基于多次查表的循环冗余校验算法 [J], 丛雪
4.嵌入式系统CRC循环冗余校验算法设计研究 [J], 彭伟。
- 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、蔚蓝的天空虽然美丽,经常风云莫测的人却是起落无从。
但他往往会成为风云人物,因为他经得起大风大浪的考验。