IPV4
I P数据报非常简单,就是在数据块(称为净荷)的前面加上一个包头。I P数据报中的数据(包括包头中的数据)以3 2位( 4字节或4个八位组)的方式来组织。图2 - 3中展示了I P头字段的排列。从中可以看出,所有I P数据报头最小长度是5个字( 2 0字节),如果有其他选项的话,包头可能会更长。
1. IP头字段
I P v 4头字段包括:• 版本:这个4位字段指明当前使用的I P版本号。这是要处理的第一个字段,因为接收方必须了解如何解释包头中的其余部分。
• 头长度: I P v 4的头长度的范围从5个4字节字到1 5个4字节字。头长度指明头中包含的4字节字的个数。可接受的最小值是5,最大值是1 5 (意味着包头有6 0字节长而选项占了其中4 0个字节)。
• 服务类型:这8位中只有前4位用来作为I P路由器的服务类型( TO S )请求。一个TO S位表示对如何处理数据报的优先选择:延时、吞吐量、可靠性或代价。在请求中把延时位置位意味着需要最小的延时;把吞吐量位置位意味着需要最大的吞吐量;把可靠性位置位意味着需要最高的可靠性。TO S在I P v 4中的应用并不广泛,其原因将在第3章中讨论。由于通常对于路由没有选择余地,这些只是要考虑的建议,这些位由高层应用协议自动设置为合适的值。例如,远程网络会话要求最小延时,而文件传输要求最大吞吐量。
• 数据报长度:指的是包括包头在内的整个数据报的长度。该字段为1 6位,限定了I P数据报的长度最大为65 536字节。这个字段的必要性在于I P中没有关于“数据报结束”的字
符或序列。网络主机可以使用数据报长度来确定一个数据报的结束和下一个数据报的开始。
• 数据报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地址。
2. IP 选项
顾名思义,I P选项是可选的且不经常使用,而且它们在I P v 6中的形式根本不同。在I P v 4中,I P选项主要用于网络测试和调试。可用的选项大多与选路有关。例如,有的选项允许发送方指定数据报必须经过的路由,换句话说,定义了由哪些路由器来处理该数据报。还有的选项要求中转路由器记录其I P地址为数据报打上时间戳。一些选项,尤其是指出数据报必须经过哪些I P地址的报文要求在选项后附加一些数据。
指定路由、记录路由器或增加时间戳等选项增加了I P头的长度。如果使用的话, I P选项会以没有间隔字符的方式串在一起,如果它们的结尾不在字边界,即字节数不是4字节的整数倍,还将会加上填充数据。正如上述对头长度字段的描述,选项字段可以包括不超过4 0字节的选项和选项数据。I P v 4的选项将在第3章中详细描述。
IPV6
在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头字段间更加详细的比较。
IPv4与IPv6的比较
先回顾一下图2 - 3中定义的I P v 4头。尽管这些头字段中有一些与I P v 6头类似,但其中真正完全保持不变的只有第一个字段,即版本字段,因为在同一条线路上传输时,必须保证I P v 4和I P v 6的兼容性。下一个字段,即包头长度,则与I P v 6无关,因为I P v 6头是固定长度, I P v 4中需要这个字段是因为它的包头可能在2 0字节到4 0字节间变化。服务类型字段与I P v 6的流类别字段相似,但TO S的位置比该字段要靠后一些,而且在具体实现中也没有广泛应用。下一个字段是数据报长度,后来发展成了I P v 6中的净荷长度。I P v 6的净荷长度中包含了扩展头,而I P v 4数据报长度字段中则指明包含包头在内的整个数据报的长度。这样一来,在I P v 4中,路由器可以通过将数据报长度减去包头长度来计算包的净荷长度,而在I P v 6中则无须这种计算。
后面的三个字段是数据报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扩展头。