【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

评论

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

盘点 2021 | 云原生拥抱之路

xcbeyond

程序人生 云原生 盘点2021 xcbeyond

千万级学生管理系统的考试试卷存储方案

swallowluo

架构实战营 #架构实战营 「架构实战营」

获奖公布!OceanBase 第一届技术征文大赛圆满收官!

OceanBase 数据库

开发者 征文大赛 oceanbase OceanBase 开源

架构实战训练营-模块5-作业

温安适

「架构实战营」

盘点 2021|考研,裸辞——混乱中寻找秩序,2021后记

某个Coder

盘点 2021

面试官:为什么不同返回类型不算方法重载?

王磊

一份简单够用的 Nginx Location 配置讲解

冴羽

nginx 后端 博客 后端开发 博客配置

架构训练营 week4 作业

红莲疾风

「架构实战营」

数据库批量插入这么讲究的么?

秦怀杂货店

Java 数据库 批量插入

03 Prometheus之架构及数据模型

穿过生命散发芬芳

Prometheus 1月月更

【新年互动搞起!】元旦快乐!这里是2022年的 OceanBase

OceanBase 数据库

开发者 OceanBase 社区版 2022年新年祝福 元旦

【LeetCode】统计特殊四元组Java题解

Albert

算法 LeetCode 1月月更

ReactNative进阶(一):ReactNative 学习资料汇总

No Silver Bullet

React Native 1月月更

一个cpp协程库的前世今生(九)协程参数与返回值的处理

SkyFire

c++ cocpp

首次!中西方数据库大咖“时空对话”,为中国分布式数据库开发者大会打call

OceanBase 数据库

OceanBase 开源 OceanBase 社区版 开发者大会

川大记忆

wood

300天创作 川大

Prometheus云原生监控:运维与开发实战

方勇(gopher)

云原生 #Prometheus

(1-2/2)AI的落地:读caoz的文章有感

mtfelix

无限生长 2022Y300P

hw8-设计消息队列存储消息数据的MySQL表格

WWH

架构实战营

《张汉东的 Rust 实战课》学习笔记

贾献华

写时复制技术(COW)详解

小梁编程汇

性能优化 操作系统 CopyOnWrite;

(1-1/1)底层逻辑读后感:三种对错观四类表述

mtfelix

无限生长 2022Y300P

世界女性科技群落(五):数字化黄金时代,东南亚女性都是隐藏的阿尔法

脑极体

盘点 2021|一个普通人的不普通的2021

慕枫技术笔记

程序人生 盘点 2021

LabVIEW纹理分析(基础篇—9)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 纹理分析

设计微博评论的高性能高可用计算架构

drizzle

「架构实战营」

Flutter 让你的Dialog脱胎换骨吧!(Attach,Dialog,Loading,Toast)

小呆呆666

flutter ios android 前端 大前端

分布式系统必知必会

小梁编程汇

分布式 分布式系统 共识算法 分布式通信算法 #raft

C++ 动态内存分配的问题,你都懂了吗?

小梁编程汇

c++ 堆内存管理 内存分配 smart pointer

Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据

万俊峰Kevin

微服务 stream go-zero Go 语言

Kafka原理——Kafka为何如此之快?

Kafka中文社区

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