(九)网络层--IP数据报
IP数据报
这篇文章我们一起来学习下IP数据报的格式。
如下图所示:
一个IP数据报由首部和数据两部分组成,首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面,是一些可选字段,其长度是可变的。下面看下各字段的含义:
- 版本
占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4) - 首部长度
占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位,即4字节,也就是说,如果首部长度为0101(十进制为5),那么首部长度则占20个字节。因为IP首部的固定长度是20字节,因为这一字段的最小值为0101。当这一字段达到最大值1111(十进制为15)时,就表示首部长度为60字节。如果IP分组首部的长度不是4字节的整数倍时,必须利用最后的填充字段加以填充,因此,IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现IP协议时较为方便。 - 区分服务
占8位,用来获得更好的服务。只有在使用区分服务时,这个字段才起作用,在一般的情况下都不使用这个字段。 - 总长度
总长度是指首部与数据之和的长度,单位为字节,这一字段为16位,因此数据报的最大长度为2^16 - 1,即65535字节。我们知道,在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度MTU。当一个IP数据报封装成链路层的帧时,此数据报的总长度一定不能超过下面的数据链路层所规定的MTU值,就必须把过长的数据报进行分片处理。
虽然使用尽可能长的IP数据报会使传输效率得到提高,但数据报短些也有好处。每一个IP数据报越短,路由器转发的速度就越快。为此,IP协议规定,在互联网中所有的主机和路由器,必须能够接受长度不超过576字节的数据报。这是假定上层交下来的数据长度有512字节(合理的长度),加上最长的IP首部60字节,加上4字节的富余量,就得到576字节。当主机需要发送长度超过576字节的数据报时,应当先了解一下,目的主机能否接受所要发送的数据报长度。否则,就要进行分片。
在进行分片时,数据报首部中的“总长度”字段是指分片后的每一个分片的首部长度与该分片的数据长度的总和。 - 标识
占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给此字段。但这个标识并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确的重装成为原来的数据。 - 标志
占3位,但目前只有两位有意义:- 最低位记为MF(More Fragment),MF = 1 表示后面还有分片的数据报,MF = 0 表示这已是若干数据报片中的最后一个
- 中间一位记为DF(Don't Fragment),意思是不能分片。只有当DF = 0 时才允许分片
- 片偏移
占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位,即每个分片的长度一定是8字节的整数倍。举个例子:
一数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1400字节。于是分为3个数据报片,其数据部分的长度分别为1400,1400,1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值,如下图所示:
下表是本例中数据报首部与分片有关的字段中的数值,其中标识字段的值是任意给定的,具有相同标识的数据报片在目的站就可无误的重装成原来的数据报。
现在假定数据报片2经过某个网络时还需要再进行分片,即划分为数据报片2-1(数据800字节),2-2(数据600字节)。那么这两个数据报片的总长度、标识、MF、DF和片偏移分别为:820,12345,1,0,175;620,12345,1,0,275
- 生存时间
占8位,生存时间字段常用的英文缩写是TTL(Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制的在互联网中兜圈子(从路由器R1转发到R2,再转发到R3,然后又转发到R1),因此白白消耗网络资源。最初的设计是以秒作为TTL值单位的。每经过一个路由器,就把TTL减去数据报在路由器上所消耗的时间。若数据报在路由器消耗的时间小于1s,就把TTL值减1。当TTL值减为0时,就丢弃这个数据报。
随着技术的进步,路由器处理数据报所需的时间不断在缩短,一般都远远小于1s,后来就把TTL字段的功能改为“跳数限制”。路由器在每次转发数据报之前就把TTL值减1.若TTL值减小到0,就丢弃这个数据报,不再转发。因此,现在TTL的单位不再是秒,而是跳数。TTL的意义是指明数据报在互联网中至多可经过多少个路由器,显然最大值是255。若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送,因为一旦传送到局域网上的某个路由器,在被转发之前TTL值就减小到0,因而就会被路由器丢弃。 - 协议
占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。常用的一些协议和相应的协议字段值如下:
- 首部检验和
占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和,不检验数据部分可减少计算的工作量。 - 源地址
占32位 - 目的地址
占32位
IP数据报首部的可变部分
IP数据报首部的可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从一个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要一个字节,它只包括一个字节的选项代码。而有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用,很多路由器都不考虑IP首部的选项字段,因此新的IP版本IPv6就把IP数据报的首部长度做成固定的。