三九宝宝网宝宝百科宝宝知识

IPUDPTCPICMP数据报协议的校验和的区别和计算

05月23日 编辑 39baobao.com

[IP数据包的校验和算法C#版]为做伪IP,特地做了一个IP包,用C#改写IP头的校验和算法。 资料一: IP头格式: 版本号 (4位) IP头长度 (4位) 服务类型 (8位) 数据包长度 (16位) 标识段 (16位) 标志段 (16位) 生存...+阅读

首先,IP、ICMP、UDP和TCP报文头部都有校验和字段,大小都是16bit,算法也基本一样: 在发送数据时,为了计算数据包的校验和。应该按如下步骤:

(1)把校验和字段置为0; (2)把需校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;

(3)把得到的结果存入校验和字段中。 在接收数据时,计算数据包的校验和相对简单,按如下步骤:

(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;

(2)检查计算出的校验和的结果是否为0; (3)如果等于0,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。 虽然上面四种报文的校验和算法一样,但在作用范围存在不同:IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报文,而且还有12字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节,第一字节补0)和TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(注意,填充字节只是为了计算校验和,可以不被传送)。 这里还要提一点,UDP的校验和是可选的,当校验和字段为0时,表明该UDP报文未使用校验和,接收方就不需要校验和检查了!那如果UDP校验和的计算结果是0时怎么办呢?书上有这么一句话:“如果校验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的。” 讲了这么多,那这个校验和到底是怎么算的呢? 1. 什么是二进制反码求和 对一个无符号的数,先求其反码,然后从低位到高位,按位相加,有溢出则向高位进1(跟一般的二进制加法规则一样),若最高位有进位,则向最低位进1。 首先这里的反码好像跟我们以前学的有符号数的反码不一样(即正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各位取反),这里不分正负数,直接每个位都取反! 上面加粗的那句是跟我们一般的加法规则不太一样的地方:最高位有进位,则向最低位进1。确实有些疑惑,为什么要这样做呢?仔细分析一下(为了方便说明,以 4bit二进制反码求和举例),上面的这种操作,使得在发生加法进位溢出时,溢出的值并不是10000,而是1111。也即是当相加结果满1111时溢出,这样也可以说明为什么0000和1111都表示0了(你同样可以发现,任何数与这两个数做二进制反码求和运算结果都是原数,这恰好符合数0的加法意义)。 下面再举例两种二进制反码求和的运算: 原码加法运算 反码加法运算 3(0011)+ 5(0101)= 8(1000) 3(1100)+ 5(1010)= 8(0111) 8(1000)+ 9(1001)= 1(0001) 8(0111)+ 9(0110)= 2(1101) 从上面两个例子可以看出,当加法未发生溢出时,原码与反码加法运算结果一样;当有溢出时,结果就不一样了,原码是满10000溢出,而反码是满1111溢 出,所以相差正好是. 1。举例只是为了形象地观察二进制反码求和的运算规则,至于为什么要定义这样的规则以及该运算规则还存在其它什么特性,可能就需要涉及 代数理论的东西的了(呜呜~~数学理论没学好啊,只能从表面上分析分析)。 另外关于二进制反码求和运算需要说明的一点是,先取反后相加与先相加后取反,得到的结果是一样的!(事实上我们的编程算法里,几乎都是先相加后取反。) 2. 校验和算法的实现 讲了什么是二进制反码求和,那么校验和的算法实现就简单多了。废话少说,直接上代码: [cpp] view plaincopy //计算校验和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; while(size>1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR *)buffer; } //将32位数转换成16 while (cksum>>16) cksum=(cksum>>16)+(cksum & 0xffff); return (USHORT) (~cksum); } buffer是指向需校验数据缓存区的指针,size是需校验数据的总长度(字节为单位) 4~13行代码对数据按16bit累加求和,由于最高位的进位需要加在最低位上,所以cksum必须是32bit的unsigned long型,高16bit用于保存累加过程中的进位;另外代码10~13行是对size为奇数情况的处理! 14~16行代码的作用是将cksum高16bit的值加到低16bit上,即把累加中最高位的进位加到最低位上。这里使用了while循环,判断cksum高16bit是否非零,因为第16行代码执行的时候,仍可能向cksum的高16bit进位。 有些地方是通过下面两条代码实现的: cksum = (cksum >>16) + (cksum & 0xffff); cksum += (cksum >>16); 这里只进行了两次相加,即可保证相加后cksum的高16位为0,两种方式的效果一样。事实上,上面的循环也最多执行两次! 17行代码即对16bit数据累加的结果取反,得到二进制反码求和的结果,然后函数返回该值。 3. 为什么使用二进制反码求和呢? 好了,最后一个问题,为什么要使用二进制反码来计算校验和呢,而不是直接使用原码或者补码? 这个问题我想了很久,由于水平有限实在弄不明白,于是在上一阵狂搜,什么都没有(不知道是不给力,还是大家都不关注这个...

IP UDP TCP校验和有什么区别

UDP计算校验和的方法和计算IP数据报首部校验和的方法相似。 但不同的是:IP数据报的校验和只检验IP数据报的首部,但UDP的校验和是将首部和数据部分一起都检验。 在发送端,首先是将全零放入检验和字段。再将伪首部以及UDP用户数据报看成是由许多16bit的字串接起来。 若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(即:最后一个基数字节应是16位数的高字节而低字节填0)。 然后按二进制反码计算出这些16bit字的和(两个数进行二进制反码求和的运算的规则是:从低位到高位逐列进行计算。 0和0相加是0,0和1相加是1,1和1相加是0但要产生一个进位1,加到下一列。若最高位相加后产生进位,则最后得到的结果要加1)。 将此和的二进制反码写入校验和字段后,发送此UDP用户数据报。

在接收端,将收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些16bit字的和。 当无差错时其结果应全为1。否则就表明有差错出现, 接收端就应将此UDP用户数据报丢弃(也可以上交给应用层,但附上出现了差错的警告)。 TCP 的校验和计算方法同UDP一样,同样要加上一个伪头部,区别是伪头部的协议码是0x06,长度是整个TCP报文的长度(包含TCP头部)。 ICMP的校验和 ICMP校验和的计算方法一样,只不过只是对ICMP包整个进行校验和,没有伪头部,也不包括IP包头部。

UDP校验和覆盖UDP首部和数据什么意思

其实这是一种加密技术用于对文件内容进行审计的方法,使用 精通读文件把文件读到内存中,再对文件内容作一个 MD5 校验得到一串密码,就是校验和。

补充:

1、IP首部校验和字段是根据IP首部计算的校验和码,它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。

2、IP首部校验和计算:

为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

3、TCP和UDP校验和计算(两者相同)

校验和还包含—个96位的伪首标,理论上它位于TCP首标的前面。这个伪首标包含了源地址、目的地址、协议和TCP长度等字段,这使得TCP能够防止出现路由选择错误的数据段。这些信息由网际协议(IP)承载,通过TCP/网络接口,在IP上运行的TCP调用参数或者结果中传递。

伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。

这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。(伪报头保证UDP和TCP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。)

如何计算UDPTCP检验和checksum

如何计算UDP/TCP检验和checksum

一、下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分: 1.UDP伪首部 2.UDP首部 3.UDP的数据部分(切记不要遗漏该部分,否则就~吐血了~) 首先解释下伪首部的概念,伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。 还有一个概念十分重要,那就是16位UDP总长度,请注意该长度不是报文的总长度,而只是UDP(包括UDP头和数据部分)的总长度(之前就是因为这个概念没弄清楚,走了不少弯路,吐血~~)。

二、计算检验和(checksum)的过程很关键,主要分为以下几个步骤: 1.把伪首部添加到UDP上; 2.计算初始时是需要将检验和字段添零的; 3.把所有位划分为16位(2字节)的字 4.把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C 5.将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。

三、事实胜于雄辩,还是举个例子来分析一下吧,该例子计算的是一个TCP的检验和(和UDP的算法一致) TCP计算检验和的报文结构如下所示: 抓包工具抓了一个TCP 的syn报文做研究,呵呵,下面就是整个报文: 1.首先将检验和部分添零; 2.然后将TCP伪首部部分,TCP首部部分,数据部分都划分成16位的一个个16进制数; 3.将这些数逐个相加,记得溢出的部分加到最低位上,这是循环加法: 0xc0a8+ 0x0166+……+0x0402=0x9b49 4.最后将得到的结果取反,则可以得到检验和位0x64B6 按照上述步骤进行计算就可以得到检验和为0x64B6,大家也可以试试看 IP数据报只检验IP数据报的首部,但UDP检验的是把首部和数据部分一起都检验。

以下为关联文档:

计算机网络原理的计算题CRC校验和数据传输问题计算机网络原理的计算题(CRC校验和数据传输问题)第1题:设要发送的二进制数据为10110011,若采用CRC校验方法,生成多项式为X^4+X^3+1,度求出实际发送的二进制数字序列。(要求写出计算...

计算机病毒具有和的特征(一)非授权可执行性 用户通常调用执行一个程序时,把系统控制交给这个程序,并分配给他相应系统资源,如内存,从而使之能够运行完成用户的需求。因此程序执行的过程对用户是透明的。...

什么是协议?什么是服务?服务和协议有什么区别计算机网络要完成数据处理与数据通信两大基本功能,那么从它的结构上必然可以分成两个部分:负责数据处理的计算机和终端,负责数据通信的通信控制处理机CCP(Communication Contro...

计算和大数据之间的区别有知道的嘛计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在...

如何提高培训专项内容和的精准和考核力度我认为要从以下几个方面着手,加大员工的培训力度,提高培训效果。一 制定科学的培训方案 1、结合企业的发展目标制定员工的培训目标 原则: 企业的长期发展战略目标和员工的培训...

excel社保基本信息表那个数据校验方块怎么弄的excel社保基本信息表那个数据校验方块怎么弄的,Excel怎么编辑校验公式实现自动检查错误:要做这个: 首先,要确保“开发工具”(2003以上版本)是显示在工具栏上的(显示方法:在Excel选项...

CRC16校验码如何计算CRC16校验码如何计算,crc16的校验码的算法:7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E 方法如下: CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄...

关于万国司考培训的协议报过班和普通班的区别关于万国司考培训的协议报过班和普通班的区别:协议保过班,是签订协议不过退费的班次,所以要的高,1.4万你不过人家退你一些,普通班就是不退费的 不管过于不过都不退了, 不如不报班...

数据仓库的含义数据仓库和数据库的区别数据仓库的含义数据仓库和数据库的区别,第二章数据仓库和数据挖掘的olap技术 2:什么是数据仓库 目前,数据仓库一词尚没有一个统一的定义,著名的数据仓库专家 W.H.Inmon 在其著作...

推荐阅读
图文推荐