写点什么

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

评论

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

Flutter动画:用Flutter来实现一个拍手动画

android 程序员 移动开发

Flutter的原理及美团的实践(中)

android 程序员 移动开发

Flutter:基于video_player实现视频相关手势控制、全屏播放

android 程序员 移动开发

Flutter如何实现下拉刷新和上拉加载更多(1)

android 程序员 移动开发

Flutter实战1 --- 写一个天气查询的APP

android 程序员 移动开发

Github TOP100 Android开源

android 程序员 移动开发

Flutter集成高德定位和地图功能

android 程序员 移动开发

GC 回收机制与分代回收策略

android 程序员 移动开发

google vr 入门之制作简易的VR播放器(二)

android 程序员 移动开发

GridLayoutManager这么用,你可能还真没尝试过

android 程序员 移动开发

Flutter如何实现下拉刷新和上拉加载更多

android 程序员 移动开发

Flutter开发之——Menu

android 程序员 移动开发

Flutter开发之——事件监听

android 程序员 移动开发

Flutter状态管理--Getx学习2

android 程序员 移动开发

Google Pay支付遇到的问题

android 程序员 移动开发

HashMap及HashTable源码解析

android 程序员 移动开发

Flutter开发之——运行卡在gradle assembleDebug

android 程序员 移动开发

Flutter教程(二) 了解Dart语言

android 程序员 移动开发

Flutter绘制-11-旋转小人儿造成的视觉错效

android 程序员 移动开发

Fragment的使用

android 程序员 移动开发

Flutter填坑全面总结(包括Flutter1

android 程序员 移动开发

Glide的简单封装GlideUtils

android 程序员 移动开发

Flutter开发中的一些Tips(二)

android 程序员 移动开发

HashMap源码分析 —— 一篇文章搞定HashMap面试

android 程序员 移动开发

Github标星3-2K-2020BATJ数据结构与算法笔试题及其答案吐血整理!

android 程序员 移动开发

Gson用户指南

android 程序员 移动开发

Flutter与Dart-入门

android 程序员 移动开发

Flutter版-WanAndroid-App

android 程序员 移动开发

Fragment add与replace的区别(1)(1)

android 程序员 移动开发

git 补丁 - diff 和 patch 使用详解(1)

android 程序员 移动开发

Fragment极度懒加载-+-Layout子线程预加载,奇妙的APP启动速度优化思路

android 程序员 移动开发

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