IPv6-ICMPv6协议

IPv6系列文章:

1.IPv6-基础

2.IPv6-ICMPv6协议

3.IPv6-双栈/隧道



一、ICMPv6概述

在这里插入图片描述

ICMPv6是IPv6的基础协议,也是最重要的协议。ICMPv6有多种消息类型,IPv6中的很多功能都是利用ICMPv6中的一种或多种消息类型组合完成的。

ICMPv6在IPv6中的协议号为58,该协议号在 IPv6 报头的“next header”字段中。

ICMP 报文有两种:差错消息及信息消息

在这里插入图片描述

二、PMTUD

2.1 PMTUD概述

​ PMTU 就是路径上的最小接口 MTU。PMTUD 的主要目的是发现路径上的 MTU,当数据包被从源转发到目的地的过程中避免分段。依赖 PMTUD源节点可以使用所发现到的最小 PMTU 与目的地节点进行通信,这样可以避免数据包在从源传输到目的的过程之中,被中途的路由器分片,而导致性能的下降。因此 IPv6 的分片不是在中间路由器上进行的,仅当路径 MTU 比欲传送的数据包小的时候,由源节点自己对数据包进行分片。

2.2 之前的痛点

​ 在IPv4没有PMTUD时,客户端发送数据包只会参照本机网卡的MTU值进行发送,当整个数据链路中的某台路由器网卡的MTU小于客户端的MTU时,要想继续发送需要在网络层对数据包进行分片处理,此时会延迟数据包到达的时间,同时增加当前路由器的压力,导致性能下降。

2.3 PMTUD流程

在这里插入图片描述

  1. 首先 Source 用 1500 字节作为 MTU 向目标节点发送一个 IPv6 数据包

  2. 中间路由器 A 意识到数据包过大,MTU 为 1400,于是回复一个 ICMPv6 type=2 消息向 Source 应答,在该ICMPv6 消息中指定较小的 MTU=1400

  3. Source 开始使用 MTU=1400 发送 IPv6 数据包,该数据包到了 B

  4. 然而 B 意识到本地接口 MTU 为 1300,于是回复一个 ICMPv6 type=2 消息向 Source 应答

  5. Source 开始使用 MTU=1300 发送 IPv6 数据包,该数据包顺利到达了目的地。

  6. Source 和 Destination 之间的会话被建立起来。

三、NDP邻居发现协议(Neighbor Discovery Protocol)

在这里插入图片描述

NDP 可以帮助我们实现以下功能:

1. 地址解析(代替ARP协议,即主机A已知主机B的IP地址获取其Mac地址的过程)

2. 邻居的状态跟踪(主机A针对访问过的同一个路由器下的邻居主机间的IP-Mac关系跟踪)

3. 无状态自动配置(主机从路由器的RA消息中获取网络前缀拼接接口ID生成全局单播地址)

4. 重复地址检测DAD(本地链路地址和全局单播地址首次配置后都要先做DAD检查才能正式使用)

5. 前缀重编址(前缀重新编址允许从以前的网络平稳过渡到新的前缀,切换过程平滑,节点无感知)

6. 路由器重定向(在同一链路上路由重定向到最短路径,修改路由表下一跳地址)

3.1 NDP用到的 icmpv6 消息类型

在这里插入图片描述
在这里插入图片描述

3.2 地址解析,替代ARP

在这里插入图片描述

地址解析流程如下:

1.根据主机B的IP得到主机B的被请求组播地址=FF02::1:FF01/104 + 单播地址的后24位=FF02::1:FF01:B,再根据组播地址获取其组播Mac=33:33 + 组播地址的后32位=33:33:FF:01:00:0B;

2.发送ICMPv6 类型为135的NS消息。

3.主机B接收到后回复NA消息,并携带主机B的Mac地址

3.3 邻居状态跟踪

在这里插入图片描述

邻居状态跟踪流程:

  1. A 发送 NS,并生成缓存条目,A 上条目的状态为 Incomplete

  2. 若 B 回复 NA,则 A 上关于 B 的邻居状态就由 Incomplete ->Reachable。但若 A 发出 NS 消息后一定时间内仍没有收到任何的回复,则由 Incomplete->Empty,即删除条目

  3. 如果在 reachable 状态上经过 ReachableTime(默认 30S),A 路由器上关于 B 的条目状态 Reachable->stale或如果在 reachable 状态上,收到 B 的非请求 NA,且链路层地址不同,则马上->stale

  4. 在 Stale 状态若 A 要向 B 发送数据,可直接发送,并从 A 上关于 B 的条目由 Stale->Delay,同时会等待应用层的提示信息,提示邻居是否可达

  5. 如果在 Delay_First_Probe_Time(默认 5S)内,有 NA 应答或者应用层的提示信息(例如我发了 ICMP 包给对端,对端回复我 ICMP 了,那就是上层可达),则 Delay->Reachable,如果无应用层提示信息,Delay->Probe

  6. 在Probe状态,每隔RetransTimer(默认1S)发送单播NS,发送MAX_Unicast_Solicit个后再等RetransTimer,有应答则 Reachable,无则进入 Empty,即删除条目

3.4 无状态自动配置,前缀公告

3.4.1无状态自动配置概述

​ IPv6的地址配置分为手动配置和自动配置,其中自动配置分为有状态(DHCP)和无状态(RS/RA)两种。其中的无状态自动配置就是基于RS-RA消息完成的。无状态自动配置在主机接入一个IPv6的局域网后即使没有DHCP服务器也能自动完成ip地址的配置,做到了即插即用,大大节省了手动配置ip信息的时间。

3.4.2 无状态自动配置流程

在这里插入图片描述

  1. 主机网卡激活,随机生成网卡Link-local地址;

  2. 对Link-Local地址进行DAD重复地址检查;3.DAD通过后主机发送RS消息尝试发现IPv6路由器;

  3. IPv6路由器收到RS消息后,回复RA消息,在RA中包涵路由器的MAC地址,IPv6单播前缀等;

  4. 主机使用IPv6的单播前缀加上自己的64bit接口ID,构成IPv6的单播地址;

  5. 主机对该单播地址进行DAD检查,DAD通过后该地址即启用。

注:路由器的RA消息不一定要以RS消息为触发,也可以主动阶段性的在局域网发送RA消息,这种主动推送的模式称为前缀公告。

3.4.3 RA消息报文

在这里插入图片描述

3.5 重复地址检查(DAD)

3.5.1 机制概述

​ 无状态配置,和节点启动时的一个 NDP 机制。用于保证节点准备启用的 IPv6 单播地址在链路上的唯一

性。这个机制使用 NS 消息(ICMP 135),使用源地址(::)、目的地址为获取到的 v6 地址对应的被请求节

点组播地址的 NS 报文来完成这个任务。

3.5.2 机制原理

​ 一个地址在通过重复地址检测(DAD)之前称为“tentative 地址”,试验地址。接口还暂时不能使用这个

试验地址进行正常单播通讯,但是会加入和 tentative 地址所对应的 Solicited-Node 组播组。

重复地址检测:节点向一个自己将使用的 tentative 地址所对应的 Solicited-Node 组播地址发送一个 NS,

如果收到某个其他站点回应的 NA,就证明该地址已被网络上使用,节点将不能使用该 tentative 地址通讯。

3.5.3 重复地址检查流程

在这里插入图片描述

  1. 主机A基于DHCP或者无状态自动配置机制被分配了新的单播地址2000::1,此时2000::1不可用为‘tentative’临时地址。

  2. 主机A会向2000::1对应的被请求节点组播地址发送一个NS消息,源IP为::,源mac为主机A的Mac;目的IP为FF02::1:FF00:1,目的Mac为33:33:ff:00:00:01。

  3. 主机B接收到消息后向 **’FF01::2 节点本地范围所有路由器组播地址‘ **范围内回复一个NA消息告知2000::1已被占用起mac为主机B的mac

  4. 如果 1S 后主机A没有收到NA回复即没有检测到冲突,A 就会发送 non-solicited advertisement(一个 NA 消息),宣告大家我将正式使用这个 2000::1 IPv6 地址

3.6 前缀重编址

3.6.1 前缀重编址概述

前缀重新编址允许从以前的网络平稳过渡到新的前缀,切换过程平滑,节点无感知。

3.6.2 原理及流程

在这里插入图片描述

​ 在无状态配置篇幅中分析了RA消息的报文,每一个前缀option都会有两个时间一个是 Valid lifetime 前缀有效时间,另一个是 Preferred lifetime 前缀首选时间,在RA消息分析图中粉色标记位置。

  1. 主机根据RA消息网络前缀构成单播IP地址并进行DAD检测(Tentative);

  2. DAD检查通过后Valid lifetime和Preferred lifetime会进入倒计时,在Preferred lifetime期间(Preferred)当前地址为首选IP地址可以发送消息也可接收消息;

  3. 如果Preferred lifetime倒计时为0,Valid lifetime还未结束大于0,此阶段(Deprecated)该地址只能接收消息不能发送新消息;

  4. 如果Valid lifetime倒计时为0,此时(Invalid)该地址作废不能收发消息;注:主机收到RA消息后会取消息中的Valid和Preferred重置本地的Valid和Preferred。

有了上述理论铺垫,我们看下如何实现平滑的前缀重编址:

Ipv6 nd prefix 2001:0001::/64 43200 0 // 老前缀
Ipv6 nd prefix 2001:0002::/64 43200 43200 // 新前缀

​ 通过路由器发布两个RA前缀公告,一个是老前缀,一个新前缀。其中老前缀的Preferred lifetime=0或者趋近于0,主机收到老前缀RA后老前缀的IP地址迅速进入Deprecated阶段只能收消息。新前缀的Preferred lifetime正常,主机收到新前缀后会根据新前缀进行DAD检测,检测通过后新IP地址进入Preferred节段全面代替老IP地址。

​ 在IPv6中主机向路由器网关发送消息默认通过Link-local地址,所以路由器前缀变动不会影响主机向其发送消息,而路由器转发链路外消息给主机时由于存在 Deprecated阶段所以 不会影响主机接收消息,整个过程平滑过渡。

注:建议链路内主机直接通信直接采用Link-local地址通信,这样链路内通信在前缀重编址期间就也不受影响了

3.7 路由重定向

3.7.1 路由重定向概述

​ 路由器使用 ICMPv6 重定向消息(ICMP TYPE 137)通知链路上的节点,在链路上存在一个更好的前转数据包的路由器。接收到这个 ICMPv6 重定向消息的节点可以根据重定向消息中新的路由器地址修改它的本地路由选择表。基本上从机制上来将跟 IPv4 的 ICMP 重定向没啥两样。

​ 在 IPv6 规范中,不推荐使用可聚合全球单播或本地站点地址作为下一跳地址,如果这样做,ICMPv6 重定向消息就不会工作。因此使用 Linklocal 地址作为下一跳,在某些场合可能更为推荐,毕竟 linklocal 地址稳定且长久不变。在配置 linklocal 地址作为下一跳 IP 时,必须关联路由器上相应的接口。

3.7.2 路由重定向流程

​ 场景:如上图场景R3要发消息给2222::1/64,R3本地路由表指示下一跳为R1,然后再由R1发送给R2,但是明显R3和R2在同一个链路上是可以直接发送给R2的不用经过R1中转,此时如果三台路由器之间互相使用Link-local 地址作为吓一跳配置时就会触发路由重定向。

在这里插入图片描述

  1. R3根据本地路由表中的下一跳地址发消息给R1

在这里插入图片描述

  1. R1发现他的下一跳地址为Link-local地址R2与R3在同一链路上,则回复R3一个路由重定向的ICMPv6报文,其中包含R2的Link-local地址。

在这里插入图片描述

  1. R3收到消息后修改本地路由表的下一跳IP为R2的Link-local,并重新发送数据包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFIyZU2V-1658064145985)(/Users/yangxiaofei/Library/Application Support/typora-user-images/image-20220717195501895.png)]

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值