5-6 ICMP
5-6-2 ICMP和NDP
ICMPv6
ICMPv6(Internet Control Message Protocol version 6)是IPv6网络中的核心协议,负责网络通信中的错误报告、诊断和控制功能,同时整合了IPv4中多个协议(如ICMP、ARP、IGMP)的功能
ICMPv6报文由以下字段组成:
- 类型(Type):8位,0-127为差错报文,128-255为信息报文
- 代码(Code):8位,细化报文类型(如“目的不可达”下的子原因)
- 校验和(Checksum):16位,基于IPv6伪头部和ICMPv6报文计算
- 报文体:内容因类型而异,可能包含错误参数或请求/应答数据
ICMPv6报文分为两类:差错报文和信息报文
差错报文
差错报文(Error Messages),也称为差错消息,Type字段最高bit为0,也就是ICMPv6 Type = [0, 127]
差错消息用于报告在转发IPv6数据包过程中出现的错误,如常见的目的不可达、超时等等。
信息报文
信息报文 (Information Messages)也称为信息消息,Type字段最高bit为1,也就是ICMPv6 Type =[128,255]
信息报文可以用来实现同一链路上节点间的通信和子网内的组播成员管理,地址自动配置等。
ICMPv6差错报文应用:Path MTU发现
在IPv6中,中间转发设备不对IPv6报文进行分片,报文的分片将在源节点进行
- PMTU (Path MTU))点就是路径上的最小接口MTU。
- PMTUD(PathMTU发现机制,D即Discovery)的主要目的是发现路径上的MTU,当数据包被从源转发到目的地的过程中避免分段。
- 依赖PMTUD,数据的发送方可以使用所发现到的最优PMTU与目的地节点进行通信,这样可以避免数据
包在从源传输到目的的过程之中,被中途的路由器分片而导致性能的下降。
Path MTU发现机制
- 目标:在IPv6网络中,源主机(如PC1)需要动态探测到目标主机(如PC2)路径中的最小MTU,避免因数据包过大被丢弃或分片(IPv6禁止中间路由分片,分片仅由源节点完成)。
- 依赖协议:ICMPv6类型2报文(Packet Too Big),用于通知源节点路径中的MTU限制。

图示流程解析如下:
步骤1:初始数据包发送
- 动作:PC1向PC2发送一个MTU=1500字节的数据包。
- 假设:PC1默认使用本地接口MTU(通常1500,以太网标准)作为初始值。
步骤2:R1检测MTU冲突
- 问题:数据包到达R1时,R1发现其出接口的MTU=1400字节(小于数据包大小1500)。
- 响应:R1丢弃该数据包,并向PC1发送ICMPv6类型2报文(Packet Too Big),携带自身出接口的MTU=1400。
- 报文关键字段:
- Type=2(Packet Too Big)
- Code=0(无子状态)
- MTU=1400(建议新MTU值)
- 包含原始数据包的部分内容(用于源节点匹配请求)。
- 报文关键字段:
步骤3:PC1调整MTU并重发
- 动作:PC1收到ICMPv6类型2报文后,将后续发送的MTU调整为1400字节,重新发送数据包。
- 逻辑:源节点根据ICMPv6报文中的MTU值更新路径MTU缓存,确保后续传输不超限。
步骤4:R2检测MTU冲突
- 问题:数据包到达R2时,R2出接口的MTU=1300字节(小于当前数据包大小1400)。
- 响应:R2丢弃数据包,并向PC1发送ICMPv6类型2报文,携带MTU=1300。
步骤5:PC1再次调整并成功传输
- 最终动作:PC1将MTU降至1300字节后发送数据包,该MTU值小于路径中所有路由器的接口MTU(R1=1400,R2=1300),最终成功到达PC2。
ICMPv6信息报文应用:Ping6
Ping基于ICMPv6信息报文实现
Echo Request:用于发送到目标节点,以使目标节点立即发回一个Echo Reply应答报文。Echo Request报文的Type字段值为128,Code字段的值为0。
Echo Reply:当收到一个Echo Request报文时,ICMPv6会用Echo Reply报文响应。Echo Reply报
文的Type字段的值为129,Code字段的值为0。
1 | ping6 2001:db8::2 -c 4 # 向R2发送4次Echo请求 |

与IPv4 Ping的差异
| 特性 | IPv4 Ping | IPv6 Ping |
|---|---|---|
| 协议依赖 | ICMP(协议号1) | ICMPv6(协议号58) |
| Echo请求类型 | Type=8 | Type=128 |
| Echo应答类型 | Type=0 | Type=129 |
| 地址解析 | ARP(广播) | NDP(组播,FF02::1:FFXX:XXXX) |
| MTU处理 | 支持分片 | 仅源节点分片(PMTUD依赖) |
ICMPv6应用:NDP
NDP的底层正是ICMPv6
IPv6邻居发现协议(Neighbor Discovery Protocol,简称NDP或ND)定义了5种类型的信息,包括:路由器宣告、路由器请求、路由重定向、邻居请求和邻居宣告,具体如下功能:(选择题常考)
路由器发现:发现链路上的路由器,获得路由器通告的信息。
无状态自动配置:通过路由器通告的地址前缀,终端自动生成IPv6地址。
重复地址检测:获得地址后,进行地址重复检测,确保地址不存在冲突。IPv4中,这是ARP的免费ARP功能
地址解析:请求目的网络地址对应的数据链路层地址,类似IPv4的ARP。
邻居状态跟踪:通过NDP发现链路上的邻居并跟踪邻居状态。IPv6维护一个邻居表,类似IPv4的ARP表
前缀重编址:路由器对所通告的地址前缀进行灵活设置,实现网络重编址。
重定向:告知其他设备,到达目标网络的更优下一跳。
以下是根据您提供的内容整理的IPv6邻居发现协议(NDP)核心功能表格,结合了相关技术文档的要点:
| 功能 | 描述 | 关键协议/报文 | 技术细节与引用 | |
|---|---|---|---|---|
| 路由器发现 | 主机通过定位邻居路由器,获取网络前缀、默认网关等配置参数。 | RS(133)、RA(134) | 主机发送RS请求(源地址为未指定地址或单播地址),路由器周期性发送RA报文,包含前缀、生存期等信息。 | |
| 无状态自动配置 | 基于路由器通告的前缀,结合EUI-64算法生成IPv6地址(如链路本地地址和全球单播地址)。 | RA(前缀信息)、EUI-64算法 | 接口ID由MAC地址转换生成(插入FFFE,反转第7位),支持地址自动生成。 | |
| 重复地址检测 | 在地址分配后,通过NS/NA报文检测链路内地址冲突,确保地址唯一性。 | NS(135)、NA(136) | 发送目标地址为被请求节点组播地址的NS报文,若收到NA响应则判定冲突,地址标记为”duplicate”。 | IPv4中,这是ARP的免费ARP功能 |
| 地址解析 | 替代IPv4的ARP协议,通过NS/NA报文解析目的IP对应的MAC地址。 | NS(135)、NA(136) | NS报文目的地址为被请求节点组播地址(FF02::1:FFxx:xxxx),响应NA携带链路层地址。 | 类似IPv4的ARP |
| 邻居状态跟踪 | 维护邻居可达性状态(如Reachable、Stale),通过NUD(邻居不可达检测)机制更新状态。 | NS/NA交互、状态机模型 | 包含5种状态(Incomplete→Reachable→Stale→Delay→Probe),通过周期性探测维护邻居表。 | IPv6维护一个邻居表,类似IPv4的ARP表 |
| 前缀重编址 | 动态更新网络前缀(如运营商切换),实现不中断服务的地址迁移。 | RA(新前缀通告) | 路由器发送携带新前缀的RA报文,主机根据新前缀重新生成地址,同时保留旧地址过渡。 | |
| 重定向 | 通知主机更优的下一跳路径(如同一链路存在多个路由器时优化路由)。 | 重定向报文(ICMPv6类型137) | 路由器检测到次优路径时,向源主机发送重定向报文,包含目标地址和更优网关地址。 |
NDP报文类型及功能
NDP使用以下几种ICMPv6报文:
133RS(Router Solicitation):路由器请求报文,一般是PC发出,找响应路由器获取IP前缀
134 RAA(Router Advertisement):路由器通告报文,一般是路由器发出,返回IP前缀,PC会利用这个前缀结合自己MAC地址生成相应IPv6地址
135 NS(Neighbor Solicitation):邻居请求报文,类似ARP请求
136 NA(Neighbor Advertisement):邻居通告报文,类似ARP通告

IPv6地址自动配置的分类
无状态地址自动配置
不需要IPv6地址分配服务器保存和管理每个节点的状态信息的一种IPv6地址自动配置方式,称之为IPv6无状态地址自动配置
无状态地址自动配置方式基于NDP来实现,分配得到的是一个IPv6前缀,具体生成的地址,分配中断并不记录
有状态地址自动配置
- IPv6地址分配服务器必须保存每个节点的状态信息,并管理这些保存的信息,这种方式称之为IPv6有状态地址自动配置
- 有状态地址自动配置基于DHCPv6(Dynamic Host Configuration Protocol for IPv6)来实现。
IPv6地址无状态自动配置过程
本节需要5-4-2 IPv6地址分类一节作为基础

- PC1根据本地的接口ID自动生成链路本地地址(链路本地地址,用于同一链路的相邻节点通信,结合MAC地址自动生成)
- PC1对该链路本地地址进行DAD检测,如果该地址无冲突则可启用,此时PC1具备IPv6连接能力,类似免费ARP
- PC1发送RS报文,尝试在链路上发现IPv6路由器,如果链路上有IPv6路由器,会回复RA报文
- R1发送RA报文(携带可用于无状态地址自动配置的IPv6地址前缀。路由器在没有收到RS报文时也能够主动发出RA报文)
- PC1解析路由器发送的RA报文,获得IPv6地址前缀,使用该前缀+接口ID生成IPv6单播地址(即5-4-2 IPv6地址分类中介绍的唯一本地地址)
- PC1对生成的IPv6单播地址进行DAD检测,如果没有检测到冲突,则启用该地址。
唯一本地地址(ULA):
前缀为 fd00::/8(属于fc00::/7范围),专门用于私有网络内部,类似IPv4的私有地址(192.168.0.0/16)。它通过伪随机生成的40位全局ID(Global ID)确保地址在组织内唯一,避免与其他私有网络冲突。
用途:企业内网、VPN等场景,支持跨站点的互联且无需担心地址重复
例题
