扩展头部
在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实现。路由、时间戳、分片和超大分组等功能都在IPv6扩展头部中实现,因此没有为这些特殊功能在IPv6的基本头部分配相应的位。基于这种设计,IPv6头部固定为40字节,扩展头部仅在需要时添加。通常情况下,扩展头部仅由终端主机处理。IPv6的格式特点一定程度上简化了高性能路由器的设计和实现,因为IPv6路由器处理分组所需的命令比IPv4简单。
扩展头部和更高层协议(如TCP和UDP)头部与IPv6头部链接起来构成级联的头部。每个头部中的下一个头部字段标识紧跟着的头部的类型,常见的有逐跳选项、路由选项、分片选项、TCP、UDP和ICMPv6等。下一个头部字段的可能值定义在[IP6PARAM]中,一部分如下:
IPv6选项
逐跳选项和目的地选项
相对于IPv4,IPv6提供了一种更灵活和可扩展的方式,将扩展和选项相结合。IPv6可变长度的扩展头部或编码在特殊扩展头部中的选项可适应当前更大的Internet。如果选项存在,可放入逐跳选项(与一个数据报传输路径上的每个路由器相关)或目的地选项(仅与接收方相关)。逐跳选项是唯一由分组经过的每个路由器处理的选项,它和目的地选项头部的出现可以超过一次。两者的编码格式都相同,如下图所示:
TLV选项中的动作子字段的识别规则如下所示:
值 | 动作 |
---|---|
00 | 跳过选项,继续处理 |
01 | 丢弃数据报 |
10 | 丢弃数据报,并向源地址发送一个“ICMPv6参数问题”消息 |
11 | 与10相同,但仅在分组的目的地不是组播时,发送这个ICMPv6消息 |
如果一个发往组播目的地的数据报中包含一个未知选项,那么大量节点将生成返回源节点的流量。这可通过将动作子字段设置为11来避免。这样设置的好处是,一个新的选项可携带在一个数据报中,并被哪些无法理解它的路由器忽略,这样有助于促进新选项的增量部署。
改变位字段(图中的Chg)的作用是当选项数据在数据报转发过程中改变时提示(置为1)。
选项定义
IPv6选项已经被标准化定义,如下:
选项名 | 头部 | 动作 | 改变 | 类型 | 长度 |
---|---|---|---|---|---|
填充1 | HD | 00 | 0 | 0 | N/A |
填充N | HD | 00 | 0 | 1 | 可变 |
超大有效载荷 | H | 11 | 0 | 194 | 4 |
隧道封装限制 | D | 00 | 0 | 4 | 4 |
路由器警告 | H | 00 | 0 | 5 | 4 |
快速启动 | H | 00 | 1 | 6 | 8 |
CALIPSO | H | 00 | 0 | 7 | 8+ |
家乡地址 | D | 11 | 0 | 201 | 16 |
填充1和填充N
由于IPv6选项需要与8字节的偏移量对齐,因此较小的选项用0填充到满足长度为8字节。填充1选项(类型0)是唯一缺少长度字段和值字段的选项,它仅有1字节长,取值为0。填充N选项(类型1)向头部的选项区域填充2字节或更多字节,并使用TLV的格式。对于n各填充字节,选项数据长度字段包含的值为 (n-2)。
IPv6超大有效载荷
在某些TCP/IP网络中(例如用于互连超级计算机的网络),由于正常的64KB的IP数据报大小限制,在传输大量数据时会导致不必要的开销。IPv6超大有效载荷选项指定了一种有效载荷大于普通MTU的IPv6数据报,称为超大报文。这个选项无法由MTU小于64KB的链路连接的节点来实现。超大有效载荷选项提供了一个32位的字段,用于携带有效载荷在65536~4294967295字节之间的数据报。当一个用于传输的超大报文形成时,其正常负载长度字段被设置为0。并且在上层协议(例如TCP)中使用Internet校验和算法应计算来自选项的长度值而不是基本头部中的长度字段值。
隧道封装限制
隧道是指将一个协议封装在另一个协议中,例如IP数据报可能被封装在另一个IP数据报的有效载荷部分。隧道可用于型号才能虚拟的覆盖网络,在覆盖网络中,一个网络可作为另一个IP的链路层使用。隧道可以嵌套,为让发送者控制最终用于封装的隧道层次,定义了隧道封装限制选项。这个选项的工作原理类似于IPv4的TTL和IPv6的跳数限制字段。
路由器警告
路由器警告选项指出数据报包含需要路由器处理的信息,它与IPv4的路由器警告选项相同。
快速启动
快速启动(QS)选项和[RFC4782]定义的TCP/IP“快速启动”程序配合使用。选项包括发送者需要的以比特/秒为单位的传输速率的编码值、QS TTL值和一些额外信息。如果沿途的路由器认为可以接受所需的速率,在这种情况下他们将递减QS TTL,并在转发数据报时保持所需的速率不变。如果路由器无法满足,则会将速率减小到一个可以接受的值。若路由器无法识别QS选项,则不递减QS TTL。接收方将向发送方提供反馈,包括接收到的数据报的IPv4 TTL或IPv6跳数限制字段和自己的QS TTL之间的差异,以及获得的速率可能被沿途的路由器所调整。这个消息将被发送方用于确定发送速率。对TTL值进行比较的目的是确保沿途每台路由器参与QS谈判。如果发现任何路由器递减IPv4 TTL或IPv6跳数限制字段,但没有修改QS TTL值,则说明它没有启用QS。
家乡地址
当使用IPv6移动选项时,这个选项保存发送数据报的IPv6节点的“家乡”地址。该选项允许移动节点提供自己正常的家乡地址以及它在漫游时的新地址(通常是临时分配)。当其他IPv6节点需要与移动节点通信时,它可以使用该节点的家乡地址。另外IPv6还定义如果家乡地址选项存在,包含它的目的地选项头部必须出现在路由头部之后,并且在分片、认证和ESP头部之前(如果这些头部也存在)。
路由头部
IPv6路由头部(Routing Header)为发送方提供了一种IPv6数据报控制机制,以控制(至少部分控制)数据报通过网络的路径。路由扩展头部有类型0(RH0)和类型2(RH2)两个不同版本,前者处于安全方面的考虑已被标准化组织否决。
IPv6路由头部在转发过程中不会处理,直至目的IP地址字段中包含的地址所在的节点。这个过程中,剩余部分字段用于确定来自地址向量的下一跳地址,并将该地址与IPv6头部中的目的地址字段交换。因此,在这个数据报转发过程中,剩余部分字段将会变得越来越小。
分片头部
分片头部(Fragment Header)用于IPv6源节点向目的地发送一个大于路径MTU的数据报。1280字节是整个网络中针对IPv6定义的链路层最小MTU。在IPv6中,仅数据报的发送者可以执行分片操作,这点与IPv4不同。
分片头部包括的信息与IPv4头部中的相同,只不过标识符字段是32位,更大的标识符字段提供了切分更多分片的能力。
如果M位字段设置为0,表示该分片是原始数据报的最后一个分片。在分片过程中,输入的数据报称为“原始数据报”,它由两部分组成:“不可分片部分”和“可分片部分”。前者包括IPv6头部和任何在到达目的地之前需由中间节点处理的扩展头部(即包括路由头部之前的所有头部,如果有逐条选项扩展头部,则是该头部之前的所有头部)。后者包括数据报的其余部分(即目的地址选项头部、上层头部和有效载荷数据)。
当原始数据报被分片后,将会产生多个分片,其中每个分片都包含一个原始数据报中不可分片部分的副本,但是需要修改每个IPv6头部的负载长度字段,以反映它所描述的分片的大小。在不可分片部分之后,每个新的分片都包含一个分片头部,其中包含一个分片相应的分片偏移字段,记录每个分片的数据在原始数据中的位置(偏移量),以及一个原始分组的标识符字段的副本。
分片头部中的偏移量字段以8字节为单位,因此分片需要在8字节的边界处进行。因此除了最后一个分片之外的所有分片都必定是8字节的倍数。接收方在对分片进行重组之前,必须确保已接收原始数据报的所有分片。与IPv4分片一样,分片可能不按顺序到达接收方,但需要按顺序重组为一个数据报。
本文内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》