ip数据报首部校验和算法
- 格式:doc
- 大小:32.50 KB
- 文档页数:1
如何计算IP报头的checksumwritten by whowin如果你研究过TCP/IP协议,那么你肯定知道IP报头中的checksum字段,或许你还曾经为如何计算这个字段的值所困扰,本⽂我们将讨论checksum的概念,并详细介绍IP报头中的checksum是如何计算的。
1. checksum是什么?简单地说,checksum就是从数据包中计算出来的⼀个值,⽤于检查数据包完整性;通过检查checksum来判断收到的数据是否有错误;数据在⽹络上传输时,由于各种原因数据包有可能损坏,所以在接收端必须要有⼀种⽅法来判断数据是否已经损坏,为此,在报头中加⼊checksum字段;在发送端要按照规定的算法计算checksum并将其设置为报头中的⼀个字段中;在接收端,要使⽤同样的算法重新计算checksum,并与收到的报头中的checksum进⾏交叉校验,以确定数据包是否正常。
2. IP报头中的checksumIP报头的checksum仅⽤于验证IP报头是否正确,所以仅需在IP报头上计算即可,与IP报头后⾯数据⽆关,因为IP报头后⾯的数据(⽐如UDP、TCP、ICMP等)通常都有⾃⼰的checksum;计算IP报头的checksum当然要了解IP协议的基本报头结构,下⾯是IP报头的基本格式:图1:IP报头的基本格式更好地理解IP报头各字段的含义,可以参考我的另⼀篇⽂章《Linux下如何在数据链路层接收原始数据包》或者参考IP Protocol Header Fundamentals Explained with Diagrams;仅就算法⽽⾔,IP报头的checksum定义为:IP报头中所有16-bit字的反码之和;也就是说把IP报头按照16-bit 字分割,然后把它们逐⼀相加,要求相加的结果仍为16-bit字,如果出现溢出(结果超出16-bit字),则丢弃溢出并把结果加1,全部16-bit字相加完成的结果再求反码,其结果就是checksum;上⾯的计算⽅法是在报⽂的发送端完成的;在接收端⾸先要将IP报头中的checksum字段清0,然后⽤与发送端相同的⽅法计算,得到的值与收到的IP报头中的checksum字段⽐较,如果⼀样,则表⽰IP报头完好,否则认为IP报头已经损坏;实际在发送端的做法是:将IP报头按照16-bit字分割,然后把它们逐⼀相加(包括收到的checksum字段),其结果如果为全1(0XFFFF),则表⽰IP报头完好,否则认为IP报头已经损坏。
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协议的版本。
Ip数据报首部检验和的算法及验证
原理
发送时:
1. 将校验和字段置为0;
2. 将整个首部分为16bit的部分,求和;
3.进行反码算数运算求和,若结果高于16b,将高出的位数截取,加到剩下的16b中,重复此步骤,直到不多于16b
4.取反码,填入校验和字段中
接收时:
1. 直接将整个首部分为16bit的部分,求和;
2.进行反码算数运算求和,若结果高于16b,将高出的位数截取,加到剩下的16b中,重复此步骤,直到不多于16b
3.取反码,若结果为0则正确,如果结果不为0则说明出现错误
;
使用wireshark抓包,获得任意一个ip数据报
程序运行结果
计算校验和的结果
检验校验和的结果
#include<stdio.h> main()
{
inti,j,k=1,num,flag;
int
head[10]={0x4500,0x0028,0xbc61,0x4000,0x2d06,0xb99a,0x7b7d,0x735f,0x0a0b,0xdeec};
head[5]=0;
num=head[0];
for(i=1;i<10;i++)
num=num+head[i];
while((num>>16)>0)
num=(num>>16)+(num&0xffff);
num=~num;
printf("%x\n",num);
}。
首部校验和的计算例子详细在计算机网络中,数据的传输是通过分组完成的。
为了确保数据的可靠传输,每个分组都包含了一些必要的信息,其中一个重要的字段是首部校验和。
首部校验和是一种用于检测传输数据是否完整和错误的校验机制。
它通过对数据的每个字节进行运算,计算出一个校验和值。
接收方在接收到数据后,同样会进行首部校验和计算,并将结果与发送方的校验和进行比较,以验证数据的完整性和错误情况。
让我们来看一个简单的计算例子,假设我们要发送一个包含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数据报的格式【实验目的】1、通过分析IP数据报的格式了解IP数据报各个字段的大小、取值范围;2、掌握它们在IP协议中所起的作用。
【实验内容】1、分析IP数据报的结构,熟悉各个字段的内容、功能、格式和取值范围;2、编辑IP数据报首部各字段的内容;3、单个或批量发送已经编辑好的IP数据报。
【实验原理】IP数据报由首部和数据两部分组成。
首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。
20字节之后是一些可选字段,其长度是可变的。
IP数据报的格式如下图所示:版本:占4 bit,指IP协议的版本。
通信双方使用的IP版本必须一致。
目前广泛使用的版本号为4。
首部长度:占4 bit,可表示的最大数值是15个单位(一个单位为4字节),因此IP的首部长度的最大值是60字节。
服务类型:占8 bit,用来获得更好的服务。
前三个比特表示优先级。
第D比特表示要求有更低的时延。
T比特表示要求有更高的吞吐量。
R比特表示要求有更高的可靠性。
C比特表示要求选择代价更小的路由。
最后一个比特目前尚未使用。
总长度:占16 bit,指首部和数据之和的长度,单位为字节。
标识:占16 bit,它是一个计数器,用来产生数据报的标识。
标志:占3 bit,目前只有前两个比特有意义。
最低位记为MF,MF=1表示后面“还有分片”的数据报。
MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF,意思是“不能分片”。
只有当DF=0时才允许分片。
片偏移:占13 bit,表示较长的分组在分片后,某片在原分组中的相对位置。
片偏移以8个字节为偏移单位。
生存时间:占8 bit,表示数据报在网络中可通过的路由器的最大值。
协议:占8 bit,指出此数据报携带的数据是何种协议。
首部校验和:占16 bit,只校验数据报的首部,不包括数据部分。
源IP地址:占4 bit。
目的IP地址:占4 bit。
可选字段:用来支持排错、测量以及安全等措施。
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头部:
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 首部校验和的计算zz1IP数据包的头信息格式:+-------------------------------------------------+| 版本 (4位) |+-------------------------------------------------+| 首部长度(4位) |+-------------------------------------------------+| 服务类型(TOS)8位 |+-------------------------------------------------+| 数据包总长度(16位) |+-------------------------------------------------+| 标识ID号(16位) |+-------------------------------------------------+| 标志位(3位) |+-------------------------------------------------+| 片偏移(13位) |+-------------------------------------------------+| 生存时间(TTL)(8位) |+-------------------------------------------------+| 协议类型 (8位) |+-------------------------------------------------+| 首部校验和(16位) |+-------------------------------------------------+| 源IP地址(32位) |+-------------------------------------------------+| 目的IP地址 (32位) |+-------------------------------------------------+* IP选项(若有) (32位) *+-------------------------------------------------+* 数据 *+-------------------------------------------------+这里要说的是首部校验和字段。
实验5分析IP报文结构IP(Internet Protocol)是一种基于分组交换的网络层协议,它负责将数据包从源主机发送到目的主机。
IP报文是在网络中传输的数据包的格式和结构。
IP报文的结构主要由首部和数据两部分组成。
首部是固定长度的部分,它储存了关于IP包的一些必要信息,如版本、首部长度、服务类型、总长度、时间戳、标识、标志、分片偏移、生存时间、协议、首部校验和、源IP地址、目的IP地址等。
数据部分则是要传输的实际数据。
首先,IP报文首部的第一个字段是版本(Version),它占4位,表示IP协议的版本号。
当前主要使用的版本是IPv4(版本号为4)和IPv6(版本号为6)。
其次,首部长度(Header Length)占4位,表示首部的长度,以4个字节为单位。
最小值是20字节,最大值是60字节。
由于首部长度字段只有4个位,它的最大值是15(1111),需要加上首部中其他字段的长度才能得到实际的首部长度。
接下来,服务类型(Type of Service)字段占8位,用于标识数据包的优先级和处理要求。
例如,分为低成本、高可靠性、最大吞吐量、最小延迟等不同类型。
标识(Identification)字段占16位,用于标识与此数据包相关的数据报的序列号。
标志(Flags)字段占3位,用于控制数据报的分段与重组。
其中,最高位表示是否允许分段,中间位保留,最低位用于指示是否为最后一个分段。
分片偏移(Fragment Offset)字段占13位,表示数据报分段在原始数据报中的位置,以8个字节为单位。
生存时间(Time to Live)字段占8位,表示数据包在网络中可以经过的最大路由器跳数。
每经过一个路由器,该字段会减1,当它减为0时,数据包将被丢弃。
协议(Protocol)字段占8位,表示上层协议,例如TCP或UDP。
首部校验和(Header Checksum)字段占16位,用于检测IP头部的错误。
它通过对首部进行求和、取反及移位等操作得到校验和值。