I P数据报非常简单,就是在数据块(称为净荷)的前面加上一个包头。I P数据报中的数据(包括包头中的数据)以3 2位( 4字节或4个八位组)的方式来组织。图2 - 3中展示了I P头字段的排列。从中可以看出,所有I P数据报头最小长度是5个字( 2 0字节),如果有其他选项的话,包头可能会更长。
• 数据报I D:这个唯一的1 6位标识符由产生它的主机指定给数据报。发送主机为它送出的每个数据报产生一个单独I D,但数据报在传输的过程中可能会分段,并经过不同的网络而到达目的地。分段后的数据报都共享同一个数据报I D,这将帮助接收主机对分段进行重装。
• 分段标志: 3位分段标志位中的第一位未用,其他两位用于控制数据报的分段方式。如果“不能分段( D F )”位设为1,意味着数据报在选路到目的地的过程中不会分段传输。
如果数据报不分段就无法选路,试图分段的路由器将丢掉该数据报并向源主机发送错误报文。如果“更多段( M F )”位设为1,意味着该数据报是某两个或多个分段中的一个,
但不是最后一段。如果M F位设为0,意味着后面没有其他分段或者是该数据报本来就没有分段。接收主机把标志位和分段偏移一起使用,以重组被分段的数据报。
• 分段偏移值:这个字段包含1 3位,它表示以8字节为单位,当前数据报相对于初始数据报的开头的位置。换句话说,数据报的第一个分段的偏移值为0;如果第二个分段中的
数据从初始数据报开头的第8 0 0字节开始,该偏移值将是1 0 0。
• 生存期:这个8位字段指明数据报在进入互联网后能够存在多长时间,它以秒为单位。生存期( T T L )用于测量数据报在穿越互联网时允许存在的秒数。其最大值是2 5 5,当T T L到达0时,包将被网络丢弃。设定T T L的本意是让每个路由器计算出处理每个数据包所需的时间,然后从T T L中把这段时间减去。实际上,数据报穿越路由器的时间远小于1
秒,因此路由器厂商在实现中采用了一个简单的减法:即在转发数据报时把T T L减1。
在实践中, T T L代表的是数据报在被丢弃前能够穿越的最大跳数。
• 协议:指明数据报中携带的净荷类型,主要标识所使用的传输层协议:一般是T C P连接或U D P数据报。
• 头校验和:I P v 4中不提供任何可靠服务,此校验和只针对包头。计算校验和时,把包头
作为一系列1 6位二进制数字(校验和本身在计算时被设为0 ),并把它们加在一起,然后对结果取补码。这保证了头的正确性但并没有增加任何传输可靠性或对I P的差错检查。
• 源/目的I P地址:这些是源主机和目的主机的实际的3 2位( 4个八位组) I P v 4地址。
在I P v 4中,所有包头以3 2位为单位,即基本的长度单位是4个字节。在I P v 6中,包头以6 4位为单位,且包头的总长度是4 0字节。I P v 6协议为对其包头定义了以下字段:
• 版本。长度为4位,对于I P v 6,该字段必须为6。
• 类别。长度为8位,指明为该包提供了某种“区分服务”。RFC 1883中最初定义该字段只有4位,并命名为“优先级字段”,后来该字段的名字改为“类别”,在最新的I P v 6I n t e r n e t草案中,称之为“业务流类别”。该字段的定义独立于I P v 6,目前尚未在任何R F C中定义。该字段的默认值是全0。
• 流标签。长度为2 0位,用于标识属于同一业务流的包。一个节点可以同时作为多个业务流的发送源。流标签和源节点地址唯一标识了一个业务流。在RFC 1883中这个字段最
初被设计为2 4位,但当类别字段的长度增加到8位后,流标签字段被迫减小长度来作补偿。
• 净荷长度。长度为1 6位,其中包括包净荷的字节长度,即I P v 6头后的包中包含的字节数。这意味着在计算净荷长度时包含了I P v 6扩展头的长度。
• 下一个头。这个字段指出了I P v 6头后所跟的头字段中的协议类型。与I P v 6协议字段类似,下一个头字段可以用来指出高层是T C P还是U D P,但它也可以用来指明I P v 6扩展头的存在。
• 跳极限。长度为8位。每当一个节点对包进行一次转发之后,这个字段就会被减1。如果该字段达到0,这个包就将被丢弃。I P v 4中有一个具有类似功能的生存期字段,但与
I P v 4不同,人们不愿意在I P v 6中由协议定义一个关于包生存时间的上限。这意味着对过期包进行超时判断的功能可以由高层协议完成。
• 源地址。长度为1 2 8位,指出了I P v 6包的发送方地址。
• 目的地址。长度为1 2 8位,指出了I P v 6包的接收方地址。这个地址可以是一个单播、组播或任意点播地址。如果使用了选路扩展头(其中定义了一个包必须经过的特殊路由),
其目的地址可以是其中某一个中间节点的地址而不必是最终地址。
图5 - 1中显示了I P v 6头的格式。下一节中提供了I P v 6头与I P v 4头字段间更加详细的比较。
后面的三个字段是数据报I D、分段标志和分段偏移值,它们都用于I P v 4数据报的分段。
由于I P v 6中由源结点取代中间路由器来进行分段(后面将有更多关于分段的内容),这些字段在I P v 6中变得不重要,并被I P v 6从包头中去掉了。
而生存期字段,正如上面所述,变成了跳极限字段。生存期字段最初表示的是一个包穿越I n t e r n e t时以秒为单位的存在时间的上限。如果生存期计数值变为0,该包将被丢弃。其原因是包可能会存在于循环路由中,如果没有方法让它消失,它可能会一直选路(或者直到网络崩溃为止)。在最初的规范中要求路由器根据转发包的时间与收到包的时间的差值(以秒为单位)来减小生存期的值。在实际情况中,大部分路由器都设计为每次对该值减1,而不是计算路由器上真正的处理时间。
协议字段,如前所述,指出在I P v 4包中封装的高层协议类型。各协议对应的数值在最新版本的R F C (现在是RFC 1700)中可以查到。这个字段后来发展成为I P v 6中的下一个头字段,其中定义了下一个头是一个扩展头字段还是另一层的协议头。
由于如T C P和U D P等高层协议均计算头的校验和, I P v 4头校验显得有些多余,因此这个字段在I P v 6中已消失。对于那些真的需要对内容进行身份验证的应用, I P v 6中提供了身份验证头。
I P v 6中仍然保留了3 2位的I P v 4源地址和目的地址,但将它们扩展为1 2 8位。而I P选项字段则已经彻底消失,取而代之的是I P v 6扩展头。