当前位置:首页 » 网络连接 » 计算机网络怎么计算首部校验和例子
扩展阅读
网络分流如何设置 2025-06-25 01:20:32

计算机网络怎么计算首部校验和例子

发布时间: 2022-06-08 06:23:03

❶ 首部检验和怎么计算 能举例说明吗(可以举计算机网络 第五版P176 13题)我真的想弄明白!

IP数据报是将首部每16bit的数据相加求反码和,反码和计算就是将高位进位循环加到低位上,直到高位没有溢出,TCP UDP校验包括伪首部和数据报的校验

❷ 计算机网络的一个习题求解,解答看不懂,题目和解答如下!关于首部检验和的计算。

首部检验的方法是,吧首部分成一些16字的序列,将首部检验置0,然后对这些序列进行反码算数运算。求出来的这个和的反码放入首部检验位(16位)。收到数据报时进行检验:就是把首部再反码求和一遍,然后再取反码,这时应该得到0。

所以说前五行就是首部的前五行。
然后接下来的五行就是,换算成2进制的序列。
将这些序列16位的取反码合(包括和检验字段)得出来首部检验和发送前的值。
0111010001001110
然后再取反码放入首部检验位
1000101110110001
没有算,不过算出来应该就是这样。
反码求和时最高位相加产生进位的话结果要+1.

❸ tcp头部校验和计算方法的实现需要什么软件来实现

以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意原来是反码和,看来以前看书不仔细啊!罪过,罪过~~),觉得很奇怪,为什么会用反码和,而不是直接求和呢?(因为我认为TCP/IP协议里面的算法和思想一般都是非常经典的,人家这么做一定有原因的)下面就来探索一下这个校验和算法具体怎么实现的。 首先,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。 首先这里的反码好像跟我们以前学的有符号数的反码不一样(即正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各位取反),这里不分正负数,直接每个位都取反! 下面再举例两种二进制反码求和的运算: 原码加法运算 反码加法运算 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 plain //计算校验和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; while(size1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR *)buffer; } //将32位数转换成16 while (cksum16) cksum=(cksum16)+(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数据累加的结果取反,得到二进制反码求和的结果,然后函数返回该值。

❹ IP数据报首部校验和算法

普通的IP首部长20个字节,除非含有选项字段。
第一帧:4位版本
4位首部长度
8位服务类型(TOS)
16位总长度(字节数)
第二帧:16位标识
3位标志
13位片偏移
第三帧:8位生存时间(TTL)
8位协议
16位首部校验和
第四帧:32位源IP地址
第五帧:32位目的IP地址
第六帧:选项(如果有)
第七帧:数据
1.4位版本:IP所用版本,有IPv4, IPv6

2.4位首部长度:指的是占32bit字的数目,包含任何选项。由于它是一个4bit字段,因此首部最长为60个字节。

3.服务类型(TOS)包括一个3bit的优先权子字段(忽略),4bit的TOS子字段和1bit未用位但须置0。4bit的TOS分别代表:最小延时、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中一位,如4位均为0,则意味着是一般服务。

4.总长度字段指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长为16bit,所以IP数据报最长可达65535(超级通道的MTU为65535。它的意思其实不是一个真正的MTU,它使用了最长的IP数据报)。当数据报被分片时,该字段的值也随着变化。

尽管可以传一个长达65535字节的IP数据报,但是大多数的链路层都会对它进行分片,而且主机也要求不能接收超过576字节的数据报。由于TCP把用户数据分成若干片,因此一般来说这个限制不会影响TCP。UDP的应用(如RIP,TFTP,BOOTP,DNS,及SNMP),它们都限制用户数据报长度为512字节,小于576字节从而避免IP数据报分片。

但是现在大多数的实现(支持网络文件系统(NFS)的实现)允许超过8192字节(8K)的IP数据报。

总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。

5.标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会增1。

6.TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值由源主机设定(通常为32或64)一旦经过一个处理它的路由器,它的值就减1。当该字段值为0时,数据报就被丢弃,并发过ICMP报文通知源主机。

7.首部校验和字段是根据IP首部计算检验和码。它不对后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均包含有同时覆盖首部和数据检验和码。为了计算一份数据报IP校验和,首先把校验字段置为0。然后对首部中每个16bit进行二进制反码求和,结果存放检验的字段中。当收到一份数据报后,同样对首部中的每个16bit进行二进制反码求和。由于接收方在计算过程中包含了发送方存在首部中的校验和,因此如果在传输过程中没发生任何差错,那么接收方计算的校验和结果应全为1。如果不全为1(即校验和错误),那么IP就丢弃收到的数据报。但不生成差错报文,由上层去发现丢失的数据报并进行重传。

ICMP,IGMP,TCP和UDP都采用相同校验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段。

由于路由器经常只修改TTL字段(减1),因此当路由器转发一份报文时可以增加它的校验和,而不需要对IP整个首部进行重新计算。

8.每一份IP数据报都包含源IP地址和目的IP地址。

9、选项:是数据报中一个可变长的信息。目前这些选项定义如下:

。安全和处理限制(用于军事领域)

。记录路径(让每个路由器都记录下它的IP地址)

。时间戳 (让每个路由器都记录下它的IP地址和时间)

。宽松的源站选路 (为数据报指定一系列必须经过的IP地址)

。严格的源站选路(与宽松源站选路类似,但是要求只能经过这些指定的地址,不能经

过其它地址)。

这些选项很少被使用,并非所有的主机和路由都支持这些选项。

选项字段一直都是以32bit作为界限,在必要时必须插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍速(这是首部长度字段所要求的

❺ IP首部检验和

一个一个的来解答楼主的问题吧。
(1)反码求和是先求反码再求和,而正数的反码是本身,上面的IP首部转换成二进制如下:
0100 0101 0000 0000 0000 0000 0010 1110
1011 1110 0101 0101 0000 0000 0000 0000
0111 1010 0001 0001 0000 0000 0000 0000
1101 1110 1011 0111 0111 1110 1110 0011
0011 0000 1010 1000 0001 0010 0111 1010
因为是每16bit进行二进制反码求和,所以转换如下:
0100 0101 0000 0000
0000 0000 0010 1110
1011 1110 0101 0101
0000 0000 0000 0000
0111 1010 0001 0001
0000 0000 0000 0000
1101 1110 1011 0111
0111 1110 1110 0011
0011 0000 1010 1000
0001 0010 0111 1010
对这10个16Bit的二进制码进行求和就可以得到3ae50的结果,二进制求和比较简单,在这边略过。
(2)为什么要3+ae50=ae53?
因为IP 、UDP、ARP、TCP的检验和是16bit,而3ae50是18bit,所以需要对3ae50进行转换,即3+ae50。我的理解是这样的,不知楼主是否赞同?
(3) 为什么要进行 ae53+51ac=ffff?
检验和分为发送端的检验和与接收端的检验和。发送端校验和为ae53,接收端收到数据之后将按照同样地方法计算校验和,如果发送端校验和加上接收端校验和为FFFF,则表示部首传输没有发生错误。

❻ 怎么计算UDP检验和(最好是有详细例子分析)

首先,把伪首部、首部、和数据部,按顺序划分成多个双字节单元;最后不足两个字节补一个全零字节。
其次,对这些双字节单元进行二进制反码运算求和;
最后,对求得的和取反,放入检验和字段。

二进制反码求和运算:对应列相加,1 + 0 =1 ;0+0= 0 ; 1+1 =0 ,产生进位;最高位进位加到和的末尾。

❼ 首部检验和怎么计算

IP首部校验和的计算方法:

把校验和字段清零,对每16位(2字节)进行二进制反码求和, 反码求和的意思是先对每16位求和,再将得到的和转为反码。

IP数据报校验只对首部进行校验,不对数据部分进行校验。把首部看成16位为单位的数字组成,依次进行二进制反码求和,再把结果依次存入校验和字段中即可。

(7)计算机网络怎么计算首部校验和例子扩展阅读:

将发送的进行检验和运算的数据分成若干个16位的位串,每个位串看成一个二进制数,这里并不管字符串代表什么,是整数、浮点数还是位图都无所谓。将IP、UDP或TCP的PDU首部中的检验和字段置为0,该字段也参与检验和运算。

对这些16位的二进制数进行1的补码和(one's complement sum)运算,累加的结果再取反码即生成了检验码。将检验码放入检验和字段中。

其中1的补码和运算,即带循环进位(end round carry)的加法,最高位有进位应循环进到最低位。反码即二进制各位取反,如0111的反码为1000。

如何计算UDP/TCP检验和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检验的是把首部和数据部分一起都检验。

❾ 计算机网络,UDP数据报的校验和字段是通过什么来校验源和目的IP的呢

其实这是一种加密技术用于对文件内容进行审计的方法,使用 精通读文件把文件读到内存中,再对文件内容作一个 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地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。

❿ 在计算机网络中什么是crc校验和,怎么计算

计算机网络原理的计算题(crc校验和数据传输问题)第1题:设要发送的二进制数据为10110011,若采用crc校验方法,生成多项式为x^4+x^3+1,度求出实际发送的二进制数字序列。(要求写出计算
计算机网络原理的计算题(crc校验和数据传输问题)
第1题:设要发送的二进制数据为10110011,若采用crc校验方法,生成多项式为x^4+x^3+1,度求出实际发送的二进制数字序列。(要求写出计算过程)
这是自考08年四月份的试题,我总是跟答案算的不一样。
答案是:待发送的序列m=10110011,除数p=11001,m*2^5与除数p进行模2除法运算,得余数r=1000,所以要发送的二进制序列为:101100111000
我不明白为什么m要乘以2的5次方,我是用101100110000除以11001得到的余数是100。
第2题:一条长度为100km的点对点链路,对于一个100字节的分组,带宽为多大时传播延迟等于发送延迟?(信道传输速度为2*10^8m/s)
答案是:
传播延迟为:100km/(2*10^8m/s)=50ms
发送延迟等于传播延迟时:100/c=50ms
则信道传输速率:c=200kbps