IPv6扩展头部

IPv6扩展头部详解
IPv6使用扩展头部实现IPv4选项的功能,如路由、分片等。扩展头部仅在需要时添加,简化了路由器处理。内容包括逐跳选项、目的地选项、路由头部、分片头部的详细解释,讨论了IPv6的超大有效载荷、隧道封装限制、路由器警告等特性。

扩展头部

        在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实现。路由、时间戳、分片和超大分组等功能都在IPv6扩展头部中实现,因此没有为这些特殊功能在IPv6的基本头部分配相应的位。基于这种设计,IPv6头部固定为40字节,扩展头部仅在需要时添加。通常情况下,扩展头部仅由终端主机处理。IPv6的格式特点一定程度上简化了高性能路由器的设计和实现,因为IPv6路由器处理分组所需的命令比IPv4简单。


扩展头部和更高层协议(如TCP和UDP)头部与IPv6头部链接起来构成级联的头部。每个头部中的下一个头部字段标识紧跟着的头部的类型,常见的有逐跳选项、路由选项、分片选项、TCP、UDP和ICMPv6等。下一个头部字段的可能值定义在[IP6PARAM]中,一部分如下:


IPv6拓展头部机制将一些功能(例如路由和分片)与选项加以区分。除了“逐跳选项”的位置是强制确定之外,扩展头部的顺序是建议性的。只有“目的地选项”头部可以使用两次,第一次是指出包含在IPv6头部中的目的地址,第二次(位置8)是关于数据报的最终目的地。在某些情况下(例如使用路由头部),当数据报被转发到最终目的地时,IPv6头部中的目的IP地址字段将会改变。

IPv6选项

逐跳选项和目的地选项

相对于IPv4,IPv6提供了一种更灵活和可扩展的方式,将扩展和选项相结合。IPv6可变长度的扩展头部或编码在特殊扩展头部中的选项可适应当前更大的Internet。如果选项存在,可放入逐跳选项(与一个数据报传输路径上的每个路由器相关)或目的地选项(仅与接收方相关)。逐跳选项是唯一由分组经过的每个路由器处理的选项,它和目的地选项头部的出现可以超过一次。两者的编码格式都相同,如下图所示:


逐跳选项和目的地选项编码为TLV集合。第一字节给出了选项类型,包括一些子字段,在选项没被识别时只是一个IPv6节点如何动作,以及在数据报转发时选项数据是否改变。选项数据长度字段给出了选项数据的字节长度。

TLV选项中的动作子字段的识别规则如下所示:

动作子字段识别规则
动作
00跳过选项,继续处理
01丢弃数据报
10丢弃数据报,并向源地址发送一个“ICMPv6参数问题”消息
11与10相同,但仅在分组的目的地不是组播时,发送这个ICMPv6消息

如果一个发往组播目的地的数据报中包含一个未知选项,那么大量节点将生成返回源节点的流量。这可通过将动作子字段设置为11来避免。这样设置的好处是,一个新的选项可携带在一个数据报中,并被哪些无法理解它的路由器忽略,这样有助于促进新选项的增量部署。

改变位字段(图中的Chg)的作用是当选项数据在数据报转发过程中改变时提示(置为1)。

选项定义

IPv6选项已经被标准化定义,如下:

IPv6选项定义
选项名头部动作改变类型长度
填充1HD0000N/A
填充NHD0001可变
超大有效载荷H1101944
隧道封装限制D00044
路由器警告H00054
快速启动H00168
CALIPSOH00078+
家乡地址D11020116

填充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版》

IPv6扩展报头是IPv6协议中用于提供可选功能的重要机制,它将IPv4中固定字段和可变字段分离,使得IPv6头部结构更加简洁,同时将可选功能集中到扩展报头中处理。扩展报头的使用提高了网络对确实需要选项的数据包的处理能力,同时也保持了大多数无选项数据包的高效传输。 ### IPv6扩展报头的结构 IPv6扩展报头由多个字段组成,通常包括以下基本结构: - **下一头部(Next Header)**:8位字段,指明当前扩展报头之后的头部类型,例如TCP、UDP或下一个扩展报头。 - **头部扩展长度(Header Extension Length)**:8位字段,表示扩展报头的长度,单位为8字节块,不包括第一个8字节。例如,如果该字段值为0,则表示扩展报头总长度为8字节(即仅包含基本头部)。 - **选项字段(Options)**:可变长度字段,根据扩展报头的类型包含不同的选项数据。 IPv6扩展报头的顺序是固定的,依次为: 1. IPv6头部 2. 逐跳可选项(Hop-by-Hop Options) 3. 路由选择(Routing) 4. 分段可选项(Fragment) 5. 认证可选项(Authentication Header) 6. 封装安全有效负载(Encapsulating Security Payload) 7. 目的地可选项(Destination Options) 8. 上层协议头部 ### IPv6扩展报头的类型 IPv6定义了多种扩展报头,用于实现不同的功能: 1. **逐跳可选项(Next Header值为0)**:包含数据包路径上每个节点都必须处理的信息。例如,巨型净荷选项用于标识净荷长度超过65535字节的数据包。如果节点无法处理此类包,必须返回ICMPv6错误信息[^1]。 2. **路由选择(Next Header值为43)**:用于指定数据包在到达目的地过程中必须经过的中间节点列表。IPv6头部中的目的地址可能是路由选择头部中的第一个地址,而非最终目的地。 3. **分段可选项(Next Header值为44)**:用于在发送节点对数据包进行分段,并在接收端重组。IPv6路由器不进行分段操作,因此发送节点需要使用路径MTU发现机制(Path MTU Discovery, PMD)来确定路径的最小MTU值,或发送不超过1280字节的数据包,以确保链路兼容性。 4. **封装安全有效负载(ESP,Next Header值为50)**:用于加密数据包的有效负载,确保数据的机密性。 5. **身份验证头(AH,Next Header值为51)**:用于对IPv6头部扩展头部和有效负载的某些部分进行加密校验,确保数据完整性和源身份认证。 6. **目的地可选项(Next Header值为60)**:包含仅由最终目的地节点处理的信息。目前定义的选项包括填充选项,用于将头部填充至64位边界,以便未来扩展使用[^1]。 7. **没有下一头部(Next Header值为59)**:用于标识扩展报头结束,通常作为最后一个扩展报头的“下一头部”值[^1]。 ### IPv6扩展报头的使用方法 IPv6扩展报头的使用方式取决于具体的应用场景。例如,在需要源路由的情况下,可以添加路由选择扩展头,并在其中列出数据包需要经过的中间节点地址。发送节点负责对需要分段的数据包进行分段,并在分段扩展头中记录分段偏移和标识信息。对于需要加密或认证的数据包,可以使用ESP或AH扩展头。 在编程层面,例如设置逐跳可选项扩展头(HBH),可以通过设置socket选项来实现。例如,在Linux系统中,可以使用`setsockopt()`函数设置`IPV6_HOPOPTS`选项,指定扩展头部的数据缓冲区和长度。示例代码如下: ```c struct iovec iov; struct hopopt_hdr { uint8_t next_header; uint8_t hdrlen; uint8_t options[24]; // 例如填充24字节的选项数据 }; struct hopopt_hdr hbh_hdr = {0}; hbh_hdr.next_header = IPPROTO_TCP; // 设置下一头部为TCP hbh_hdr.hdrlen = 3; // 3 * 8 字节 = 24字节,加上8字节的基本头部,总长度为32字节 // 填充选项数据... // ... // 设置socket选项 setsockopt(fd, IPPROTO_IPV6, IPV6_HOPOPTS, &hbh_hdr, sizeof(hbh_hdr)); ``` 上述代码片段展示了如何为IPv6 socket设置逐跳可选项扩展头,使得数据包在传输过程中可以携带额外的控制信息[^3]。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值