1. 通用消息格式
- 每条ICMPv6消息的前面都有一个下一报头(Next Header)值为58的IPv6报头。报头不必是IPv6基本报头,可以是第3章中讨论过的任何一种IPv6扩展报头。
所有的ICMPv6消息都有相同的通用格式。
-
类型(Type, 8比特):表示ICMPv6消息的类型,如回显请求、目的地不可达或数据包超大消息。
-
代码(Code,8比特):为类型字段提供更精确的说明,其含义取决于消息类型。例如,如果消息类型是目的地不可达,那么代码字段就会说明数据包为何无法到达其目的地,如主机不可达或路由器的路由表中没有去往主机所在网络的路由。
-
校验和(Checksum ,16比特):用于检测ICMPv6消息以及部分IPv6报头中的数据损坏。
类型字段将ICMPv6消息分为两类:
- 差错消息(类型=0~127);ICMPv6差错消息的作用是告诉设备其发送的数据包无法被正确传送的原因,如已达到跳数限制(递减到0)并被路由器丢弃。
- 通知消息(类型=128~255 ):ICMP通知消息的作用不是报告差错,而是为各种测试、诊断和支撑功能提供必需的信息。IPv4和IPv6都有的两条常用通知消息就是ping命令使用的回显请求消息和回显应答消息。
2. 差错消息
三层设备(如主机和路由器)使用ICMPv6差错消息通知发送端为何无法传送数据包。如表5-1所示,差错消息分为4类:
-
目的地不可达消息;
-
数据包超大消息;
-
超时消息;
-
参数问题消息。
2.1 目的地不可达
1.产生原因
当数据包因拥塞之外的其他原因而无法被传送到目的地时,就会发送ICMPv6目的地不可达消息。该反馈消息的作用是让发送端知道重发数据包的原因。路由器和防火墙通常都会生成这类目的地不可达消息。
2.目的地不可达消息的格式。
3.目的地不可达的原因有7种:
-
代码=0,无去往目的地的路由:数据包无法被传送的原因是路由器没有去往目的地的路由,这仅发生在路由器的路由表中无默认路由的场合。
-
代码=1,与目的地的通信被管理性地禁止:数据包被阻塞的原因是访问控制列表或其他包过滤机制。
-
代码=2,超出了源地址范围:当源地址是链路本地地址且目的地址是全局单播地址时,就会生成该差错消息。
-
代码=3,地址不可达:该差错消息表明数据包在发送过程中出现问题的原因是目的地址中指定的主机不可达,这仅发生在目的地址无法被解析为相应的链路层地址(LAN中的MAC地址)或目的地址错误时。该消息等同于ICMPv4中的主机不可达消息。
-
代码=4,端口不可达:该差错消息的原因是TCP或UDP报头中指定的目的端口不存在或目的地不在该端口上进行侦听。例如,如果发送的数据包的TCP目的端口为80,但接收主机却没有运行HTTP Web服务,那么就会发送端口不可达消息.
-
代码=5,源地址与入站/出站策略相抵触:该差错消息表明具有该源地址的数据包因为访问控制列表或其他包过滤机制而被阻塞了。代码5是代码1的子集。
-
代码=6,拒绝路由到目的地:该差错消息出现的原因是带有指定前缀的数据包被访问控制列表或其他包过滤机制阻塞了。代码6是代码1的子集。
4.数据包超大
-
IPv6的一个重大变化就是数据包的分段和重组。对IPv4来说,当出链路的MTU小于数据包的尺寸时,路由器就会执行分段操作。目的端设备就要对分段后的数据包进行重组。
-
路由器可以根据需要对数据包进行分段,这看起来比较方便,但实际上也会影响路由器的效率。因此,IPv6删除了路由器的该功能,仅允许数据包的源端执行分段操作。
-
当IPv6路由器收到的数据包大于出站接口的MTU时,就会丢弃该数据包并向源端发送ICMPv6数据包超大消息。数据包超大消息中包含了该链路的MTU值(以字节为单位),因此源端能够在调整数据包大小后再重发数据包。
路径MTU发现的原理:
5.目的地不可达
- 超时:路由器在转发数据包之前,会将跳数限制字段递减1,这一点与IPv4的TTL字段相同,只是在字段名称上更能明确地反映该功能。当跳数限制字段递减到0时,该数据包就会被丢弃,并向源端发送ICMPv6超时消息。对于IPv4和IPv6来说,这是一种避免数据包在网络中被无休止传送的保证机制。
- 参数问题:设备在处理数据包时,如果发现IPv6基本报头或扩展报头中存在字段问题,那么就会生成ICMPv6参数问题差错消息,这就意味着接收端无法理解IPv6报头中的信息,因而必须丢弃该数据包。出现该问题的原因是扩展报头中存在争议的字段是无效的,或者该设备不支持扩展报头。
3. 通知消息
ICMPv6通知消息用来帮助设备发现原因并在设备之间共享信息。
3.1 ICMPv6拥有以下通知消息
ping命令使用的消息如下:
- 回显请求消息;
- 回显应答消息。
多播侦听发现使用的消息如下:
-
多播侦听查询消息;
-
多播侦听报告消息;
-
多播侦听完成消息。
邻居发现使用的消息如下:
-
路由器请求消息;
-
路由器宣告消息;
-
邻居请求消息;
-
邻居宣告消息;
-
重定向消息。
3.2 多播侦听者发现
IPv6利用ICMPv6 MLD (Multicast Listener Discovery,多播侦听者发现)来发现哪些多播组仍然有效。
MLD有三种消息:
1. 多播侦听者查询消息
(Multicast Listener Query,类型=十进制130):
路由器周期性地发送主机成员关系查询消息,以确定哪些多播组仍然有成员在路由器直连的网络上。多播侦听查询消息有两个子类型。
- 通用查询(General Query):该消息用于学习直连链路上哪些多播地址有侦听者。通用查询消息发送给链路范围的全部节点多播地址FF02::1,该链路上的所有IPv6设备都能收到该消息。
- 特定多播地址查询(Multicast-Address-Specific Query ):该消息用于学习直连链路上是否有特定多播地址(多播组)的侦听者,会向被查询的多播地址发送指定地址查询(Address-Specific Query)消息。
2. 多播侦听者报告
(Multicast Listener Report,类型=+进制131):
侦听者通过发送该消息向多播组进行注册。侦听者不但可以发送该消息作为查询的响应消息,而且还可以自主发送该消息,而无需等待路由器发送来的查询消息。
3、多播侦听者完成
(Multicast Listener Done,类型=十进制132):
当侦听者不希望接收某特定多播组的流量时,就会发送一条多播侦听者完成消息,以通知路由器其将要离开该多播组。多播侦听者完成消息会被发送给链路范围的全部路由器(all-routers)多播地址FF02::2。
通用查询消息和多播侦听者报告消息的示例:
4. 邻居发现协议
4.1 基本功能
邻居发现协议中包含了与IPv4的ARP, ICMP路由器发现和重定向等相似进程,但是也存在很多重要差异。
此外,ND还增加了很多新功能,如DAD和NUD (Neighbor Unreachability Detection,邻居不可达性检测)。邻居发现在IPv6地址的自动配置机制中扮演了非常重要的角色。
设备 (主机和路由器)使用邻居发现协议可以实现:
-
SLAAC,自动确定网络前缀、默认网关及其他配置信息。
-
确定自己将要使用的链路本地地址或全局单播地址是否被其他设备所使用 (DAD)。
-
识别出目的IPv6地址之后,确定网络上的设备的二层数据链路地址(通常是以太网)。
-
了解哪些邻居可达以及哪些邻居不可达(NUD)。
-
当路由器或去往路由器的路径出现故障后,主机主动寻找相应的替代设备或路径。
4.2 邻居发现协议用到的5种ICMPv6消息:
4.2.1 路由器请求(RS)消息;
IPv6设备分为两大类:路由器和主机。
路由器请求消息和路由器宣告消息用于主机与路由器之间的通信过程。
路由器周期性地发送路由器宣告消息或者响应链路上的主机发送的路由器请求消息。主机通过发送路由器请求消息,要求路由器立即发送路由器宣告消息。
当主机需要前缀、前缀长度、默认网关以及其他用于SLAAC进程的相关信息时,就会发送路由器请求(RS)消息。这通常发生于主机刚刚加电并被配置为自动获取其IP地址的场合下。
4.2.2 路由器宣告(RA)消息;
M标记(M Flag ):
该字段是被管地址配置(Managed Address Configuration )标记。M标记为0时,网络上的主机使用SLAAC; M标记为1时,网络上的主机使用DHCPv6。’
R1(config-if)#ipv6 nd managed-config-flag
O标记(O Flag )
该字段是其他配置( Other Configuration)标记。O标记为0时,表示DHCPv6服务器没有其他可用信息;O标记为1时,告诉主机可以从DHCPv6服务器获得额外信息,如与DNS相关的信息。
配置f0/0端口IPv6地址,并no sh;
R1(config-if)#ipv6 nd managed-config-flag
R1#debug ipv6 nd
R1(config-if)#ipv6 nd ra-interval 20;debug间隔20秒。
4.2.3 邻居请求(NS )消息;
ICMPv6邻居发现协议使用的另外两种消息是邻居请求消息和邻居宣告消息。
设备利用这些消息向同一网络上的其他设备请求二层(即链路层)地址或者向请求设备提供该信息。邻居请求和邻居宣告消息是以下三个重要进程的组成部分:
-
地址解析;
-
DAD (Duplicate Address Detection,重复地址检测);
-
NUD ( Neighbor Unreachability Detection,邻居不可达性检测)。
-
邻居请求和邻居宣告消息非常类似于IPv4中的ARP请求和ARP应答消息。设备通过发送邻居请求消息来请求目标设备(target device)的二层(链路层)地址,同时也向目标设备提供自己的链路层地址。这些链路层地址通常是以太网MAC地址。邻居宣告消息既可以作为邻居请求消息的响应消息,也可以根据需要向外发送以快速传播新信息。
-
主机需要为每个接口维护两张表或缓存表:
-
邻居缓存表;
-
目的地缓存表。
-
邻居缓存表等同于IPv4的ARP缓存表。邻居缓存表负责维护最近流量所送往邻居的信息列表,表项中包含了IPv6单播地址及其相对应的二层地址(通常是以太网MAC地址)。设备通过收到的邻居宣告消息中的信息来维护该缓存表。邻居宣告消息中的R比特会表明该设备是否是路由器。
4.2.4 邻居宣告(NA)消息;
实验slacc-1,无状态自动配置
邻居缓存表项一共有5种状态:
1.地址解析
-
地址解析是使用邻居请求消息和邻居宣告消息的进程之一,该进程类似于IPv4中的ARP进程。
-
如图5-17所示,PC1正在ping PC2 。
-
PC1在发送回显请求消息之前,必须首先确定PC2的二层地址(链路层地址),从而能够将IPv6数据包封装到以太网帧中。
2.请求节点多播地址
-
除了常见的多播地址(如全部节点多播地址FF02::1之外,IPv6接口还会接收发往其请求节点多播地址的数据包。
-
设备会利用特殊的映射技术为其每个单播地址自动创建一个请求节点多播地址。请求节点多播地址是通过将前缀FF02:0:0:0:0:1:FF00:😕 104附加到单播地址最后24比特之上创建而成的。如图5-18所示,PC2的请求节点多播地址是前缀FF02:0:0:0:0:1:FF00::/104
-
例子
-
-
-
3.重复地址检测示例
4.邻居不可达性检测
-
NUD(Neighbor Unreachability Detection,邻居不可达性检测):由于两台IPv6设备之间出现通信故障的原因可能非常多,如主机掉电或电缆故障,因此设备需要主动跟踪数据包将要发往的邻居的可达性状态。
-
确认可达性的方式有两种:
-
响应邻居请求消息的邻居宣告消息;
-
上层进程指示连接成功,如活动TCP连接中的确认消息。
5. 无状态地址自动配置
SLAAC 是一种允许主机通过组合本地可用信息与路由器宣告的信息生成自己的单播地址的机制。自动配置进程包括通过SLAAC生成链路本地地址和全局地址,还包括重复地址检测的步骤,以用来验证地址在链路上的唯一性。
4.2.5 重定向消息
ICMPv6重定向作用是通知设备有更优的下一跳路由器,工作方式与IPv4中的重定向消息相同。
IPv6实验四:IPv6路由选择协议配置
【学习资料】
【01学习笔记】
- 《IPv6技术精要(第二版)》导读
- IPv6技术精要–第1章 IPv6简介
- IPv6技术精要–第2章 入门
- IPv6技术精要–第3章 对比IPv4和IPv6
- IPv6技术精要–第4章 IPv6地址表示方法
- IPv6技术精要–第5章 IPv6公网单播地址
- IPv6技术精要–第6章 IPv6本地链路单播地址
- Pv6 技术精要–第7章 IPv6多播地址
- IPv6技术精要–第8章 IPv6动态地址分配原理
- IPv6技术精要–第9章 无状态地址自动配置SLACC
- IPv6技术精要–第10章 无状态DHCPv6
- IPv6技术精要–第11章 有状态DHCPv6
- IPv6技术精要–第12-13章 ICMPv6和邻居发现协议(ND协议)
- IPv6技术精要–第14-16章 IPv6路由选择
- IPv6技术精要–第17章双栈和隧道
【02课程实验】
- IPv6实验一:VMware:主机使用IPv6地址ping通本地虚拟机
- IPv6实验二:子网划分及静态地址配置(思科GNS3)
- IPv6实验三:三种IPv6动态地址分配方法(含无状态SLAAC、有状态DHCPv6、两者结合)
- IPv6实验四:IPv6路由选择协议配置
- IPv6实验五:IPv4到IPv6的过渡