IP数据报首部校验和算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IP数据报首部校验和算法相关的知识,希望对你有一定的参考价值。
参考技术A 普通的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首部检验和
求助:关于“IP首部检验和”原理实在搞不懂。在网上找了个例子,过程太简单,看不懂。
IP的首部如下(各个部分的含义我懂):
45 00 00 2e
be 55 00 00
7a 11 51 ac
de b7 7e e3
c0 a8 12 7a
他解释的过程如下:
检验和计算:
首先,把检验和字段置为0。
45 00 00 2e
be 55 00 00
7a 11 00 00<----检验和置为0
de b7 7e e3
c0 a8 12 7a
其次,对整个首部中的每个16 bit进行二进制反码求和,求和值为3ae50,然后3+ae50=ae53(这是根据源代码中算法 cksum = (cksum >> 16) + (cksum & 0xffff) 进行的 ) 最后,ae53+51ac=ffff。因此判断ip首部在传输过程中没有发生任何差错。
我没有看懂的地方:(1)怎么样通过二进制反码计算得到3ae50这个数的(我算不到,希望高手一步步的算我看)。(2)“然后3+ae50=ae53” 这一步是干什么?为什么这么算? (3)“最后,ae53+51ac=ffff” 这怎么就推断“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,则表示部首传输没有发生错误。 参考技术A BAFF(FFFF-4500)+FFD1(FFFF-002e)+......+ED85(FFFF-127a)=3AE50=AED3
接收端:
BAFF(FFFF-4500)+FFD1(FFFF-002e)+......+ED85(FFFF-127a)+(FFFF-AED3)=
AED3+FFFF-AED3=FFFF
若传输出错:
则为 (!AED3+FFFF-AED3)!=FFFF
我知道的是这样子的。 参考技术B 看不明白 不是很懂
问题是 你都知道你那里不明白 为什么不在现实中问呢 一句话的事 网上估计很难本回答被提问者采纳
以上是关于IP数据报首部校验和算法的主要内容,如果未能解决你的问题,请参考以下文章