写点什么

IPv6 排障工具之 ping6 完整过程细节剖析

  • 2020-01-19
  • 本文字数:3425 字

    阅读完需:约 11 分钟

IPv6排障工具之ping6完整过程细节剖析

一、ICMPv6 简介

ICMPv6(Internet Control Message Protocol for the IPv6)是 IPv6 的基础协议之一。ICMPv6 具备向源地址报告关于向目的地传输 IPv6 数据包过程中的差错信息和控制信息。


ICMPv6 定义了一些消息,如:目的不可达、数据包超长、超时、响应请求和响应应答等。在 IPv6 中,ICMPv6 除了提供 ICMPv4 常用的功能之外,还有其它一些功能,如邻接点发现、无状态地址配置(包括重复地址检测)、PMTUD 等。

二、ICMPv6 报文格式

ICMPv6 报文格式如下图所示:



ICMPv6 属于 OSI 七层协议栈的网络层,虽然和 IPv6 属于同一层,但是封装时必须先封装 IPv6 报文头部


ICMPv6 字段注释:


  • Type:表明消息的类型,0 至 127 表示差错报文类型,128 至 255 表示信息报文类型。

  • Code:表示此消息类型细分的类型。

  • Checksum:表示 ICMPv6 报文的校验和。

三、ICMPv6 差错报文

ICMPv6 差错报文用于报告在转发 IPv6 数据包过程中出现的错误,可以分为以下 4 种:


1. 目的不可达错误报文


在 IPv6 中间设备转发 IPv6 报文过程中,当设备发现目的地址不可达时,就会向发送报文的源地址发送 ICMPv6 目的不可达错误报文,同时报文中会携带引起该错误报文的具体原因。


目的不可达错误报文的 Type 字段值为 1,根据错误具体原因又可以细分为:


Code=0:没有到达目标设备的路由。


Code=1:与目标客户端的通信被管理策略禁止。


Code=2:未指定。


Code=3:目的 IP 地址不可达。


Code=4:目的端口不可达。


2. 数据包过大错误报文


在 IPv6 中间设备转发 IPv6 报文过程中,发现报文超过出接口的链路 MTU 时,则向发送报文的源地址发送 ICMPv6 数据包过大错误报文,其中携带出接口的链路 MTU 值。数据包过大错误报文是 Path MTU 发现机制的基础。


数据包过大错误报文的 Type 字段值为 2,Code 字段值为 0。


3. 时间超时错误报文


在 IPv6 报文收发过程中,当设备收到 Hop Limit 字段值等于 0 的数据包,或者当设备将 Hop Limit 字段值减为 0 时,会向发送报文的源地址发送 ICMPv6 超时错误报文。对于分段重组报文的操作,如果超过定时时间,也会产生一个 ICMPv6 超时报文。


时间超时错误报文的 Type 字段值为 3,根据错误具体原因又可以细分为:


Code=0:在传输中超越了跳数限制。


Code=1:分片重组超时。


4. 参数错误报文


当目的节点收到一个 IPv6 报文时,会对报文进行有效性检查,如果发现问题会向报文的源地址回应一个 ICMPv6 参数错误差错报文。


参数错误报文的 Type 字段值为 4,根据错误具体原因又可以细分为:


Code=0:IPv6 基本头或扩展头的某个字段有错误。


Code=1:IPv6 基本头或扩展头的 NextHeader 值不可识别。


Code=2:扩展头中出现未知的选项。

四、ICMPv6 信息报文

ICMPv6 信息报文提供诊断功能和附加的主机功能,比如组播侦听发现和邻居发现。


常见的 ICMPv6 信息报文主要包括回应请求报文(Echo Request)和回应应答报文(Echo Reply),这两种报文也就是通常使用的 Ping6 报文。可以分为以下 2 种:


1. 回应请求报文


回应请求报文用于发送到目标地址,以使目标地址立即发回一个回应应答报文。回应请求报文的 Type 字段值为 128,Code 字段的值为 0。


2. 回应应答报文


当收到一个回应请求报文时,ICMPv6 会用回应应答报文响应。回应应答报文的 Type 字段的值为 129,Code 字段的值为 0。

五、ping6 完整过程梳理

如下图所示,云主机 CVM1 要和 CVM2 通信(假设 CVM 的 IPV6 地址和 VPC 已经按文档https://cloud.tencent.com/document/product/213/40010正常配置且 IPV6 路由和地址检查都正常)。



从 CVM1 输入命令 ping6 2402:4e00:1200:2001::2020 -c 10,输出的结果如下图所示:



这是一次成功的 ping6 测试,但是这次 ping6 的细节大家也许不太了解。接下来我们主要按 OSI 协议栈来剖析整个 ping6 的工作过程以及整个过程会用到的相关报文。



Step1:ICMPv6 创建一个 56 字节的回应请求:



Step2:ICMPv6 在 56 字节的请求数据基础上加上 ICMPv6 头部:



回应请求报文的 Type 字段值为 128,Code 字段的值为 0,然后交给 IPv6 协议封装;


Step3:IPv6 协议在 ICMPv6 基础上增加 IPv6 头部:(网络层封装)



封装的源 IPv6 地址是接口网卡 v6 地址:2402:4e00:1200:2002::2011


封装的目标 IPv6 地址:2402:4e00:1200:2001::2020


Step4:根据目标 IPv6 地址和本地网段前缀做对比,发现目标地址不属于本地网段 2402:4e00:1200:2002::/64。只能查路由表进行跨网段路由,查找路由表发现没有匹配的明细路由,最终只能选择默认路由::/0 进行转发。



Step5:通过默认路由找到可以通过网卡 eth0 进行转发,但是需要数据链路层封装成功后才能从网卡转发出去。数据链路层封装的源 MAC 就是出接口 eth0 的 MAC 地址,目标 MAC 地址要从 ip -6 neigh 表(类似 IPv4 的 ARP 表)中查询到。



这里并没有学习到目标 IPv6 地址 2402:4e00:1200:2001::2020 对应的 MAC 地址,导致无法进行数据链路层封装。


Step6:为了学习到目标地址 2402:4e00:1200:2001::2020 对应的 MAC 地址,首先发送 NS 报文:Type 字段值为 135,Code 字段值为 0,在地址解析中的作用类似于 IPv4 中的 ARP 请求报文。



这里面存在着两个问题,下面我们也会给出相应的解释:


(1)被请求节点组播 IPv6 地址 FF02::1:FF00:2020 如何生成?


IPv6 中没有广播地址,也不使用 ARP。但是仍然需要从 IP 地址解析到 MAC 地址的功能。


在 IPv6 中,这个功能通过邻居请求 NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个 IPv6 地址对应的 MAC 地址时,会发送 NS 报文,该报文的目的 IP 就是需要解析的 IPv6 地址对应的被请求节点组播地址,只有具有该组播地址的节点会检查处理。


被请求节点组播地址由前缀 FF02::1:FF00:0/104 和目标单播地址的最后 24 位组成。由于目标单播地址是 2402:4e00:1200:2001::2020,所以生成的被请求节点组播地址是:FF02::1:FF00:2020。


(2)被请求节点组播 MAC 地址 33:33:ff:00:20:20 如何生成?


组播 MAC 地址 48bit 的前 24bit 默认固定是 33:33:ff,后半部分是被请求节点组播地址的后 24bit,所以生成的组播 MAC 地址是 33:33:ff:00:20:20。


Step7:CVM1 发送的 NS 请求报文给到虚拟网关路由器,虚拟网关路由器收到 NS 报文后查看路由表匹配到路由 2402:4e00:1200:2001::/64,代理目标地址回复一个 NA 报文:Type 字段值为 136,Code 字段值为 0,在地址解析中的作用类似于 IPv4 中的 ARP 应答报文。



IPv6 地址解析示意图:



学习到目标地址 2402:4e00:1200:2001::2020 对应的 MAC 地址是 fe:ee:1e:1b:cb:e0。学习到的 MAC 存入到 IPV6 邻居表中:



Step8:回到 Step5 有了目标 IPv6 地址 2402:4e00:1200:2001::2020 对应的 MAC 地址可以进行数据链路层封装,然后从网卡 eth0 发出第一个 ICMPv6 的回应请求报文:



从第一个 NS 到第一个 ICMPv6 回应请求的发出顺序如下:(CVM1 的网卡抓包)



Step9:该回应请求报文到达虚拟网关路由器 A 后查路由表找到对应的 overlay 网络隧道(这里的虚拟网关和 overlay 网络暂不用展开)转发到目标虚拟网关路由器 B,然后由虚拟网关路由器 B 转发给 CVM2 的 eth0 网卡。



Step10:CVM2 的网卡 eth0 收到回应请求报文后通过二层帧头的 type 字段,确认递交给 IPv6 协议处理。



Step11:IPv6 协议处理头部,检查目标 IP 正确,检查下一个协议头部类型是 ICMPv6。




Step12:当收到一个回应请求报文时,ICMPv6 会用回应应答报文响应。回应应答报文的 Type 字段的值为 129,Code 字段的值为 0。


CVM2 按同样的方式去查路由表封装网络层报文,按 Step5 到 Step7 解析到 MAC 后,查 ipv6 邻居表封装数据链路层的目的 MAC。


具体 CVM2 从收到第一个回应请求报文到发出第一个回应应答报文顺序如下:



NS 报文:



NA 报文:



学习到 MAC 后发送回应应答报文:



Step13:该回应应答报文到达虚拟网关路由器 B 后查路由表找到对应的 overlay 网络隧道转发到目标虚拟网关路由器 A,然后由虚拟网关路由器 A 转发给 CVM1 的 eth0 网卡。


Step14:CVM1 和 CVM2 以及虚拟路由器 A 和 B 都已经缓存了对应 IPv6 地址的 MAC,后续封装无效再发送 NS 与 NA,直接数据链路层封装后路由转发即可。


CVM1 完整的 10 个 ping6 报文截图如下:



CVM2 完整的 10 个 ping6 报文截图如下:



CVM1 的 ping6 成功的截图如下:



到此一次完整的 ping6 的过程就结束了,同样的道理,其他协议报文也是有这样的一个封装和解封装过程,希望本文能够让对大家有所帮助。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接


https://mp.weixin.qq.com/s/ipEd9HMdMPP0PFFtYNK60Q


2020-01-19 15:076554

评论

发布
暂无评论
发现更多内容

鼠标自动点击工具 RapidClick for Mac激活最新版

南屿

Mac软件 RapidClick破解版

VJ创作表演:Resolume Arena 6 for Mac中文版 含esolume arena 破解补丁

南屿

AE脚本-一键快速输出GIF动图格式插件 GifGun v2.0.15激活版

南屿

谁说后端不能画出美丽的动图?让我来给大家拜个年!

不在线第一只蜗牛

Java JavaScript 后端 动图

软件测试学习笔记丨JMeter_实现分组并发

测试人

软件测试

2024谷歌SEO入门指南

九凌网络

Bartender 5 for mac自定义隐藏及显示菜单栏

南屿

Excel复杂表头按组按行复制

alexgaoyh

Java POI 合并单元格 复杂表头 模板生成

数维图数字孪生:能源电力行业三维可视化系统合集

2D3D前端可视化开发

大数据 物联网 可视化 智慧电力 数字孪生

NFTScan 与 OneID 达成合作伙伴,支持多类型 DID 搜索!

NFT Research

NFT NFTScan

什么是DDOS流量攻击,DDoS防护安全方案

德迅云安全杨德俊

如何将照片组合在一起?图片照片拼接合成软件合集

南屿

照片编辑 图片拼接 照片合成

Mac好用的多窗格文件管理器QSpace Pro v4.0.4中文版

南屿

Total Video Converter Pro超级转霸 Mac视频转换软件 v5.1.0下载

南屿

海外云手机开辟企业跨境电商新道路

Ogcloud

云手机 海外云手机 tiktok云手机 云手机海外版

云手机解决tiktok登录不上的问题

Ogcloud

云手机 海外云手机 tiktok云手机 云手机海外版 国外云手机

大模型开发:从数据挖掘到智能应用

百度开发者中心

人工智能 大数据 大模型

区块链游戏解说:什么是 SecondLive

Footprint Analytics

区块链 加密货币 代币 NFT

聚道云软件连接器:打通金蝶云星空与招商银行CBS,提升企业财务和银行业务效率

聚道云软件连接器

案例分享

如何查看电脑性能跑分?Geekbench极客系统跑分工具

南屿

UML建模工具Astah Professional,实现逼真模型,让设计更加生动!

南屿

海外云手机对于亚马逊卖家的作用

Ogcloud

云手机 海外云手机 云手机海外版

IPv6排障工具之ping6完整过程细节剖析_技术管理_云加社区_InfoQ精选文章