路径MTU
路径MTU是源和目的间所有链路MTU中最小的MTU值。发送节点使用ICMPv6包过大信息发现路径MTU。
1. 发送节点将路径MTU设为发送通信的接口连接链路的MTU。
2. 发送节点发送路径MTU大小的数据包。
3. 如果某个中继路由因为转发链路的MTU值小于数据包大小,则会丢弃数据包并发送ICMPv6包过大信息给发送节点,在包过大信息中包含了转发失败那条链路的MTU值。
4. 重复步骤2到4。
当收到从目的地址发送的ACK包时则路径MTU确定。
多播监听发现
MLD是路由器和节点间交换信息的一组方法,由RFC 2710定义,允许路由器发现各接口监听的多播地址集。和IGMPv2类似,MLD仅发现那些至少有一个监听者的多播地址列表,而不是每个多播地址的多播监听者列表。
和IGMPv2不同的是,MLD使用ICMPv6信息代替专有信息结构。包括ICMPv6信息的130,131和132类型:
l 多播监听质询(Multicast Listener Query)
路由器使用多播质询来获取一条链路上的多播监听者。存在两种质询信息:普通质询(General Query)和多播地址质询(Multicast-Address-Specific Query)。前者用于获取所有多播地址的监听者,后者用于获取某个多播地址的监听者。
l多播监听报告(Multicast Listener Report)
多播监听者使用多播监听报告来报告正在监听的多播通信情况,或者回应多播监听质询。
l多播监听完成(Multicast Listener Done)
多播监听者使用多播监听完成来报告其对某个特定的多播地址不在感兴趣。
下图是MLD信息包的结构:
一个MLD信息包由IPv6包头,下一跳选项扩展头和MLD信息组成。RFC 2711规定下一跳选项扩展头中必须包括IPv6路由器警报选项(Router Alert Option),用来确保路由器处理发送到它不监听的多播地址的MLD信息。
多播监听质询
MLD多播监听质询信息等同于IGMPv2的主机成员请求(Host Membership Query)信息。
在IPv6包头中,源地址是发送请求的端口的本地链路地址,跳数限制置为1。对普通质询,目的地址是包括本地链路范围内所有节点的多播地址(FF02::1);对多播地址质询,目的地址是欲质询的多播地址。
下面是MLD多播监听质询信息的结构:
MLD多播监听质询信息的类型字段置为130,code字段置为0。校验值后是16位最大响应延迟,是等待MLD多播监听报告信息的超时时间,随后是16位的保留字段。最后的多播地址字段,普通质询信息包会置为未指明地址(::);多播地址质询会置为欲质询地址。
多播监听报告
MLD多播监听报告信息等同于IGMPv2的主机成员报告(Host Membership Report)信息。
在IPv6包头中,源地址是发送报告的端口的本地链路地址,跳数限制置为1。目的地址是欲报告的多播地址。
下面是多播监听报告信息的结构:
MLD多播监听报告信息的类型字段置为131,code字段置为0。校验值之后的最大响应延迟在多播监听报告信息包中置为0,最后的多播地址是欲报告的多播地址。
多播监听完成
MLD多播监听完成等同于IGMPv2的离开组(Leave Group)信息。
在IPv6包头中,源地址是发送报告的端口的本地链路地址,跳数限制置为1。目的地址是包含本地链路范围内所有路由器的多播地址(FF02::2)。
下面是MLD多播监听完成信息的结构:
MLD多播监听完成信息的类型字段置为132,code字段置为0。校验值后的最大响应延迟依旧置为0,最后的多播地址是发送节点不在监听的多播地址。
ICMPv6头的前一包头或扩展头的下一头字段值为58。
下面是ICMPv6的结构:
Type-显示信息类型,8位。
Code-区分同一信息类型的多个信息,8位,如此类型信息仅有一个,置为0。
Checksum-信息的校验值。
Message body-包含ICMPv6信息的特殊数据。
ICMPv6错误信息
为减小带宽损耗,ICMPv6的错误并不发送发生的每个错误,而是有限速(rate limited)。限速或者基于时间(每个源在每T毫秒[建议值为1000]内发送一个错误信息),或者基于带宽利用率(每个接口发送的错误信息速率不能超过链路带宽的P%[建议值为2])
目的地不可达
当数据包不能被转发或送达到目的地时发送目的地不可达的ICMPv6包。
下图是目的地不可达信息的结构:
目的地不可达包的类型字段置为1,code字段从0到4。在校验值后是32位的保留字段,然后是被丢弃数据包的节选,makes the entire IPv6 packet containing the ICMPv6 message no larger than 1280 bytes (the minimum IPv6 MTU).一个没有扩展头的ICMPv6数据包,丢弃数据包部分将有1280字节(1280字节减去40字节的IPv6头和8字节的ICMPv6目的地不可达头)。
下面是code字段不同值的含义
Code value | Description |
0 | 路由表中没有匹配目的地的路由项。 |
1 | 与目的地的通信被管理策略禁止。仅用于数据包被防火墙丢弃。 |
2 | The address is beyond the scope of the source address. |
3 | 目的地不可达。一般是无法解析目的节点的链路层地址。(已到达目的子网) |
4 | 端口不可达。例如一个UDP包到达目的地址但没有应用程序监听此UDP端口。 |
包过大
当转发链路的MTU值小于数据包的大小时将发送一个ICMPv6包过大信息。
下面是CMPv6包过大信息的结构:
包过大的类型字段置2,code字段置0,校验值后是32位的MTU,保存转发链路的MTU值,最后的丢弃数据包部分与目的地不可达信息的一致。
超时
当数据包的跳数限制字段(和TTL类似的Hop Limit字段)为0是发送超时信息。
下图是超时信息的结构:
超时信息的类型字段置3,code字段置0(当跳数限制字段为0)或1(目的地重组碎片超时),校验值后的保留字段和丢弃包部分与目的地不可达信息的一致。
参数错误
当IPv6的包头或扩展头中有错误时发送参数错误信息,避免进行进一步的处理。
下面是ICMPv6参数错误信息的结构:
参数错误信息的类型字段置4,code字段从0到2。校验值后是32位的指示(Pointer)字段,标识错误发生地方的字节偏移量,随后的丢弃数据包与前文一致。
下面是code字段不同值的含义:
Code value | Description |
0 | 包头或某个扩展头的某个字段有错误。 |
1 | 一个不可识别的下一头区域值。等同于IPv4的目的地不可达-协议不可达(Destination Unreachable-Protocol Unreachable)信息。 |
2 | 一个不可识别的IPv6选项。 |
ICMPv6报告信息
回写请求
回写请求/回应信息用来检查可连通性和路由问题,回写请求信息发送给目的地请求回写回应信息。
下面是回写请求信息的结构:
回写请求的类型字段置为128,code字段置为0,校验值后是16位标识字段和16位序列号字段,被发送主机用以匹配收到的回写回应信息。最后的Data字段可以是任意的0或多个字节。
回写回应
下面是回写回应信息的结构:
回写回应信息的类型字段置129,code字段置0,校验值后也是16的标识字段和16位的序列号字段,最后的数据字段要和回写请求信息的数据字段内容一致。
Value (in decimal) | Header |
0 | Hop-by-Hop Options Header |
6 | TCP |
17 | UDP |
41 | Encapsulated IPv6 Header |
43 | Routing Header |
44 | Fragment Header |
46 | Resource ReSerVation Protocol |
50 | Encapsulating Security Payload |
51 | Authentication Header |
58 | ICMPv6 |
59 | No next header |
60 | Destination Options Header |
比较IPv4和IPv6的头
IPv4 Header Field | IPv6 Header Field |
版本 | 同样字段但值不同 |
包头长度 | 没有,包头长度恒定为40字节 |
TOS | 被Traffic Class field替代 |
数据包全长 | 被负载长度取代,没有全长字段 |
Identification | 从包头去处,包含在分片扩展头中 |
TTL | 被Hop Limit字段取代 |
Protocol | 被Next Header字段取代(没有扩展头是和Protocol一样) |
包头校验值 | 去除,全包的比特级纠错由链路层完成 |
Source Address | 一样,除了长度 |
Destination Address | 一样,除了长度 |
Options | 去处,被扩展头取代 |
IPv6扩展头
IPv4包头包括所有可选项,路由器需要检查它们,影响转发效率。在IPv6中,传输和转发选项都移到了扩展头中,每个中继路由器必须处理的扩展头只有一个,就是下一跳选项(Hop-by-Hop Options)扩展头,加快了包头处理速度,并提高了转发效率。
RFC 2460定义了下列扩展头,所有的IPv6节点都必须支持:
l 下一跳选项头
l目的选项头(Destination Options header)
l路由头(Routing header)
l分片头(Fragment header)
l验证头(Authentication header)
lESP头(Encapsulating Security Payload header)
一个标准IPv6的数据包不含扩展头,但如果中继路由器或目的要求特殊处理,发送主机会添加一个或多个扩展头。每个扩展头长度必须是8字节的倍数,如果不够,就填充。
下图是几个示例:
扩展头顺序
扩展头是按顺序进行处理的。因为下一跳选项头是要被所有中继节点处理的,所以它必须是第一个,对其他扩展头这一原则同样使用,RFC 2460规定了以下扩展头的排列顺序:
1.下一跳选项头
2.目的选项头(当路由头存在时供中继目的使用)
3.路由头
4.分片头
5.认证头
6. ESP头
7.目的选项头(供最终目的使用)
IPv6 MTU
IPv6要求链路层最小必须支持1280字节的数据包。如果不能支持,则需要提供链路层的分片和重组机制。如果链路层支持可配置的MTU大小,IPv6推荐配置为最少1500字节(也就是以太网封装的IPv6 MTU),一个可配置MTU的例子是PPP链路的MRU(Maximum Receive Unit)。
和IPv4类似,IPv6使用ICMPv6的数据包过大(Packet Too Big)信息来发现路径MTU(Path MTU Discovery)。
IPv6源主机可以利用分片扩展头将超过路径MTU大小的上层PDU负载分片。IPv6节点必须能重组1500字节以上的碎片包。
ICMPv6
同IPv4一样,IPv6使用ICMP,不过同IP一样升级到了版本6。继承了大部分IPv4 ICMP功能,报告传输或转发错误,并为排错提供简单的回写服务。
ICMPv6协议提供了如下框架:
l多播监听发现(Multicast Listener Discovery, MLD)
MLD是3种ICMPv6信息的集合,用以取代IPv4的IGMPv2,管理子网内的多播成员。
l邻居发现(Neighbor Discovery, ND)
ND是5种ICMPv6信息的集合,管理同一链路上的点到点通信。邻居发现取代ARP、ICMPv4路由发现和ICMPv4重定向信息。
ICMPv6信息类型
l错误信息
目的节点或中继路由使用错误信息报告IPv6数据包在传输或转发过程中的错误。ICMPv6错误信息的8位类型字段值从0到127(最高位置0)。ICMPv6错误信息包括目的不可达、包过大、超时和参数错误(Destination Unreachable, Packet Too Big, Time Exceeded, and Parameter Problem)。
l报告信息
报告信息用来提供各种功能的诊断信息,例如MLD和ND。ICMPv6报告信息的8位类型字段值从128到255(最高位置1)。ICMPv6报告信息包括回写请求和回写回应(Echo Request and Echo Reply)。
IPv6和DNS
RFC 1886定义了为IPv6设计的增强型DNS,增强了两个新组件:
l主机地址资源记录(Host address(AAAA) resource record)
l反向解析的IP6.ARPA域(IP6.ARPA domain for reverse queries)
注意:RFC 3152中的IP6.ARPA取代了RFC 1886的IP6.INT。
主机地址资源记录
一个新的DNS资源记录类型,AAAA(念做“quad A”)被用来解析完全限定域名(fully qualified domain name)到IPv6地址。例如
host1.microsoft.com IN AAAA FEC0::2AA:FF:FE3F:2A1C
IP6.ARPA域
IP6.ARPA域被用来创建IPv6的反向解析。为反向解析提供名称空间,在分层反向域名中,地址中的每个16进制数将被完全倒置。例如,FEC0::2AA:FF:FE3F:2A1C的反向查找域名名称(reverse lookup domain name)是:
C.1.A.2.F.3.E.F.F.F.0.0.A.A.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.C.E.F.IP6.ARPA.
源和目的地址选择
与IPv4不同,IPv6主机普遍的拥有多个地址,使得DNS名称请求回应信息(DNS Name Query Response message)中有多个IP地址,使得通信时源和目的地址的选择更加复杂。一般而言,通过范围和目的选择地址。
RFC 3484定义要求一下算法:
l源地址选择算法选择与目的地址最合适的源地址
l目的地址选择算法列出一个可能目的地址的列表,并按优先级排序
IPv4和IPv6的地址等价
IPv4 Address | IPv6 Address |
多播地址 (224.0.0.0/4) | 多播地址(FF00::/8) |
多播地址 | 没有 |
未指明地址是0.0.0.0 | 未指明地址是:: |
回环地址是127.0.0.1 | 回环地址是::1 |
公用IP地址 | 全局单播地址 |
自有IP地址(10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16) | 本地网络地址 (FEC0::/10) |
自配置地址 (169.254.0.0/16) | 本地链路地址 (FE80::/64) |
书写方式:点分十进制 | 书写方式:冒号-16进制,前缀0压缩,IPv4兼容地址依旧使用点分十进制表示 |
网络位表示:点分十进制或前缀长度表示 | 网络位表示:仅支持前缀长度表示 |
IPv6头
IPv6头中去掉了IPv4里不常用的字段,提供更好的实时通信(real-time traffic)。
IPv6数据包结构
下面是IPv6的数据包结构:
IPv6头
固定长度40个字节,细节后面介绍
扩展头(Extension Headers)
支持0或多个变长的扩展头。IPv6头中的下一头地址(Next Header)字段标明了下一个扩展头,然后每个扩展头都有下一头地址字段标明下一个扩展头,最后一个扩展头的此字段用以标识负载内的上层协议(例如TCP,UDP或者ICMPv6)。
IPv6的扩展头取代IPv4头的可选字段,使IPv6能更好的支持未来的需求。与IPv4的可选字段不同,IPv6的扩展头没有大小限制,可以任意扩展。
上层协议数据单元
上层协议数据单元(PDU)通常包含上层协议头和它的负载(例如ICMPv6、UDP或TCP)。
IPv6数据包的负载包括IPv6的扩展头和上层PDU,一般的,支持65545字节大小,如果负载超过,需要使用Jumbo Payload option in the Hop-by-Hop Options extension header。
IPv6头
下图是RFC 2460定义的IPv6头结构
各字段含义如下:
Vision-4位的IP协议版本号,置为6
Traffic Class-数据包优先级,8位,类似IPv4的TOS,由RFC 3697定义。
Flow Label-标识数据包是从哪儿到哪儿的,需要中间路由器的支持,20位。用于标识那些需要特殊处理的数据通信,例如实时数据,默认置为0。同一源和目的间可能有多个流,使用不同的Flow标识进行区分。
Payload Length-显示IPv6的负载大小,16位,因此负载最大为65535字节,超过此大小,the Payload Length field is set to 0 and the Jumbo Payload option is used in the Hop-by-Hop Options extension header.
Next Header-显示第一个扩展头(如果有)或者上层PDU协议号,8位。使用的上层协议号和IPv4一致。
Hop Limit-定义数据包能经过最大路由跳数,类似IPv4的TTL,8位。当Hop Limit等于0,数据包将被丢弃,并发送一个ICMPv6超时信息(Time Exceeded message)给源地址。
Source Address-源地址,128位
Destination Address-目的地址,128位。大多数时候目的地址是最终目的地址,但如果源路由扩展头(Routing extension header)存在,目的地址可能是源路由列表的下一路由接口。(还是支持源路由)