速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

评论

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

一文带你快速入门【哈希表】

Fire_Shield

数据结构 哈希表 9月月更

力扣93 - 复原IP地址【回溯算法】

Fire_Shield

LeetCode 字符串 9月月更

架构之美第一篇-概述

Marvin Ma

架构 企业架构 架构模式 架构三要素 架构发展历史

MyBatisPlus(四、代码生成器)

Mybatis-Plus 代码生成 9月月更

[SpringMVC]拦截器②(拦截器参数、拦截器链配置)

十八岁讨厌编程

springmvc 后端开发 9月月更

Qt|实现简单的分割窗口

中国好公民st

qt 分割 9月月更

利用flexible.js和VSCode插件cssrem进行可伸缩布局方案

海底烧烤店ai

前端 JavaScrip 响应式网页 9月月更

「趣学前端」Taro实践+踩坑记录第一期

叶一一

taro 前端 框架 9月月更

C++学习---cstdio的源码学习分析03-文件重命名函数rename

桑榆

c++ 源码阅读 9月月更

Flutter - Google 开源的移动 UI 框架

陈橘又青

9月月更

架构师的十八般武艺:架构目标

agnostic

架构目标

架构师的十八般武艺:架构方法论

agnostic

TOGAF Zachman

Redis的事件

急需上岸的小谢

9月月更

jQuery之实战

楠羽

笔记 JQuery框架 9月月更

网络入侵检测系统之Suricata(十五)--IPOnly/Radix Tree详解

于顾而言

网络安全 suricata

王者荣耀商城异地多活架构设计

张立奎

「趣学前端」自己动手丰衣足食的TS项目开发

叶一一

typescript 前端 ts 9月月更

4 张图了解 CI/CD 基础~

掘金安东尼

前端 9月月更

网络入侵检测系统之Suricata(十三)--网络安全威胁及攻击手段总览

于顾而言

网络安全 suricata

【算法实践】分块查找知多少?手把手带你实现分块查找

迷彩

数据结构 算法 9月月更 分块查找 查找算法

[SpringMVC]拦截器①(概述、入门案例)

十八岁讨厌编程

springmvc 后端开发 9月月更

网络入侵检测系统之Suricata(十四)--匹配流程

于顾而言

网络安全 suricata

网络入侵检测系统之Suricata(十六)--类suricata/snort规则自动维护工具

于顾而言

网络安全 suricata

[Maven进阶]分模块开发与设计

十八岁讨厌编程

maven 后端开发 9月月更

gopher成长之路(五): 2年前和2年后同一个项目

非晓为骁

个人成长

带你玩转NProgress进度条

海底烧烤店ai

前端 JavaScrip 9月月更

大数据调度平台Airflow(一):什么是Airflow

Lansonli

9月月更

SAP UI5 Form 表单 Column Layout 下的 Column 个数分配问题

汪子熙

JavaScript Fiori SAP UI5 ui5 9月月更

Java进阶(二十七)使用Dom4j解析XML文件

No Silver Bullet

Java xml 9月月更 DOM4J

redis对应的数据类型及其底层原理

知识浅谈

redis 底层原理 9月月更

[极致用户体验] 微信设置大字号后,iOS加载网页时闪动怎么办?

HullQin

CSS JavaScript html 前端 9月月更

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