IPv4数据包格式(头部)
学习Internet网络层最恰当的开始之处就是学习IP数据报本身的格式。每个IP数据报包含一个头部和一个正文部分。头部有一个20字节的定长部分和一个可选的变长部分。
VPv4数据报头部
版本(Version)
版本(Version)域记录了数据报属于哪一个版本的协议。由于每一个数据报中都包含了版本信息,所以版本之间的迁移过程就有可能持续很多年,在此过程中有的机器运行老的版本,有的机器运行新的版本。目前正在进行从IPv4到IPv6的版本迁徙过程中。关于版本号的问题,IPv5是一个实验性的实时流协议,它一直没有被广泛使用。
IHL
IHL用4位来表示。由于头部的长度是不固定的,所以头部的IHL域指明了该头部有多长(以32位字的长度为单位)。IHL的最小长度为5,这个时候表明没有可选项(Option),此4位域的最大值也就是15,也就是说头部的最大长度为15*32/8 = 60字节,因此可选项(Option) = 60 - 20 = 40字节,可选项的内容最大为40字节。对于某些选项,比如记录一个分组沿途路径的选项,40字节往往太小了,这就使得这样的选项其实没有什么用处。
服务类型(Type of Service)
服务类型(Type of Service)域是少数几个“在过去几十年中其含义略有改变”的域之一。无论是改变前还是在改变之后,它的用途是用于区分不同的服务种类。如可靠性和速度各种组合都是可能的,比如数字化的语音数据,速度比精度性更加重要;而对于文件传输,正确性比速度更加重要。最初的时候,此6位域(从左至右)包含了一个3位的Precedence域和3个标志D、T和R。Precedence域是一个从0(普通级别)至7(网络控制)的优先级。通过三个标志位,源主机可以指定它最关心的是什么:延迟(Delay)、吞吐量(Throughput)、可靠性(Reliability)。理论上,这些域可以使得路由器在多种选择之中做出路由决定,比如路由器利用这些域选择一条高吞吐量的、高延迟的卫星线路,或者选择一条低吞吐量、低延迟的租用线路。而在实践中,当前的路由器通常完全忽略服务类型域。最后,IETF承认了失败,并且将该域作了轻微的改变,以适应区分服务的需要。这6位合起来表示每个分组属于以前讨论过的服务类别中的哪一类。这些类别包括4个排队优先级、3种丢弃可能性和一些历史类别。总长度(Total Length)
总长度(Total Length)域包含了该数据报中的所有内容,头部和数据。最大的长度是65535字节(2^16,16位,半字)。目前这种情况下,这样的上界还是可以接受的,因为很少会传输一个数据报大小为512K大小的情况,但是,将来有了千兆网络之后,可能需要更大的数据报。标识(Identification)
标识(Identification)域的用途是让目标主机确定一个新到来的分段是属于哪一个数据报的。同一个数据报的的所有分段都有相同的Identification值。接下来是未使用的位。然后是2个1位域。DF代表不分段(Don't Fragment),这是针对路由器的一个命令,它让路由器不要分割该数据报,因为目标主机无法将分片重新组合回原来的数据报。例如,当一台计算机启动的时候,它 的ROM可能向网络请求一个包含内存映像的一个数据报。发送发在数据报中标记了DF位之后,它就知道该数据将作为一个整体到达接收方,不过这意味着该数据报必须避开最优路径的小分组网络,而不得不走次优的的路径。所有的机器都要求能接受576字节或者更少的分段(4.5k)。MF代表更多的分段(More Fragment)。除了最后一个分段以外,其它所有的分段都必须设置这一位,它的用途是,接收方可以知道什么时候一个数据报的所有分段已经到达了。
分段偏移(Fragment Offset)
分段偏移(Fragment Offset)(13位域)域指明了该分段在当前数据报中的什么位置上。除了一个数据报的最后一个分段以外,其他所有的分段必须是8字节的倍数,这里的8字节是基本的分段单位(64bit大小)。由于该域有13位,所以每个数据报最多可以有2^13 = 8192个分段,因此,最大的数据报长度为8192*8 = 65536字节,比Taotal length域还要大1.生命期TTL(Time to live)
TTL(Time to live)域(8位域)是一个用于限制分组生存期的计数器。这里的计数器的单位是秒,因此最大的生存期是2^8 - 1 = 255秒。在每一跳上该计数器必须被递减,而且,当数据报在一台路由器上排队较长时间时,该计数器必须被多倍递减。在实践中,它只是跳计数器,当实践递减到0的时候,分组被丢弃,路由器给源主机送回一个警告分组。此项特性可以避免数据报长时间地逗留在网络中,有时候当路由表被破坏之后,这种事情是有可能发生的。协议(Protocol)
当网络层组装完成一个完整的数据报之后,它需要知道该如何对它进行处理。协议(Protocol)域指明了该将它交给哪一个传输进程。TCP是一种可能,UDP或者其他协议也是一种可能。协议的编号是整合Internet全球统一的。RFC 1700中列出了以前的协议和其他分配的编号,但是现在,协议的编号位于一个在线的数据库中(从www.iana.org中可以查到)。头部校验和(Header checksum)
头部校验和(Header checksum)域只校验头部。这样的校验和对于检测“因路由器中的坏内存而产生的错误”非常有用。其算法是这样的:当数据到达时,所有的16位(半字)累加起来,然后再取结果的补码。该算法的意图是,当数据到达之后,Header checksum的计算结果应该为0.该算法比常规算法更加稳定。请注意,在每一跳上,Header checksum域必须重新计算,因为至少有一个域总是要改变的(即Time to live),但是通过一些技巧可以加速计算。源地址(Source address)和目标地址(Destination address)表示网络号和主机号。都用32为表示。
选项(Option)
选项(Option)域的设计意图是:提供一种途径允许后续版本的协议包含一些原来的设计中没有出现的信息;允许实验人员试验新的想法;避免为那些不常使用的信息分配头部域。选择是变长的,没一个选项的第一个字节是一个标识码,它标明了该选项。有的选项后面跟着1个字节的选项长度域,然后是一个或多个数据字节。Options域被补齐到4字节的倍数。