写点什么

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:076293

评论

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

GIS :元宇宙未来发展的有力技术支撑

华为云开发者联盟

AI GIS 虚拟世界 数字孪生 云宇宙

java开发之Redis的使用规范

@零度

redis JAVA开发

Serverless 背景下,一部分“前端工程师”会转变为“应用交付工程师”

杨成功

Serverless 架构 前端

我相信:没有解不开的难题|ONES 人物

万事ONES

Chrome插件:摸鱼倒计时、每日摸鱼时间统计,奋斗逼、卷王必备,用于减少摸鱼时间和频率

OBKoro1

效率 开源 效率工具 chrome扩展 高效率

TDSQL PG版企业级分布式数据库技术创新实践

腾讯云数据库

tdsql 国产数据库

龙蜥社区一周动态 | 1.10-1.14

OpenAnolis小助手

Linux 开源 社群

Android技术分享| 自定义View实现使用更方便的SeekBar

anyRTC开发者

android 音视频 移动开发 白板 SeekBar

CSS 自适应内容宽度的输入框

编程江湖

大数据开发之通过 Spark 来扩展 Presto

@零度

大数据 spark

Hive SQL底层执行原理

五分钟学大数据

Hive SQL 1月月更

线上流量对比应用实践

得物技术

架构 数据 流量 实践 流量回放

TDSQL-C for PostgreSQL 主从架构详解

腾讯云数据库

tdsql 国产数据库

MySQL分区表简介

soap said

:MySQL 数据库

为什么HashMap会产生死循环?

王磊

2021 OceanBase 开源半年度报告 | 不忘初心,感恩同行

OceanBase 数据库

开发者 报告 OceanBase 开源 OceanBase 社区版

创业老兵李峻的新征程|ONES 人物

万事ONES

ONES CTO 冯斌|如何低成本地做出高质量决策

万事ONES

知识库进化论 | 华创资本对话 ONES & 为知笔记创始人

万事ONES

Scrum Master需要具备哪些能力和经验

华为云开发者联盟

Scrum 敏捷 团队 教练 Scrum Master

TDSQL | 将企业级分布式数据库做到极致

腾讯云数据库

tdsql 国产数据库

ReactNative进阶(二十三):Javascript 严格模式详解

No Silver Bullet

React Native 1月月更

虎符研究院深入解读Web3.0未来趋势 盘点代表性项目

区块链前沿News

Web Hoo虎符 虎符研究院 虎符平台 3.0

前端使用 zx 库在 Node 中编写 Shell 脚本

devpoint

node.js Shell 1月月更 zx.js

Jetpack—LiveData组件的缺陷以及应对策略

vivo互联网技术

android livedata JetPack 移动应用开发

前端开发之JQuery的综合应用

@零度

jquery 前端开发

使用php-amqplib实现RabbitMq

Owen Zhang

php RabbitMQ php-amqplib

1月月更|推荐学java——Spring之AOP

逆锋起笔

spring SSM框架 spring aop 依赖注入 面向切面编程

我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式

华为云开发者联盟

Java 工厂模式 工厂方法模式 简单工厂模式 抽象工厂模式

组件通信、硬件池化,这些创新技术你get了吗?|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

软件设计——依赖倒置

苏州程序大白

架构师

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