商道如狼道 发表于 2024-7-10 19:59:33

网络网络层之(6)ICMPv6协议

网络网络层之(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)


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报文格式由类型、代码和校验和三个固定字段组成,后面紧跟与具体报文类型相干的数据部分。
https://img-blog.csdnimg.cn/direct/97bdd4776cc747169b6b061f4e7e1249.png#pic_center
字段说明:


[*] 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文档用途描述1Destination UnreachableRFC4443目标不可达,用于关照源主机2Packet Too BigRFC4443报文过大,需要分片但IPv6不答应中间装备分片3Time ExceededRFC4443超时,用于关照源主机4Parameter ProblemRFC4443参数问题,用于向源主机指出错误100/101为私人实验保存RFC4443为实验保存127为ICMPv6差错报文扩充保存RFC4443为更多的差错报文保存128Echo RequestRFC4443回显请求,用于诊断网络连通性129Echo ReplyRFC4443回显应答,用于诊断网络连通性130Multicast Listener QueryRFC2710组播侦听器查询,用于查询链路上的组播组成员131Multicast Listener ReportRFC2710组播侦听器报告,用于主机加入组播组132Multicast Listener DoneRFC2710组播侦听器终止,用于主机离开组播组133Router SolicitationRFC4861路由器请求,用于主机发现本地路由器134Router AdvertisementRFC4861路由器通告,用于路由器通告其存在及相干链路参数135Neighbor SolicitationRFC4861邻居请求,用于链路层所在解析、重复所在检测等136Neighbor AdvertisementRFC4861邻居通告,用于相应邻居请求或自动通告链路层变革137RedirectRFC4861重定向,用于路由器关照主机有更好的下一跳138Router RenumberingRFC2894路由器重编号,用于管理员重新编址路由器139ICMP Node Information QueryRFC4620ICMP节点信息查询,用于获取相邻节点的名字和所在信息140ICMP Node Information ResponseRFC4620ICMP节点信息相应,用于应答节点信息查询141Inverse Neighbor Discovery SolicitationRFC3122反向邻居发现请求,用于检查IPv6到链路层所在的映射142Inverse Neighbor Discovery AdvertisementRFC3122反向邻居发现通告,用于相应反向邻居发现请求143Multicast Listener Discovery (MLDv2) reportsRFC3810组播侦听器发现(MLDv2)报告,用于MLDv2管理组播组成员144Home Agent Address Discovery RequestRFC6275家乡代理所在发现请求,用于移动IPv6中发现家乡代理145Home Agent Address Discovery ReplyRFC6275家乡代理所在发现相应,用于移动IPv6中相应家乡代剃头现146Mobile Prefix SolicitationRFC6275移动前缀请求,由移动节点请求家乡代理前缀147Mobile Prefix AdvertisementRFC6275移动前缀通告,由家乡代理向移动节点通告移动前缀148证书路径请求报文RFC3971一条证书路径的掩护邻居发现(SEND)请求149证书路径通告报文RFC3971相应一个证书路径请求的SEND151组播路由器通告RFC4286提供组播路由器的所在152组播路由器请求RFC4286请求组播路由器的所在153组播路由器终止RFC4286组播路由器使用结束154FMIPv6RFC5568MIPv6快速切换报文200/201为私人实验保存RFC4443为实验保存255为ICMPv6信息类报文扩充保存RFC4443为更多的信息类报文保存 2.3 ICMPv6常见代码

类型代码名称描述10No route to destination无法路由到目标11Communication with destination administratively prohibited与目标通信被管理员禁止12Beyond scope of source address超出源所在的作用域13Address unreachable所在不可达14Port unreachable端口不可达15Source address failed ingress/egress policy源所在未通过入口/出口策略16Reject route to destination拒绝到目标的路由17Error in Source Routing Header源路由头部错误30Hop limit exceeded in transit传输过程中超过跳数限定31Fragment reassembly time exceeded分片重组超时40Erroneous header field encountered遇到错误的头部字段41Unrecognized Next Header type encountered遇到无法辨认的下一个头部类型42Unrecognized 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                   3
   0 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           |
字段说明如下:


[*]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                   3
   0 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        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             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                   3
   0 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          |


[*]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                   3
   0 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          |
字段说明:


[*]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                   3
   0 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          |
字段说明:

[*]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                   3
    0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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          |
字段说明:


[*] 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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                   3
0 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。
https://img-blog.csdnimg.cn/direct/492d4f1bb1fb48fc86e55f35496d45ce.png#pic_center
这些状态之间可以相互转换,构成了完备的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/0Echo Reply129/0Echo Reply8/0Echo Request128/0Echo Request3/0Dest. Network Unreachable1/0Dest. Unreachable (No route)3/1Dest. Host Unreachable1/0Dest. Unreachable (No route)3/2Protocol Unreachable4/1参数问题-无法辨认的下一个头部3/3Port Unreachable1/4Dest. Unreachable (Port)3/4Fragmentation Needed & DF2/0Packet Too Big3/5Source Route Failed1/0Dest. Unreachable (No route)3/6Dest. Network Unknown1/0Dest. Unreachable (No route)3/7Dest. Host Unknown1/0Dest. Unreachable (No route)3/8Source Host Isolated1/0Dest. Unreachable (No route)3/9Network Prohibited1/1Dest. Unreachable (Admin)3/10Host Prohibited1/1Dest. Unreachable (Admin)3/11Network Unreachable for TOS1/0Dest. Unreachable (No route)3/12Host Unreachable for TOS1/0Dest. Unreachable (No route)3/13Communication Prohibited1/1Dest. Unreachable (Admin)3/14目标不可达-违反主机优先级-(丢弃)3/15目标不可达-优先级终止生效1/1Dest. Unreachable (Admin)11/0Time Exceeded3Time Exceeded (Hop limit)12/0-2Parameter Problem4/0Parameter 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/0Dest. Unreachable (No route)3/1目标不可达-主机1/1Dest. Unreachable (Admin)3/10目标不可达-管理上禁止目标主机1/2Dest. Unreachable (Beyond scope)3/1目标不可达-主机1/3Dest. Unreachable (Address)3/1目标不可达-主机1/4Dest. Unreachable (Port)3/3目标不可达-端口2/0Packet Too Big3/4Fragmentation Needed & DF3/0Time Exceeded (Hop limit)11/0Time Exceeded3/1Time Exceeded (Fragment)11/1Time Exceeded4/0Parameter Problem (Header)12/0Parameter Problem4/1Parameter Problem (Option)3/2目标不可达-协议4/2Parameter Problem (Other)-(丢弃)128/0Echo Request8/0Echo Request129/0Echo Reply0/0Echo 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底子消息逐步扩展,组播和移动代理相干知识可以先忽略,邻居发现类知识单独总结学习,这样就简单很多了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 网络网络层之(6)ICMPv6协议