4.7 IPv4数据报的首部格式
# 4.7 IPv4数据报的首部格式
本节课我们介绍IPv4数据报的首部格式,为了简单起见,之后我们将IPv4数据报简称为IP数据报,而不指出、版本号。IP数据报的首部格式及其内容是实现IP协议主要功能的基础,因此我们有必要搞清楚这部分内容,如图所示
- 这是IP数据报的首部格式,它由20字节的固定部分和最大40字节的可变部分组成。所谓固定部分是指每个IP数据报首部都必须包含的部分,而某些IP数据报的首部除了包含20字节的固定部分外,还包含一些可选的字段来增加IP数据报的功能。
- IP数据报的首部常以32个比特为单位进行描述,图中的每一行都由32比特也就是4个字节构成,每个小格子称为字段或者域。
- 每个字段或某些字段的组合,用来表达IP协议的相关功能,
- 这是版本字段,该字段占4个比特,用来表示IP协议的版本,通信双方使用的IP协议的版本必须一致,目前广泛使用的IP协议的版本号为4,即IPv4,
- 这是首部长度字段,该字段占4个比特,用来表示IP数据报首部的长度,该字段的取值以四字节为单位,最小十进制取值为5,表示IP数据报首部只有20字节的固定部分;最大十进制取值为15,表示IP数据报首部包含20字节的固定部分和最大40节的可变部分,
- 这是可选字段,该字段的长度从1个字节到40个字节不等,用来支持排错、测量以及安全措施。可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的,这就增加了每一个路由器,处理IP数据报的开销,实际上可选字段很少被使用,
- 这是填充字段,该字段用来确保首部长度为四字节的整数倍,使用全0进行填充。我们之前刚刚介绍过首部,长度字段是以四字节为单位的,换句话说,IP数据报的首部长度一定是四字节的整数倍。由于首部中的可选字段的长度,从1个字节到40个字节不等,那么当20字节的固定部分加上1~40个字节长度不等的可变部分,会造成首部长度不是四字节的整数倍时,就用取值为全零的填充字段,填充相应的字节,以确保IP数据报的首部长度是四字节的整数倍。
- 这是区分服务字段,该字段占8个比特,用来获得更好的服务。该字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年因特网工程任务组IEFT把这个字段改名为区分服务,利用该字段的不同数值,可提供不同等级的服务质量。只有在使用区分服务时,该字段才起作用,一般情况下都不使用该字段
这是总长度字段,该字段占16比特,用来表示IP数据报的总长度,也就是首部和数据载荷的长度总和,最大取值为十进制的65535,以字节为单位,需要注意的是在实际应用中很少传输这么长的IP数据报。接下来我们来举例说明,首部长度字段和总长度字段的区别与联系
这是一个IP数据报,它由首部和数据载荷两部分构成。假设首部中的首部长度字段的二进制取值为0101,则可以计算出IP数据报的首部长度,也就是用首部长度字段的取值乘以四字节单位共20字节。
假设首部中的总长度字段的二进制取值为0000 0011 1111 1100,则可以计算出IP数据报的总长度,也就是在总长度字段的取值后,添加字节的单位共1020个字节,进而可以计算出数据载荷的长度,也就是用IP数据报的总长度减去IP数据报的首部长度,结果为1000个字节
接下来我们介绍标识,标志,片偏移这三个字段,他们共同用于进行IP数据报分片,这是网际层封装出的IP数据报,它将在数据链路层封装成帧。每一种数据链路层协议都规定了帧的数据载荷的最大程度,称为最大传输单元MTU。例如以太网的数据链路层规定,MTU的值为1500个字节,如果某个IP数据报的总长度超过MTU时,将无法封装成帧,需要将源IP数据报分片为更小的IP数据报,再将各分片IP数据报封装成帧。
接下来我们介绍标识,标志,片偏移这三个字段,他们共同用于进行IP数据报分片,这是网际层封装出的IP数据报,它将在数据链路层封装成帧。每一种数据链路层协议都规定了帧的数据载荷的最大程度,称为最大传输单元MTU。例如以太网的数据链路层规定,MTU的值为1500个字节,如果某个IP数据报的总长度超过MTU时,将无法封装成帧,需要将源IP数据报分片为更小的IP数据报,再将各分片IP数据报封装成帧。
- 标识字段,占16个比特,属于同一个数据报的各分片数据报,应该具有相同的标识,IP软件维持一个计数器,每产生一个IP数据报,计数器的值就要加一,并将此值赋给标识字段,
- 标志字段占三个比特,各比特含义如下,DF比特表示是否允许分片置一表示不允许分片,清0表示允许分片。MF比特表示本分片后面是否还有分片?置一表示本分片后面还有分片,清0表示本分片就是最后一个分片,还有一个保留位,必须设置为0,
- 片偏移字段占13个比特,指出分片数据报的数据载荷部分偏移,其在源数据报的位置有多远,片偏移以8个字节为单位。
接下来我们举例说明IP数据报如何进行分片。假设有这样一个IP数据报,它由20字节的固定首部和3800字节的数据载荷两部分构成,也就是说该IP数据报的总长为3820个字节。假设使用以太网传送该IP数据报,以太网的最大传送单元MTU为1500个字节,也就是以太网的数据载荷部分,最大为1500个字节,无法封装3820字节长的IP数据报,因此需要把该IP数据报分片成几个更小的IP数据报,每个长度不能大于1500个字节,然后再将每个分片IP数据报封装成一个以太网的帧进行传输。
为了更好的描述后续的分片工作,我们将源IP数据报数据载荷部分的每一个字节都编上号,第一个字节编号为0,最后一个字节编号为3799,我们可将源IP数据报的数据载荷分成三个更小的分片,第一个分片从0号字节到1399号字节,共1400个字节。第二个分片,从1400号字节到2799号字节,共1400个字节。第三个分片,从2800号字节到3799号字节,共1000个字节
分片结束后,给每个分片重新添加一个首部,使之成为IP数据报。请同学们思考这样一个问题,给各分片添加的首部是否完全相同,我们来一起填一下下面这张表格。源IP数据报首部中的总长度字段的十进制取值为3800+20,标识字段的10进制取值为12345,MF比特的取值为0,表示后面没有分片数据报,这就是最后一个分片数据报,DF比特的取值为0,表示该IP数据报允许被分片,由于这是未分片的源IP数据报,因此片偏移为0。
我们来填写分片一,IP数据报首部中相关字段的值,总长度字段的十进制取值为1400+20,其中1400字节是分片的长度,20字节是固定首部的长度,标识字段的十进制取值与源IP数据报的相同,由于该分片不是最后一个分片,因此 MF比特的取值为一,表示该分片后还有分片,该分片IP数据报允许被再次分片,因此DF比特的取值为0。该分片IP数据报数据载荷部分的第一个字节,就是源IP数据报数据载荷部分的第一个字节,因此片偏移字段的取值为0÷8。除以八的原因是片偏移字段,以八字节为单位。
接下来请同学们填写分片二IP数据报首部中相关字段的值,相信大家都可以正确完成。分片二IP数据报、首部装这几个相关字段的值,只有片偏移字段的值,与分片一IP数据报的不同,
我们再来填写分片三IP数据报首部装相关字段的值,总长度字段的十进制取值为1000+20,其中1000字节是分片的长度,20字节是固定首部的长度,标识字段的十进制取值,与源IP数据报的相同,由于该分片就是最后一个分片,因此MF比特的取值为0,表示该分片后没有其他分片。该分片IP数据报允许被再次分片,因此DF比特的取值为0。该分片IP数据报数据载荷的第一个字节是源IP数据报数据载荷中编号为2800的字节,因此片偏移字段的取值为2800÷8。
现在假定分片二的IP数据报,经过某个网络时还需要再进行分片,其中一个分片长度为800字节,另一个分片长度为600字节,分片结束后给每个分片重新添加一个首部,使之成为IP数据报。接下来请同学们填写该表格,相信大家都可以正确完成。
再来看生存时间字段,该字段占8个比特,最初以秒为单位,最大生存周期为255秒,路由器转发IP数据报时,将IP数据报首部中的该字段的值,减去IP数据报在本路由器上所耗费的时间,若不为零就要转发,否则就丢弃。
现在以跳数为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减一,若不为零就转发,否则就要丢弃。
接下来我们来举例说明,生存时间字段的作用。假设采用如下图所示的网络拓扑,路由器R1R2R3,各自的路由表如图所示。为了简单起见,我们只给出了各路由器路由表中的由人工配置的静态路由条目,例如路由器R中的这条静态路由条目,他指出了IP数据报要到达网络N2,下一跳,需要转发给路由器R3。
假设我们在人工配置这条静态路由条目时,错将下一跳,配置成了R1,这会导致将去往网络N2的IP数据报,错误的转发给路由器R1。我们来看看会出现什么问题。
假设某个IP数据报从网络N1发网络N2,该IP数据报到达R1号,R1进行查表转发,发现了匹配的路由条目,其下一跳指示转发给R2,于是R1将该IP数据报转发给了R2,R2收到该IP数据报后进行查表转发,发现了匹配的路由条目,其下一跳指示转发给R1,于是R将该IP数据报又转发回来R1。很显然形成了路由环路。如果没有其他措施,IP数据报将在路由环路庄永久兜圈。现在相信大家能够更好的理解IP数据报首部中生存时间字段的作用了,那就是确保IP数据报不会在网络中永久兜圈。IP数据报每经过一个路由器其生存时间的值被减1,当减少到0时,IP数据报将被路由器丢弃。
再来看协议字段,该字段占8个比特,用来指明IP数据报的数据部分是何种协议数据单元。常用的一些协议和相应的协议字段值,如下表所示。我们来举例说明,这是一个IP数据报,
当首部中协议字段的取值为1时,表明数据部分是ICMP报文,也就是用ICMP协议封装的协议数据单元,
当首部中协议字段的取值为60,表明数据部分是TCP报文段,也就是用TCP协议封装的协议数据单元,
这是首部检验和字段,该字段占16比特,用来检测IP数据报首部,在传输过程中是否出现差错,所采用的检错码比循环冗余检错码简单,称为因特网检验和,我们就不再赘述了,有兴趣的同学可自行查阅相关资料,
IP数据报每经过一个路由器,路由器都要重新计算首部检验和。因为某些字段,例如生存时间,标志,片偏移等的取值可能会发生变化。由于IP层本身并不提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在IPV6中路由器不再计算首部检验和,从而更快转发IP数据报,
这是计算机专业考研全国统考计算机网络部分,2018年题47的第2问,我们来一起分析一下。这是题目所给的。销售部装某个主机发送到IP分组,总长度为1500个字节,题目给出IP分组的头部长度为20字节,因此数据载荷部分因为1480个字节,为了方便描述我们将数据载荷中的每一个字节都编上号,第一个字节的编号为0,最后一个字节的编号为1479,
题目给出由于该IP数据报通过路由器的F1接口转发时,受到所在网络的最大传送单元MTU为800字节的限制,需要进行分片。换句话说,分片后的每一个IP数据报的最大长度可以是800字节,假设这是分片一的IP数据报,这是它的20字节固定首部,为了符合题目的要求,尽可能分为最大片,我们将分片长度取为780个字节,其第一个字节的编号为0,最后一个字节的编号为779,偏移量等于0÷8,结果是0,
将剩余的700字节作为分片二,其第一个字节的编号为780,最后一个字节的编号为1479,给其添加相应的20字节首部,使之成为分片二的IP数据报,片偏移量等于780÷8,结果为97.5。
由于偏移量必须为整数,因此这种分片方案不行,我们可将分片的最大长度取为小于780,且能整出8的最大整数,具体方法是将780÷8的结果向下取整,然后再乘以8,结果为776。
这样分片一的长度为776个字节,剩余704个字节作为分片2,分片一的最后1个字节编号为775,分片二的第一个字节编号为776,这样分片二的片偏移量等于776÷8,结果为97。
再来看2011年的提47的第一问和第四问。尽管到目前为止,我们还未学习外部请求是用什么应用层协议封装的,也不知道在运输层还会用什么协议进行封装,但是我们知道在网际层一定会用IP协议对其进行封装,使之成为IP分组。web服务器的IP地址就填写在IP分组头中的目的IP地址字段,IP分组,还要封装成以太网帧才能发送在IP分组头中,目的IP地址字段前,还有16个字节的内容,在以太网帧中数据载荷前还有14字节的内容,因此可知在以太网帧中,从第31个字节开始的4个字节,实际上就是目的IP地址的内容。题目所给的以太网数据,帧的第一列数据,实际上并不是以太网帧的内容,仅仅作为行号,其增量为16,表示每行有16个字节的内容,这些是以太网帧内容的16进制形式,这些是以太网帧内容的ASCII 这些是以太网帧的前30个字节。接下来的4个字节就是WEB服务器的IP地址,其点分10进制形式为64.170.98.32。
从图中可知,主机的默认网关就是路由器R,主机会将web请求发送给默认网关,由默认网关将WEB请求转发到因特网。因此以太网帧头中的目的MAC地址字段,封装的就是默认网关的MAC地址,如图所示,
而目的MARK地址字段就是以太网帧的前6个字节,其内容就是默认网关的MAC地址,写成MARK地址的形式为00-21-27-21-51-EE
再来解答第四问,IP分组经过路由器R时生存时间字段的值被减一,首部检验和会被重新计算,若IP分组总长度大于最大传送单元,MTU的值,则需要进行分片。此时总长度字段、标志字段、片偏移字段都需要修改。
小结