关于导语ping原理的详细内容,在网上可以搜索到很多相关内容,但关于ping6的详细内容,高质量的文章并不多见。 本文希望更多的朋友了解萍6的原理。 本文介绍了ICMPV6协议以及完整的ping6流程是如何发生的。 作者:腾讯云架构师xydsj ) ) )。
一、ICMPv6简介
internetcontrolmessageprotocolfortheipv6imp V6 )是ipv6的基本协议之一。 ICMPv6具有向源地址报告向目标传输IPv6数据包时的错误信息和控制信息的功能。
ICMPv6定义无法达到目的、数据包长度长、超时、对请求的响应、响应等消息。 在IPv6中,ICMPv6除了ICMPv4常用的功能之外,还包括相邻节点检测、无状态地址配置包括重复地址检测)和PMTUD等功能。
二、ICMPv6报文格式
ICMPv6消息格式如下图所示。
3358www.Sina.com/
ICMPv6字段注释:
类型:指示消息类型,0到127指示错误消息类型,128到255指示信息消息类型。
代码:指示此消息类型的细分类型。
checksum :显示icmp V6消息的校验和。
ICMPv6属于OSI七层协议栈的网络层
ICMPv6错误消息用于报告传输IPv6包时发生的错误,可分为以下四类:
封装时必须先封装IPv6报文头部。
IPv6中间设备在转发IPv6消息的过程中,如果设备发现目的地址不可达,则向发送消息的源地址发送ICMPv6不可达的错误消息,同时将引起该错误消息的具体原因携带在该消息中
目标不可达到的错误消息的Type字段值为1,根据错误的具体原因,可以细分为
代码=0:没有到达目标设备的路由。
代码=1:管理策略禁止与目标客户端进行通信。
代码=2:无指定。
代码=3:目标IP地址无法到达。
代码=4:目标端口无法到达。
三、ICMPv6差错报文
如果IPv6中间设备在转发IPv6消息的过程中发现该消息超出了接口的链路MTU,则将ICMPv6分组的过多错误消息发送到发送该消息的源地址,其中该接口具有链路MTU值分组溢出错误消息是Path MTU发现机制的基础。
数据包大小过大的错误消息的Type字段值为2,代码字段值为0。
1. 目的不可达错误报文
在发送和接收IPv6消息的过程中,如果设备接收到Hop Limit字段值为0的数据包,或者设备将Hop Limit字段值减少为0,则会向源地址发送ICMPv6超时错误消息。 对于分阶段重新配置消息的操作,如果超过定时时间,也会生成ICMPv6超时消息。
超时错误消息的Type字段值为3,根据错误的具体原因,可以细分为:
Code=0:传输中超过了跳数限制。
代码=1:瓷砖重组超时。
2. 数据包过大错误报文
目标节点接收到IPv6消息时,进行消息有效性检查,发现问题时向消息源地址响应ICMPv6参数错误消息。
参数消息的Type字段值为4,根据错误的具体原因,可以细分为:
代码=0: IPv6基本标头或扩展标头字段中存在错误。
代码=1:无法识别IPv6基本头或扩展头的下一个头值。
代码=2:扩展标头显示未知选项。
http://www.Sina.com/http://www.Sina.com /
ICMPv6信息消息提供诊断功能和附加主机功能。 例如,多播监听发现和邻居发现。
典型的ICMPv6消息主要包括响应请求消息Echo Request )和响应消息Echo Reply ),这两种消息即通常使用的Ping6消息。 可以分为以下两类。
3. 时间超时错误报文
响应请求消息发送到目标地址,用于确保从目标地址立即发送回响应消息。 响应消息的Type字段值为128,代码字段值为0。
4. 参数错误报文:
接收到响应请求消息时,ICMPv6用响应消息进行响应。 响应消息的Type字段的值为129,代码字段的值为0。
四、ICMPv6信息报文
整过程梳理
如下图所示,云主机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的过程就结束了,同样的道理,其他协议报文也是有这样的一个封装和解封装过程,希望本文能够让对大家有所帮助。
关注「云加社区」公众号,回复“ IP ”,获取更多IPv6相关内容。
推荐阅读
腾讯课堂点播上云客户端实践总结
快三计划QQ分是被请求节点组播地址的后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的过程就结束了,同样的道理,其他协议报文也是有这样的一个封装和解封装过程,希望本文能够让对大家有所帮助。
关注「云加社区」公众号,回复“ IP ”,获取更多IPv6相关内容。
推荐阅读
腾讯课堂点播上云客户端实践总结