网络网络层之(6)ICMPv6协议
Author: Once Day Date: 2024年6月2日
一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…
漫漫长路,有人对你微笑过嘛…
全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSDN博客。
参考文章:
- 《TCP/IP详解卷一》
- RFC 4443 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification
(ietf.org)- RFC 4861: Neighbor Discovery for IP version 6 (IPv6) (rfc-editor.org)
- RFC 4884 - Extended ICMP to Support Multi-Part Messages (ietf.org)
- TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议 - 野兽’ - 博客园 (cnblogs.com)
- ICMPv6报文详解-CSDN博客
- IPv6/ICMPv6-原理介绍+报文分析+配置示例_ipv6地址获取过程报文交互-CSDN博客
- IP报文格式大全(html) - 华为 (huawei.com)
- TCP/IP卷一:44—ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_大量的icmpv6报文-CSDN博客
- IPv6基础篇(三):ICMPv6的整体介绍 - 知乎 (zhihu.com)
文章目录
- 网络网络层之(6)ICMPv6协议
- 1. 概述
- 1.1 ICMPv6介绍
- 1.2 相关RFC文档
- 2. 报文格式
- 2.1 ICMPv6首部
- 2.2 ICMPv6报文类型
- 2.3 ICMPv6常见代码
- 2.4 ICMPv6差错报文限制
- 3. ICMPv6基础消息
- 3.1 ICMPv6目的不可达
- 3.2 ICMPv6报文太大
- 3.3 ICMPv6超时报文
- 3.4 ICMPv6参数问题
- 3.5 ICMPv6请求和回复
- 4. ICMPv6网络控制消息
- 4.1 本地代理地址发现请求和应答
- 4.2 移动前缀请求和通告
- 4.3 组播侦听查询、报告和完成
- 4.4 组播侦听发现
- 4.5 组播路由器发现
- 5. ICMPv6邻居发现类消息
- 5.1 ICMPv6邻居发现协议
- 5.2 ICMPv6重定向报文
- 5.3 路由器请求和通告
- 5.4 邻居请求和通告
- 5.5 反向邻居发现请求和通告
- 5.6 邻居不可达检测
- 6. ICMPv4和ICMPv6转换
- 6.1 从ICMPv4转到ICMPv6
- 6.2 从ICMPv6转到ICMPv4
- 7. 总结
1. 概述
1.1 ICMPv6介绍
ICMPv6是互联网控制消息协议第6版(Internet Control Message Protocol version 6)的缩写,它是IPv6协议族中的一个重要协议,与IPv4中的ICMPv4协议相对应。ICMPv6同样用于传递网络层的控制和错误信息,辅助IPv6协议完成高效、可靠的数据传输任务。
与ICMPv4类似,ICMPv6报文封装在IPv6数据报中进行传输。报文主要由报头和数据部分组成。报头包含了类型、代码和校验和等重要信息,用于识别报文的类型和检测传输错误,数据部分则携带了与具体报文类型相关的信息。
ICMPv6报文可以分为两大类:差错报告报文和信息报文。
(1) 差错报告报文用于向源节点通知在数据传输过程中遇到的各种错误情况:
- 目标不可达,数据包无法送达目标地址。
- 数据包过大,数据包长度超过了链路的MTU。
- 超时,数据包在网络中存在的时间超过限制。
- 参数问题,数据包中的某些字段存在错误或不支持。
(2) 信息报文则用于IPv6网络中的各种功能:
- 回显请求和应答,类似于ICMPv4中的ping,用于检测节点的可达性。
- 组成员关系查询和报告,用于IPv6组播管理,查询和维护组成员信息。
- 邻居发现,用于节点在本地链路上发现邻居节点,包括路由器发现、地址解析、重复地址检测等。
- 路由器重定向,类似于ICMPv4,路由器用它通知源节点有更好的路由路径。
与ICMPv4相比,ICMPv6在功能上有所增强,特别是在支持IPv6的新特性方面,如组播管理、邻居发现等。
1.2 相关RFC文档
以下是与ICMPv6相关的主要RFC文档列表:
-
RFC 2463 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification (1998),定义了ICMPv6协议的基本规范,包括报文格式、类型和代码等。
-
RFC 4443 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification (2006),更新和取代了RFC 2463,对ICMPv6进行了细化和完善。
-
RFC 4861 - Neighbor Discovery for IP version 6 (IPv6) (2007),定义了IPv6的邻居发现协议,包括路由器发现、前缀发现、地址解析等,邻居发现协议大量使用ICMPv6报文进行通信。
-
RFC 4884 - Extended ICMP to Support Multi-Part Messages (2007),扩展了ICMPv4和ICMPv6,支持多部分消息,增加了对大型诊断消息的传输能力。
-
RFC 4890 - Recommendations for Filtering ICMPv6 Messages in Firewalls (2007),为防火墙过滤ICMPv6报文提供了指导和建议,以提高IPv6网络的安全性。
-
RFC 5837 - ICMP Extensions for Multiprotocol Label Switching (2010),定义了用于MPLS的ICMPv4和ICMPv6扩展,支持MPLS网络的错误报告和诊断。
-
RFC 6437 - IPv6 Flow Label Specification (2011),重新定义了IPv6流标签的用途和处理规则。
-
RFC 7045 - Transmission and Processing of IPv6 Extension Headers (2013),规定了IPv6扩展头的处理规则和顺序。
-
RFC 7112 - Implications of Oversized IPv6 Header Chains (2014),分析了IPv6过长头部链对网络设备和协议处理的影响。
-
RFC 8335 - PROBE: A Utility for Probing Interfaces (2018),定义了一种探测接口的通用机制,使用ICMPv6回显请求进行探测。
2. 报文格式
2.1 ICMPv6首部
ICMPv6报文格式由类型、代码和校验和三个固定字段组成,后面紧跟与具体报文类型相关的数据部分。
字段说明:
-
ICMPv6报文位于0个或多个扩展头部之后,其中最后一个扩展头部包含值为58的下一个头部字段(Next Header)。
-
Type(类型,8位)标识ICMPv6报文的类型,不同的类型对应不同的报文格式和用途,如128表示回显请求,129表示回显应答等。ICMPv6类型报文从0127都是差错报文,从128255都是信息类报文。
-
Code(代码,8位)与类型字段一起标识ICMPv6报文的具体含义,同一类型的报文可能有多个代码值,表示不同的错误原因或附加信息。
-
Checksum(校验和,16位)用于检测报文在传输过程中是否出现错误,计算方法与ICMPv4类似,但有些不同,ICMPv6除了整个ICMP数据段,还要包含IPv6头部中的源和目的IPv6地址,长度和下一个头部字段。
-
Message Body(消息体):长度可变,携带与具体报文类型相关的数据,如错误信息、回显数据等,不同类型的报文有不同的消息体格式。
2.2 ICMPv6报文类型
ICMPv6的主要报文类型如下:
类型 | 名称 | RFC文档 | 用途描述 |
---|---|---|---|
1 | Destination Unreachable | RFC4443 | 目标不可达,用于通知源主机 |
2 | Packet Too Big | RFC4443 | 报文过大,需要分片但IPv6不允许中间设备分片 |
3 | Time Exceeded | RFC4443 | 超时,用于通知源主机 |
4 | Parameter Problem | RFC4443 | 参数问题,用于向源主机指出错误 |
100/101 | 为私人实验保留 | RFC4443 | 为实验保留 |
127 | 为ICMPv6差错报文扩充保留 | RFC4443 | 为更多的差错报文保留 |
128 | Echo Request | RFC4443 | 回显请求,用于诊断网络连通性 |
129 | Echo Reply | RFC4443 | 回显应答,用于诊断网络连通性 |
130 | Multicast Listener Query | RFC2710 | 组播侦听器查询,用于查询链路上的组播组成员 |
131 | Multicast Listener Report | RFC2710 | 组播侦听器报告,用于主机加入组播组 |
132 | Multicast Listener Done | RFC2710 | 组播侦听器终止,用于主机离开组播组 |
133 | Router Solicitation | RFC4861 | 路由器请求,用于主机发现本地路由器 |
134 | Router Advertisement | RFC4861 | 路由器通告,用于路由器通告其存在及相关链路参数 |
135 | Neighbor Solicitation | RFC4861 | 邻居请求,用于链路层地址解析、重复地址检测等 |
136 | Neighbor Advertisement | RFC4861 | 邻居通告,用于响应邻居请求或主动通告链路层变化 |
137 | Redirect | RFC4861 | 重定向,用于路由器通知主机有更好的下一跳 |
138 | Router Renumbering | RFC2894 | 路由器重编号,用于管理员重新编址路由器 |
139 | ICMP Node Information Query | RFC4620 | ICMP节点信息查询,用于获取相邻节点的名字和地址信息 |
140 | ICMP Node Information Response | RFC4620 | ICMP节点信息响应,用于应答节点信息查询 |
141 | Inverse Neighbor Discovery Solicitation | RFC3122 | 反向邻居发现请求,用于检查IPv6到链路层地址的映射 |
142 | Inverse Neighbor Discovery Advertisement | RFC3122 | 反向邻居发现通告,用于响应反向邻居发现请求 |
143 | Multicast Listener Discovery (MLDv2) reports | RFC3810 | 组播侦听器发现(MLDv2)报告,用于MLDv2管理组播组成员 |
144 | Home Agent Address Discovery Request | RFC6275 | 家乡代理地址发现请求,用于移动IPv6中发现家乡代理 |
145 | Home Agent Address Discovery Reply | RFC6275 | 家乡代理地址发现响应,用于移动IPv6中响应家乡代理发现 |
146 | Mobile Prefix Solicitation | RFC6275 | 移动前缀请求,由移动节点请求家乡代理前缀 |
147 | Mobile Prefix Advertisement | RFC6275 | 移动前缀通告,由家乡代理向移动节点通告移动前缀 |
148 | 证书路径请求报文 | RFC3971 | 一条证书路径的保护邻居发现(SEND)请求 |
149 | 证书路径通告报文 | RFC3971 | 相应一个证书路径请求的SEND |
151 | 组播路由器通告 | RFC4286 | 提供组播路由器的地址 |
152 | 组播路由器请求 | RFC4286 | 请求组播路由器的地址 |
153 | 组播路由器终止 | RFC4286 | 组播路由器使用结束 |
154 | FMIPv6 | RFC5568 | MIPv6快速切换报文 |
200/201 | 为私人实验保留 | RFC4443 | 为实验保留 |
255 | 为ICMPv6信息类报文扩充保留 | RFC4443 | 为更多的信息类报文保留 |
2.3 ICMPv6常见代码
类型 | 代码 | 名称 | 描述 |
---|---|---|---|
1 | 0 | No route to destination | 无法路由到目标 |
1 | 1 | Communication with destination administratively prohibited | 与目标通信被管理员禁止 |
1 | 2 | Beyond scope of source address | 超出源地址的作用域 |
1 | 3 | Address unreachable | 地址不可达 |
1 | 4 | Port unreachable | 端口不可达 |
1 | 5 | Source address failed ingress/egress policy | 源地址未通过入口/出口策略 |
1 | 6 | Reject route to destination | 拒绝到目标的路由 |
1 | 7 | Error in Source Routing Header | 源路由头部错误 |
3 | 0 | Hop limit exceeded in transit | 传输过程中超过跳数限制 |
3 | 1 | Fragment reassembly time exceeded | 分片重组超时 |
4 | 0 | Erroneous header field encountered | 遇到错误的头部字段 |
4 | 1 | Unrecognized Next Header type encountered | 遇到无法识别的下一个头部类型 |
4 | 2 | Unrecognized IPv6 option encountered | 遇到无法识别的IPv6选项 |
类型1的目标不可达有多达8种情况,比如无法路由、地址或端口不可达、通信被禁止、超出作用域等,对应了在数据包转发过程中可能遇到的各种问题。
类型3的超时有2种情况,分别是超过跳数限制和分片重组超时。其中跳数限制反映了IPv6网络直径的限制,防止数据包无限循环转发。
类型4的参数问题有3种情况,分别涉及头部字段错误、无法识别的下一个头部类型和IPv6选项,反映了数据包解析过程中可能遇到的问题。
2.4 ICMPv6差错报文限制
在某些情况下,网络设备不会产生ICMPv6差错报文,以避免网络拥塞、安全问题或无用的错误报告:
- 组播地址,当IPv6数据报的目标地址是组播地址时,通常不会产生ICMPv6差错报文(数据包太大例外)。
- 链路层组播和广播报文,数据包太大这种情况例外。
- ICMPv6差错报文,为了避免无限循环,当一个ICMP差错报文触发另一个差错时,通常不会再生成新的ICMP差错报文。
- ICMPv6重定向报文。
- 源地址不是唯一识别的单个节点,如未指定的地址、组播地址等。
- 扩展头处理,当IPv6数据报包含未知的扩展头或扩展头处理错误时,通常不会产生ICMPv6差错报文,以避免信息泄露和网络拥塞。
- 安全策略,根据网络管理员的安全策略,某些类型的ICMPv6报文可能会被禁用或过滤,如ping请求、路由器通告等。
- 隐私保护,为了保护网络用户的隐私,某些ICMPv6报文可能会被抑制,如邻居发现协议中的邻居请求和邻居通告报文。
RFC 4443中对ICMPv6差错报文的生成和发送做了一些限制和规定,主要涉及令牌桶限速:
- 每个ICMP差错报文类型应独立维护一个令牌桶,用于限制该类型差错报文的发送速率。
- 推荐的限速值为每秒不超过2个差错报文令牌,或每秒不超过目的地的路径MTU(PMTU)大小的令牌数。
- 对于代码0-127的差错报文,必须严格限速。
- 对于代码128-255的信息查询报文,可以不限速。
- 实现可以进一步区分不同代码的差错报文,对每个代码应用独立的令牌桶和限速值。
3. ICMPv6基础消息
ICMPv6基础消息指定义在RFC 4443中的基础控制消息,不涉及IPv6网络地址和路由协商的部分。
3.1 ICMPv6目的不可达
ICMPv6的目的不可达报文(Destination Unreachable Message)是类型1的差错报文,用于在数据包无法送达目标时,由路由器或主机向源端发送,告知其发生了不可达的情况。
RFC 4443报文的格式如下:
Destination Unreachable Message(RFC 4443)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Unused |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| As much of invoking packet |+ as possible without the ICMPv6 packet +| exceeding the minimum IPv6 MTU [IPv6] |
字段说明如下:
- Type(8位),值为1,表示目的不可达报文。
- Code(8位),表示不可达的具体原因,有七个不同原因。
- Checksum(16位),ICMPv6校验和。
- unused(32位),未使用字段,必须置0,接收者需要忽略这个数据。
- Original IP Data Datagram,包含引发差错报文的原始IP数据报数据。在不超过1280字节(IPv6最小MTU)的情况下,应尽量的多包涵原始数据。常包括完整的IPv6头部和至少64字节的负载数据。
RFC 4884报文格式如下(支持扩展数据结构):
Destination Unreachable Message(RFC 4884)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Length | Unused |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| As much of invoking packet |+ as possible without the ICMPv6 packet +| exceeding the minimum IPv6 MTU [RFC4443] |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| ICMPv6扩展头部以及零个或多个关联对象 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Type、Code、Checksum、unused字段与原有格式相同。
- Original IPv6 Header + data,数据部分,包含引发差错报文的原始IP数据报的IP头部和数据。处于兼容性考虑,原始数据报的长度至少为128字节,如果不满足,则需要使用零填充。
- Length,指示Original IPv6 Header + data字段的长度,单位为8字节(IPv4和IPv6单位不一样)。
当路由器或主机无法转发或处理接收到的数据包时,就会向源端发送一个相应的目的不可达报文。源端收到该报文后,可以根据Code值判断具体的不可达原因,并结合数据部分携带的原始报文信息进行问题的定位和调整。
- code0,无路由到目的地(No route to destination),该代码表示数据包无法被转发,因为路由表中没有匹配的路由项,或者路由器无法确定下一跳地址。
- 代码1,与目的地的通信被管理性禁止(Communication with destination administratively prohibited),该代码表示数据包被网络管理策略阻止,如访问控制列表(ACL)或防火墙规则等。
- 代码2,超出源地址作用域(Beyond scope of source address),该代码表示源节点的地址在目的地的作用域之外,常见于使用链路本地地址或唯一本地地址时。
- 代码3,地址不可达(Address unreachable),该代码表示路由器能够匹配路由表项,但无法在本地链路上解析目的IPv6地址对应的MAC地址。
- 代码4,端口不可达(Port unreachable),该代码表示数据包已到达目的节点,但目的传输层端口没有相应的应用程序在监听。
- 代码5,源地址失败入口/出口策略(Source address failed ingress/egress policy),该代码表示数据包被源地址验证或过滤机制丢弃,如反向路径转发(RPF)检查失败等。
- 代码6,拒绝路由到目的地(Reject route to destination),该代码表示路由器的路由表中存在到目的地的路由,但该路由被配置为拒绝数据包,如使用了拒绝路由(Reject route)或黑洞路由(Blackhole route)。
3.2 ICMPv6报文太大
ICMPv6的PTB(Packet Too Big)报文是一种重要的错误报告消息,用于通知源节点发送的数据包超过了链路的MTU(最大传输单元),需要进行分片。
Packet Too Big Message(RFC 4443)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| MTU |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| As much of invoking packet |+ as possible without the ICMPv6 packet +| exceeding the minimum IPv6 MTU [IPv6] |
- Type(8位),值为2,表示报文太大的消息。
- Code(8位),固定为0。
- Checksum(16位),ICMPv6校验和。
- MTU(32位),表示下一跳链路的MTU值,单位为字节,源节点应根据该值对后续数据包进行分片或调整大小。
- Original IP Data Datagram,包含引发差错报文的原始IP数据报数据。在不超过1280字节(IPv6最小MTU)的情况下,应尽量的多包涵原始数据。常包括完整的IPv6头部和至少64字节的负载数据。
PTB报文属于ICMPv6的类型2报文,代码字段固定为0。当路由器收到一个IPv6数据包,且该数据包的大小超过了出接口的MTU时,路由器会丢弃该数据包,并向源节点发送一个PTB报文。
当源节点收到PTB报文时,会更新其路径MTU发现(PMTUD)状态,并根据PTB报文中指示的MTU值对后续数据包进行分片或调整大小,这有助于提高网络效率和避免不必要的数据包丢失。
PTB报文是实现IPv6路径MTU发现(PMTUD)机制的关键,PMTUD允许源节点动态地发现端到端路径上的最小MTU,并相应地调整数据包大小,从而优化网络性能。
为防止PTB报文被恶意节点用于攻击,如欺骗源节点使用较小的MTU导致分片和重组开销增加,源节点通常会对收到的PTB报文进行验证,如检查报文中包含的原始数据包是否为自己发送的。
3.3 ICMPv6超时报文
ICMPv6超时报文是一种错误报告消息,用于通知源节点在数据包传输过程中发生了超时。当路由器或目的节点在规定的时间内未能完成数据包的转发或处理时,就会向源节点发送超时报文。
Time Exceeded Message(RFC 4443)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Unused |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| As much of invoking packet |+ as possible without the ICMPv6 packet +| exceeding the minimum IPv6 MTU [IPv6] |
字段说明:
- Type(8位),对于超时报文,该字段固定为3。
- Code(8位),表示ICMPv6超时报文的代码。
- Checksum(16位),ICMPv6报文的校验和,计算方法与PTB报文相同。
- Unused(32位),未使用字段,必须初始化为0,并在处理时忽略。
- As much of invoking packet(可变长度),包含引发差错报文的原始IP数据报数据。在不超过1280字节(IPv6最小MTU)的情况下,应尽量的多包涵原始数据。常包括完整的IPv6头部和至少64字节的负载数据。
当源节点收到超时报文时,可以根据Code字段确定具体的超时原因:
- Code 0表示数据包在转发过程中超过了跳数限制(Hop Limit)。IPv6数据包头部中的Hop Limit字段在每经过一个路由器时减1,当减为0时,路由器会丢弃该数据包并发送Code 0的超时报文。
- Code 1表示数据包在目的节点处重组超时。当分片化的IPv6数据包到达目的节点时,需要等待所有分片到达后进行重组。如果在规定时间内未能收到所有分片,目的节点会丢弃已收到的分片并发送Code 1的超时报文。
源节点收到超时报文后,可以根据需要调整发送策略,如增加Hop Limit的初始值,或者调整分片大小以减少重组超时的可能性。超时报文可能指示网络中存在某些问题,如路由环路、链路拥塞或MTU配置不当等。
3.4 ICMPv6参数问题
ICMPv6参数问题报文是一种错误报告消息,用于通知源节点在处理IPv6数据包头部或扩展头部时发现了错误的参数值。当路由器或目的节点检测到数据包中存在无法识别或无法处理的参数时,会向源节点发送参数问题报文。
Parameter Problem Message(RFC 4443)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Unused |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| As much of invoking packet |+ as possible without the ICMPv6 packet +| exceeding the minimum IPv6 MTU [IPv6] |
字段说明:
- Type(8位),表示ICMPv6报文的类型。对于参数问题报文,该字段固定为4。
- Code(8位),表示ICMPv6参数问题报文的代码。
- Checksum(16位),ICMPv6报文的校验和,计算方法与PTB报文相同。
- Pointer(32位),指示检测到错误参数的位置。该字段以字节为单位,指向数据包中发生错误的第一个字节。
- As much of invoking packet(可变长度),与PTB报文类似,包含触发参数问题报文生成的原始IPv6数据包的IPv6头部和尽可能多的负载数据。
当源节点收到参数问题报文时,可以根据Code字段和Pointer字段确定具体的错误类型和位置:
- Code 0表示错误的报头字段(Erroneous header field encountered),在处理IPv6头部或扩展头部时遇到了错误的字段值,如无效的版本号、无效的负载长度等。
- Code 1表示无法识别的下一个头部类型(Unrecognized Next Header type encountered),遇到了无法识别的下一个头部类型,即IPv6头部或扩展头部中的Next Header字段包含了未定义或不支持的值。
- Code 2表示无法识别的IPv6选项(Unrecognized IPv6 option encountered),表示遇到了无法识别的IPv6选项,即扩展头部中包含了接收节点无法处理的选项。
源节点根据这些信息可以识别和修复数据包构造过程中的错误,如使用正确的头部字段值、支持的下一个头部类型和选项等。
参数问题报文可能指示网络中存在配置错误、软件缺陷或互操作性问题。但需要注意参数问题报文可能被恶意节点用于探测网络拓扑或发起攻击,因此应采取适当的安全措施,如过滤和速率限制等。
3.5 ICMPv6请求和回复
ICMPv6回显请求(Echo Request)和回显应答(Echo Reply)报文是用于诊断网络连通性和延迟的重要工具。它们的功能与IPv4中的ICMP回显请求和应答报文类似,通常用于实现ping命令。
Parameter Problem Message(RFC 4443)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identifier | Sequence Number |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Data |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
-
Type(8位),表示ICMPv6报文的类型。对于回显请求报文,该字段值为128,对于回显应答报文,该字段值为129。
-
Code(8位),表示ICMPv6报文的代码。对于回显请求和应答报文,该字段始终为0。
-
Checksum(16位),ICMPv6报文的校验和,计算方法与PTB报文相同。
-
Identifier(16位),用于匹配回显请求和应答报文,发送方在请求报文中设置一个标识符,接收方在对应的应答报文中使用相同的标识符。
-
Sequence Number(16位),用于匹配回显请求和应答报文。发送方在请求报文中设置一个序列号,接收方在对应的应答报文中使用相同的序列号,发送方通常在每次发送请求时递增序列号。
-
Data(可变长度),载荷数据。发送方可以在请求报文中包含任意数据,接收方在应答报文中返回相同的数据,这可以用于测量网络的往返时间(RTT)和数据完整性。
当源节点发送ICMPv6回显请求报文时,目的节点接收到报文后,将报文中的Type字段修改为129,表示回显应答,并将Identifier、Sequence Number和Data字段保持不变,然后将应答报文发送回源节点。
源节点通过比较发送请求和接收应答之间的时间差,可以计算出到目的节点的RTT。同时,通过检查应答报文中的Data字段,可以确认数据在传输过程中是否被修改。
通过分析ping6的输出结果,如RTT统计信息、丢包率等,可以帮助识别网络中的故障和性能瓶颈。此外,ICMPv6回显请求和应答报文还可以用于其他网络管理和诊断工具的开发。
4. ICMPv6网络控制消息
4.1 本地代理地址发现请求和应答
在RFC 6275(Mobility Support in IPv6)中定义了两种ICMPv6报文类型:
- 家乡代理地址发现请求(Home Agent Address Discovery Request,类型144)
- 家乡代理地址发现回复(Home Agent Address Discovery Reply,类型145)
这两种报文用于支持移动IPv6(MIPv6)中的家乡代理地址发现功能,允许移动节点动态地发现和选择家乡代理。
家乡代理地址发现请求报文格式:
Home Agent Address Discovery Request Message(144)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
家乡代理地址发现回复报文格式:
Home Agent Address Discovery Reply Message(145)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. Home Agent Addresses .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
-
Type(8位),表示ICMPv6报文的类型。对于家乡代理地址发现请求报文,该字段值为144。对于家乡代理地址发现回复报文,该字段值为145。
-
Code(8位),表示ICMPv6报文的代码,对于这两种报文,该字段始终为0。
-
Checksum(16位),ICMPv6报文的校验和,计算方法与其他ICMPv6报文类似。
-
Identifier(16位),用于匹配请求和回复报文,发送方在请求报文中设置一个标识符,接收方在对应的回复报文中使用相同的标识符。
-
Reserved(16位),保留字段,必须初始化为0。
-
Home Agent Addresses(可变长度,仅出现在回复报文中),包含一个或多个家乡代理的IPv6地址,每个地址占用128位。
家乡代理地址发现的过程如下:
- 移动节点向其家乡网络的任播地址(Home Agents anycast address)发送一个家乡代理地址发现请求报文。
- 家乡网络中的家乡代理接收到请求报文后,将自己的IPv6地址封装在家乡代理地址发现回复报文中,发送给移动节点。
- 移动节点从收到的回复报文中提取家乡代理的地址,并根据一定的规则(如响应时间、负载平衡等)选择一个家乡代理作为自己的服务代理。
家乡代理地址发现报文可能被恶意节点用于发起攻击,如欺骗移动节点使用恶意家乡代理,一般使用IPsec对家乡代理地址发现报文进行保护,以确保网络的安全性。
4.2 移动前缀请求和通告
在RFC 6275中,类型146对应的是移动前缀请求(Mobile Prefix Solicitation)报文,类型147对应的是移动前缀广告(Mobile Prefix Advertisement)报文。
移动前缀请求报文格式:
Mobile Prefix Solicitation Message(146)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
移动前缀广告报文格式:
Mobile Prefix Advertisement(147)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
字段说明:
- Type(8位),表示ICMPv6报文的类型,对于移动前缀请求报文,该字段值为146,对于移动前缀广告报文,该字段值为147。
- Code(8位),表示ICMPv6报文的代码,对于这两种报文,该字段始终为0。
- Checksum(16位),ICMPv6报文的校验和,计算方法与其他ICMPv6报文类似。
- Identifier(16位),用于匹配请求和广告报文。发送方在请求报文中设置一个标识符,接收方在对应的广告报文中使用相同的标识符。
- Reserved(16位),保留字段,必须初始化为0。
- Options(可变长度,仅出现在广告报文中):包含一个或多个选项,用于携带移动前缀信息、生存期等参数。选项的格式遵循Type-Length-Value (TLV)编码方式。
移动前缀请求和广告报文用于在移动IPv6中实现移动前缀的动态分配和管理,其基本过程如下:
- 移动节点向其家乡代理发送一个移动前缀请求报文,请求分配一个或多个移动前缀。
- 家乡代理根据请求报文中的参数和本地策略,为移动节点分配一个或多个移动前缀,并将这些前缀封装在移动前缀广告报文中发送给移动节点。
- 移动节点从收到的广告报文中提取移动前缀信息,并根据需要配置到自己的接口上,用于后续的通信。
通过使用移动前缀请求和广告报文,移动IPv6可以实现移动前缀的动态分配和管理,简化了网络配置和维护。
与家乡代理地址发现报文类似,需要采取适当的安全措施,如使用IPsec对这些报文进行保护,以确保网络的安全性。
4.3 组播侦听查询、报告和完成
RFC 2710中定义的ICMPv6类型130(Multicast Listener Query)、类型131(Multicast Listener Report)和类型132(Multicast Listener Done)报文及其格式。这些报文用于实现MLDv1(Multicast Listener Discovery Version 1)协议,支持IPv6组播管理。
组播监听者查询(Multicast Listener Query)报文格式:
Multicast Listener Query(130)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Maximum Response Delay | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Multicast Address +
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
组播监听者报告(Multicast Listener Report)报文格式:
Multicast Listener Report(131)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Multicast Address +
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
组播监听者结束(Multicast Listener Done)报文格式:
Multicast Listener Done(132)0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Multicast Address +
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
-
Type(8位),表示ICMPv6报文的类型,对于组播监听者查询报文,该字段值为130,对于组播监听者报告报文,该字段值为131,对于组播监听者结束报文,该字段值为132。
-
Code(8位),表示ICMPv6报文的代码,对于这三种报文,该字段始终为0。
-
Checksum(16位),ICMPv6报文的校验和,计算方法与其他ICMPv6报文类似。
-
Maximum Response Delay(16位,仅出现在查询报文中),指定主机在发送报告报文之前应该等待的最大延迟时间,以毫秒为单位。
-
Reserved(16位或32位),保留字段,必须初始化为0。
-
Multicast Address(128位),指定查询、报告或结束消息所针对的组播地址。
MLDv1协议的基本工作原理如下:
- 路由器定期向链路本地的所有节点组播地址(FF02::1)发送组播监听者查询报文,询问链路上的主机是否有加入任何组播组。
- 主机收到查询报文后,为其加入的每个组播组发送一个组播监听者报告报文,告知路由器自己的组播组成员身份。
- 当主机离开某个组播组时,它会向该组播组的地址发送一个组播监听者结束报文,通知路由器自己已经离开该组。
- 路由器根据收到的报告和结束报文,维护和更新本地的组播组成员关系,并相应地转发或过滤组播流量。
通过使用MLDv1协议,IPv6网络可以高效地管理和优化组播流量的分发,减少不必要的网络开销,常用于支持IPTV、在线会议等大规模组播应用。
4.4 组播侦听发现
RFC 3810中定义的ICMPv6类型143(Multicast Listener Discovery Version 2 Reports)报文及其格式。MLDv2是MLDv1的增强版本,提供了更多的功能和灵活性,如支持源特定组播(SSM)、更细粒度的组播过滤等。
MLDv2协议的基本工作原理与MLDv1类似,但引入了一些新的机制和概念:
- 过滤模式,MLDv2支持INCLUDE和EXCLUDE两种过滤模式。在INCLUDE模式下,主机只接收来自指定源列表的组播流量。在EXCLUDE模式下,主机接收来自指定源列表之外的所有源的组播流量。
- 源列表,MLDv2允许主机在报告报文中携带一个源地址列表,指定其希望接收或屏蔽的组播源,这为实现SSM提供了支持。
- 异步报告,与MLDv1不同,MLDv2中的主机可以在任何时候发送报告报文,而不必等待路由器的查询。
MLDv2协议的实现和部署比MLDv1更加复杂,需要主机和路由器都支持MLDv2的功能。此外,MLDv2报文的长度和处理开销也较MLDv1有所增加。因此,在实际网络中部署MLDv2时,需要仔细评估其必要性和可行性,并采取适当的优化措施,如使用SSM映射、配置合适的查询间隔等。
4.5 组播路由器发现
RFC 4286中定义的ICMPv6类型151、152和153这三种报文用于实现多播路由器广告(Multicast Router Advertisement, MRA)和多播路由器请求(Multicast Router Solicitation, MRS)功能,支持在IPv6网络中发现和管理多播路由器。
多播路由器广告(Multicast Router Advertisement)报文格式:
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Query Interval | Robustness Variable |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
多播路由器请求(Multicast Router Solicitation)和多播路由器终止(Multicast Router Termination)报文格式:
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
-
Query Interval(16位,仅出现在广告报文中),指定多播路由器发送广告报文的时间间隔,以秒为单位。
-
Robustness Variable(16位,仅出现在广告报文中),指定系统的鲁棒性变量,用于调整协议的容错能力。
-
Reserved(32位),保留字段,必须初始化为0。
MRA和MRS协议的基本工作原理如下:
- 多播路由器定期在其所连接的链路上发送多播路由器广告报文,宣告自己的存在和配置参数。
- 主机或其他设备可以通过发送多播路由器请求报文,主动请求多播路由器发送广告报文。
- 当多播路由器要离开网络或停止多播路由功能时,它会发送多播路由器终止报文,通知其他设备自己的离开。
- 其他设备根据收到的广告、请求和终止报文,维护和更新本地的多播路由器列表,并相应地调整自己的多播行为。
MRA和MRS协议本身并不负责实际的多播路由和转发,而只是提供了一种发现和管理多播路由器的机制。实际的多播路由功能通常由其他协议(如PIM-SM、PIM-DM等)来实现。
5. ICMPv6邻居发现类消息
5.1 ICMPv6邻居发现协议
IPv6邻居发现协议(Neighbor Discovery Protocol, NDP)是IPv6中的一个重要协议,它集成了IPv4中ARP、ICMP router discovery和ICMP redirect等多个协议的功能,用于在IPv6网络中发现邻居并与之交互。
NDP主要有以下几个作用:
-
地址解析,通过邻居请求(NS)和邻居公告(NA)消息,将IPv6地址解析为链路层地址,类似于IPv4中的ARP。
-
路由器发现,通过路由器请求(RS)和路由器公告(RA)消息,允许主机自动发现本地链路上的路由器,并从路由器获取相关配置信息,如IPv6前缀、MTU等。
-
地址自动配置,结合路由器公告信息,主机可以使用无状态地址自动配置(SLAAC)机制自动生成IPv6地址,简化IP配置过程。
-
重复地址检测,在分配IPv6地址前,主机会通过邻居请求消息检测地址是否冲突,避免地址重复的问题。
-
链路状态探测,通过邻居不可达检测(NUD)机制,定期验证邻居的可达性,快速感知链路故障。
-
重定向,当路由器发现主机使用次优路径时,可通过重定向消息通知主机,优化路由路径。
NDP定义了5种ICMPv6消息类型:路由器请求(RS, type 133)、 路由器公告(RA, type 134)、邻居请求(NS, type 135)、邻居公告(NA, type 136) 、重定向(Redirect, type 137)。
ICMPv6广泛在链路层和网络层使用组播地址,而IPv4主要是广播地址。不过ND并不倾向于采用链路层组播功能,因此在非广播和非组播链路层上的操作会有一些差别。
ND报文基于ICMPv6报文实现,发送时IPv6的跳数限制字段值会被设置为255,接收方会验证这个值,以防止被非本链路上的发送者给欺骗。
5.2 ICMPv6重定向报文
ICMPv6重定向报文是一种重要的控制消息,用于通知源节点有一条更优的路由可以到达目的地。当路由器发现源节点发送的数据包不是通过最佳路径到达目的地时,会向源节点发送重定向报文,建议其更新路由表以使用更优路径。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Target Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| As much of invoking packet |
+ as possible without the ICMPv6 packet +
| exceeding the minimum IPv6 MTU [IPv6] |
字段说明:
-
Type(8位),表示ICMPv6报文的类型,对于重定向报文,该字段固定为137。
-
Code(8位),表示ICMPv6重定向报文的代码,该字段有以下四种取值:
- 代码0,重定向数据包以更好地到达目的地
- 代码1,重定向数据包以更好地到达目的地并使用指定的源地址
- 代码2,重定向数据包以更好地到达指定的目的地
- 代码3,重定向数据包以更好地到达指定的目的地并使用指定的源地址
-
Checksum(16位),ICMPv6报文的校验和,计算方法与PTB报文相同。
-
Reserved(32位),保留字段,必须初始化为0,并在处理时忽略。
-
Target Address(128位),表示更优路径上的下一跳路由器地址,源节点应将后续数据包发送到该地址。
-
Destination Address(128位),表示触发重定向的原始数据包的目的IPv6地址。
-
As much of invoking packet(可变长度),包含触发重定向报文生成的原始IPv6数据包的IPv6头部和尽可能多的负载数据。
当源节点收到重定向报文时,应验证报文的合法性,并根据Target Address字段更新其路由表,以便后续数据包能够通过更优路径到达目的地。
为防止重定向报文被滥用于攻击,如误导源节点将数据包发送到恶意节点,通常会对重定向报文应用一些安全措施,如仅接受来自默认网关的重定向报文,或在路由器上禁用生成重定向报文的功能。
5.3 路由器请求和通告
根据RFC 4861,ICMPv6类型133(路由器请求,RS)和134(路由器公告,RA)是IPv6邻居发现协议(NDP)中两种重要的消息类型,它们在主机自动配置和发现默认路由器方面发挥着关键作用。
路由器请求(Router Solicitation, RS)消息由主机发送,用于请求链路上的路由器生成路由器公告(RA)消息。当主机启动或需要获取路由器信息时,会向链路本地范围内的所有路由器组播地址(ff02::2)发送RS消息。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
路由器公告(Router Advertisement,RA)消息由路由器定期发送或响应主机的RS消息。它包含路由器的各种配置参数,用于主机自动配置IPv6地址、默认网关等信息。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O|H|Pref|P|00| Router Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reachable Time |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Retrans Timer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
- Cur Hop Limit,主机发送数据包时使用的默认跳数限制值,0表示路由器不关心。
- M(1比特),地址是否使用有状态自动配置。
- O(1比特),主机是否使用有状态的其他配置,如DNS。
- H(1比特),发送路由器是否愿意充当一个移动IPv6节点的本地代理。
- Pref(2比特),将报文发送者作为一个默认路由器来使用的优先级层次:高(01),中(00),低(11),保留(00)。详细内容见RFC4191。
- P(1比特),代理标志,和实验性质的ND代理工具(RFC4389)配合使用。
- Router Lifetime,路由器作为默认路由器的生存期,单位秒。
- Reachable Time,临居可达时间,确定NUD探测间隔,单位毫秒。
- Retrans Timer,重传NS消息等待NA响应的时间,单位毫秒。
- Options,可选字段,包含路由器链路层地址、MTU、前缀信息等。
路由器周期性地向所有节点组播地址(ff02::1)发送RA消息,主机接收到RA后,可从中获取IPv6前缀、默认路由器、DNS等信息,用于自动配置。同时,当路由器收到主机发送的RS消息时,会及时响应一个RA消息。
RS和RA消息的交互构成了IPv6无状态地址自动配置(SLAAC)的基础,大大简化了主机的配置过程。主机可以根据获取的前缀信息自动生成全球唯一的IPv6地址,并使用公告的路由器作为默认网关,实现即插即用。
5.4 邻居请求和通告
邻居请求(NS)/邻居公告(NA)消息用于链路层地址解析、重复地址检测以及链路可达性检测等功能。
邻居请求(Neighbor Solicitation, NS)消息主要用于链路层地址解析,即将IPv6地址解析为对应的MAC地址。当主机需要与同一链路上的其他节点通信时,如果缺乏目标节点的链路层地址信息,就会发送NS消息进行地址解析。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Target Address +
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
- Target Address(128比特),NS请求解析的目标IPv6地址。
- Options(可选字段),通常包含源链路层地址选项。
NS消息通常发送到被请求节点的请求节点组播地址,该地址根据目标地址的后24位自动计算得出。
邻居公告(Neighbor Advertisement,NA)消息由目标节点响应NS消息而发送,用于通告自身的链路层地址信息和响应重复地址检测过程。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ Target Address +
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
- R(1bit),路由器标志。1表示发送方是路由器,0表示主机。
- S(1bit),请求标志,1表示响应的是DAD NS消息。
- O(1bit),覆盖标志,1表示覆盖现有的缓存项。
- Reserved(29bit),初始化为0,接收时忽略。
- Target Address(128比特),NA消息中通告的IPv6地址。
- Options,可选字段,通常包含目标链路层地址选项。
当节点收到NS消息时,会回复NA消息,将自己的链路层地址通告给请求者,以便请求者可以更新邻居缓存。NA消息通常发送给NS请求中的源地址。
对于重复地址检测(DAD),新加入的节点会发送DAD NS消息到自己的待定地址,如果收到NA回复,则表明地址已经被占用,否则可以确定该地址未被使用,可以安全地分配。
5.5 反向邻居发现请求和通告
根据RFC 3122,ICMPv6类型141(邻居请求,INQ)和142(邻居公告,INA)是IPv6逆向邻居发现协议(Inverse Neighbor Discovery,IND)中定义的两种消息类型。与常规的NDP协议不同,IND允许节点请求邻居的IPv6地址信息,即根据已知的链路层地址反向解析IPv6地址。
逆向邻居请求(Inverse Neighbor Query,INQ消息由请求节点发送,用于请求目标节点的IPv6地址信息。请求节点根据自己的需求,选择包含目标节点完整链路层地址或部分前缀的链路层地址。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
- Options,必须包含目标链路层地址选项,可选地包含源链路层地址选项。
逆向邻居公告(Inverse Neighbor Advertisement, INA)消息由目标节点响应INQ消息而发送,用于公告自身的IPv6地址信息。收到INQ消息的节点,如果其链路层地址与INQ中请求的地址匹配,则回复INA消息,提供自己的IPv6地址。
0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
- Options,必须包含目标链路层地址选项和目标IPv6地址列表选项,可选地包含源链路层地址选项。
INQ消息通常发送到被请求节点的请求节点组播地址,INA消息通常作为单播发送给INQ请求的源IPv6地址。
IND协议扩展了NDP的功能,支持根据链路层地址反向解析IPv6地址的需求。这在某些场景下很有用,比如网络管理和故障诊断时,管理员已知设备的MAC地址,需要查询其IPv6地址。
通过INQ/INA消息的交互,请求节点可以从目标节点获取IPv6地址信息,建立起反向邻居映射关系。
5.6 邻居不可达检测
IPv6邻居不可达检测(Neighbor Unreachability Detection,NUD)通过定义一系列的邻居缓存项状态,来跟踪记录邻居的可达性信息。RFC 4861中定义了5种邻居缓存项状态:INCOMPLETE、REACHABLE、STALE、DELAY和PROBE。
这些状态之间可以相互转换,构成了完整的NUD状态机:
-
INCOMPLETE状态,当节点发送邻居请求(NS)消息,但还没有收到对应的邻居公告(NA)响应时,邻居缓存项处于INCOMPLETE状态。如果收到NA响应,状态将转换为REACHABLE;如果重传NS超过一定次数仍未收到NA,缓存项将被删除。
-
REACHABLE状态,当节点收到NA响应,确认邻居可达时,邻居缓存项进入REACHABLE状态。REACHABLE状态表明最近一次邻居可达性确认在ReachableTime时间内发生。在此期间,无需发送探测消息。当ReachableTime超时,状态将转换为STALE。如果期间发生向邻居转发数据包,REACHABLE定时器将重置。
-
STALE状态,当REACHABLE状态超时,邻居缓存项进入STALE状态。STALE状态表明节点不再确定邻居的可达性,但仍然认为地址映射有效。如果在STALE状态下需要向邻居发送数据包,将启动DELAY定时器,状态转换为DELAY;否则,持续保持STALE状态。
-
DELAY状态,当STALE状态下需要向邻居发送数据包时,启动DELAY定时器,状态转换为DELAY。DELAY状态用于延迟探测,以避免不必要的网络流量。如果在延迟期间收到邻居的上层协议回应,状态将直接转换为REACHABLE。当DELAY定时器超时,将发送一个NS探测消息,状态转换为PROBE。
-
PROBE状态,当DELAY定时器超时,状态转换为PROBE,同时发送NS探测消息,确认邻居可达性。如果收到NA响应,状态将转换为REACHABLE;如果重传NS超过一定次数仍未收到NA,邻居缓存项将被删除。
总结NUD状态机的关键转换:
- 发送NS请求地址解析,进入INCOMPLETE状态,收到NA则转为REACHABLE。
- REACHABLE超时转为STALE,下一次发包时转为DELAY并启动定时器。
- DELAY定时器超时,发送NS进入PROBE状态,收到NA转为REACHABLE。
- 任一状态下,重传NS超时删除缓存项。
- STALE/DELAY状态下收到上层协议应答,直接转为REACHABLE。
6. ICMPv4和ICMPv6转换
在IPv4到IPv6的过渡过程中,需要在协议栈之间进行转换和映射,以确保跨协议的互通性。
RFC 7915和RFC 7757定义了ICMPv4和ICMPv6消息类型和代码的映射关系,以指导实现协议转换功能。
转换ICMP时,IP和ICMP头部都需要转换,如果是ICMP差错报文,还需要转换内部的错误IP数据报。
6.1 从ICMPv4转到ICMPv6
ICMPv4到ICMPv6的转换原则:
- 对于大多数ICMPv4消息,存在直接对应的ICMPv6消息类型,可以执行1:1的转换。
- 有些ICMPv4消息在ICMPv6中被废弃或没有直接等价的消息,需要进行特殊处理或丢弃。
- 转换过程需要适当调整ICMP字段,如校验和、长度等,以适应IPv6报文格式。
ICMPv4到ICMPv6的类型和代码映射表:
ICMPv4类型/代码 | ICMPv4描述 | ICMPv6类型 | ICMPv6描述 |
---|---|---|---|
0/0 | Echo Reply | 129/0 | Echo Reply |
8/0 | Echo Request | 128/0 | Echo Request |
3/0 | Dest. Network Unreachable | 1/0 | Dest. Unreachable (No route) |
3/1 | Dest. Host Unreachable | 1/0 | Dest. Unreachable (No route) |
3/2 | Protocol Unreachable | 4/1 | 参数问题-无法识别的下一个头部 |
3/3 | Port Unreachable | 1/4 | Dest. Unreachable (Port) |
3/4 | Fragmentation Needed & DF | 2/0 | Packet Too Big |
3/5 | Source Route Failed | 1/0 | Dest. Unreachable (No route) |
3/6 | Dest. Network Unknown | 1/0 | Dest. Unreachable (No route) |
3/7 | Dest. Host Unknown | 1/0 | Dest. Unreachable (No route) |
3/8 | Source Host Isolated | 1/0 | Dest. Unreachable (No route) |
3/9 | Network Prohibited | 1/1 | Dest. Unreachable (Admin) |
3/10 | Host Prohibited | 1/1 | Dest. Unreachable (Admin) |
3/11 | Network Unreachable for TOS | 1/0 | Dest. Unreachable (No route) |
3/12 | Host Unreachable for TOS | 1/0 | Dest. Unreachable (No route) |
3/13 | Communication Prohibited | 1/1 | Dest. Unreachable (Admin) |
3/14 | 目的不可达-违反主机优先级 | - | (丢弃) |
3/15 | 目的不可达-优先级终止生效 | 1/1 | Dest. Unreachable (Admin) |
11/0 | Time Exceeded | 3 | Time Exceeded (Hop limit) |
12/0-2 | Parameter Problem | 4/0 | Parameter Problem |
以上映射表总结了常见的ICMPv4类型和代码到ICMPv6的转换关系。
- 一些ICMPv4消息(如Source Quench和Redirect)在ICMPv6中已被废弃,转换时需要直接丢弃。
- ICMPv6新引入了一些ICMPv4中没有的错误类型,如"Packet Too Big"。
- 有些ICMPv4的目的不可达代码被映射到ICMPv6的"Destination Unreachable"类型下的不同代码。
- ICMPv6参数问题消息支持更细粒度的错误原因区分(代码0/1/2)。
- 对于由指针字段给出问题值的参数问题报文,会通过一个额外的IP参数问题指针映射表来形成适当的IPv6指针字段值。
- 除ICMP首部数据之外的数据报文部分转换失败,通常会生成一个ICMPv4目的不可达-通信管理上禁止报文。
- ICMPv4报文转换为ICMPv6报文时,如果没有DF标识,可能会生成多个ICMPv6分片报文,以满足最小IPv6 MTU需要。
6.2 从ICMPv6转到ICMPv4
ICMPv6到ICMPv4的转换原则:
- 对于大多数ICMPv6消息,存在直接对应的ICMPv4消息类型,可以执行1:1的转换。
- 有些ICMPv6消息在ICMPv4中没有直接等价的消息,需要进行特殊处理或丢弃。
- 转换过程需要适当调整ICMP字段,如校验和、长度等,以适应IPv4报文格式。
ICMPv6到ICMPv4的类型和代码映射表:
ICMPv6类型 | ICMPv6描述 | ICMPv4类型 | ICMPv4描述 |
---|---|---|---|
1/0 | Dest. Unreachable (No route) | 3/1 | 目的不可达-主机 |
1/1 | Dest. Unreachable (Admin) | 3/10 | 目的不可达-管理上禁止目的主机 |
1/2 | Dest. Unreachable (Beyond scope) | 3/1 | 目的不可达-主机 |
1/3 | Dest. Unreachable (Address) | 3/1 | 目的不可达-主机 |
1/4 | Dest. Unreachable (Port) | 3/3 | 目的不可达-端口 |
2/0 | Packet Too Big | 3/4 | Fragmentation Needed & DF |
3/0 | Time Exceeded (Hop limit) | 11/0 | Time Exceeded |
3/1 | Time Exceeded (Fragment) | 11/1 | Time Exceeded |
4/0 | Parameter Problem (Header) | 12/0 | Parameter Problem |
4/1 | Parameter Problem (Option) | 3/2 | 目的不可达-协议 |
4/2 | Parameter Problem (Other) | - | (丢弃) |
128/0 | Echo Request | 8/0 | Echo Request |
129/0 | Echo Reply | 0/0 | Echo Reply |
以上映射表总结了常见的ICMPv6类型和代码到ICMPv4的转换关系。需要注意的是:
- 一些ICMPv6消息(如Packet Too Big和Redirect)在ICMPv4中没有完全等价的消息,转换时可能需要近似处理或丢弃。
- 有些ICMPv6的目的不可达代码被映射到ICMPv4的不同类型和代码组合。
- ICMPv6的参数问题消息有更细粒度的错误原因区分,转换到ICMPv4时可能丢失一些信息。
- 转换过程中需要注意处理ICMPv6特有的扩展头部和选项。
7. 总结
ICMPv6协议涉及的内容相比于ICMPv4复杂很多,ICMPv4最主要用途是链路探测和差错报文。ICMPv6则增加了路由器发现、邻居发现、移动IP、组播管理等多个子模块,协议内容大幅增加。
ICMPv6路由器和邻居发现一定程度上拜托了对DHCP的依赖,并且不再需要ARP这样的中间协议,但这样也导致ICMPv6看起来非常臃肿。可以从ICMPv6基础消息逐步扩展,组播和移动代理相关知识可以先忽略,邻居发现类知识单独总结学习,这样就简单很多了。