当你 ping 的时候,你知道背后发生了什么吗?

01 场景1 网络连通性检测

Ping通过向网络发送ICMP数据包来探测网络状态,网络工程师可以结合探测结果来排查网络性能问题。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图2

图2为Ping基本工作原理示意图。

以Windows10系统为例,在命令行窗口Ping某个目标IP地址,Windows主机将向外发送4个ICMP探测包,在正常情况下,目标主机收到每一个探测包后都会回一个响应包。

这里我们假设通过科来网络分析系统抓包,请见图3。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图3

如图3所示,选择实时分析“①”,勾选要采集数据包的网卡“②”,点击开始“③”,开始采集网络数据包。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图4

在Windows主机上执行ping命令测试目标IP主机“50.84.8.1”的网络连通性。

如图4所示,Windows主机执行ping命令后收到了来自主机“50.84.8.1”的回复(2次),2个请求超时,包括本次探测的统计信息,丢包率50%、平均往返时间0ms等等。

单从这个探测结果来看,到达目标主机“50.84.8.1”的连通性是存在问题的。

那么发送出去的哪些探测包收到了回复,哪些探测包没有收到回复显示请求超时呢?

我们通过数据包解码分析来了解上述网络连通性测试的数据包。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图5

如图5所示,在左侧的节点浏览器窗格选中协议浏览器下的子节点ICMP“①”,通过这个操作可以将数据包列表中所有的ICMP数据包过滤出来。

在数据包列表中选择第一个数据包“②”,ICMP的探测包正式名称为“Echo Message”,响应包则根据不同的网络状况而不同。

在下方的数据包解码窗格观察数据包解码的ICMP部分“③”。

Echo Message:Echo Message是一个ICMP Echo request数据包,发送后,期望网络中的主机做出响应,从而判断网络状况。

ICMP通过“类型(type)”字段来标识ICMP报文类型,如图5中所示的类型字段值为8,就代表这是一个Echo Message。

Windows 10主机发送Echo Message时默认填充32字节的负载,加上8字节的ICMP头部一共40字节的IP负载。

注意序列号字段,这个数据包中的ICMP序列号字段值为“0x11”。

根据RFC792的描述,序列号字段用于辅助关联Echo Message和响应消息。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图6

如图6所示的ICMP响应消息正式名称为“Echo Reply Message”,当然这仅仅是一种情况。当目标主机正常做出响应时,类型字段值为0,表示这是一个Echo Reply Message。通过序列号字段标识此消息是对拥有相同序列号值(0x11)的Echo Message的响应。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图7

如图7所示,在数据包解码窗格选中序列号字段“①”,数据包列表窗格中的解码字段一列将显示每个数据包的对应解码字段“②”。

这样我们就可以很方便的对Ping的结果进行分析了。

正如图7中所示,序列号值为“0x11”和“0x14”的Echo Message得到了Echo Reply Message回应,序列号值为“0x12”和“0x13”的Echo Message未得到任何数据包回应,因此被记录为请求超时(见图4),默认情况下,如果一个Echo Message发出2秒后未收到回应,将被记录为请求超时。

上述情况意味着几种可能:

1、有两个Echo Message并未发送到目的地,即上行丢包,导致未收到回应消息;

2、上述两个Echo Message发送到了目的地,但目标主机响应的Echo Reply Message在途中丢失,即下行丢包,导致未收到回应消息;

3、由于网络时延过大,上下行转发时间之和超过了超时计时器,被记录为请求超时。

有了基本的故障判断后,就可以结合多点数据包采集对比、数据包解码分析、上机排查等手段进行具体故障原因分析了。

思考:如果多个进程在使用ping命令对网络情况做探测时,ICMP如何将不同进程的数据包区分开呢?

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图8

如图8所示,在数据包解码窗格选中标识符字段“①”,数据包列表窗格中的解码字段一列将显示每个数据包的对应解码字段“②”。

不同的标识符值,表示该ICMP消息属于不同的进程。

02 场景2 网络时延检测

进程发出Echo Message时会记录当前时间,收到Echo Reply Message时将根据当前时间和记录时间计算数据包在收发双方之间的往返时间。

当探测出数据包往返时间较大,如何确定是两个方向的数据转发时延较大,还是单一方向的数据包转发时延较大呢?

换句话讲,如何测量数据包转发的单向时延?

可以在数据包转发路径的两端部署,对数据包进行采集,根据两个采集点采集数据包的时间戳对比来得出判断。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图9

如图9所示,科来网络分析系统在采集数据包时,将会记录采集该数据包的日期和绝对时间,将多个采集位置的数据包采集时间进行对比就可以找出时延问题的瓶颈点,还可以根据数据包的头部信息得出转发方向。

03 场景3 网络丢包检测

网络丢包最典型的几种情况:

因网络拥塞而丢包,因策略阻断而丢包,因缺少路由而丢包。

如果细分下去,还应分别分为上行和下行两个方向。我们根据Ping的结果来分析可能出现了哪种丢包情况。

3.1 远端主机不存在

上面图4中所示的情况通常是网络转发路径不稳定造成的,如路由震荡或链路拥塞,应从这两方面入手排查故障。除此之外,还可能有哪些情况会出现“请求超时”呢?

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图10

如图10所示,主机A为Windows10系统,主机B为Linux系统(CentOS7)。

在主机A上“ping 10.35.80.2”,这是一台并不存在于本网络中的主机。Ping程序返回了“请求超时”。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图11

如图11所示,主机A一侧采集到的网络流量,主机A发送了4个Echo Message,未收到任何响应包。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图12

如图12所示,主机B一侧采集到的网络流量,路由器发送了4个ARP Request包,因为目标主机不存在,所以未得到响应。

因此我们可以得出一个结论,当Ping一个远端网络不存在的主机时,Ping程序会返回“请求超时”,本地主机发送的Echo Message不会收到回应,远端网络路由器会通过ARP Request查找远端主机,但不会得到响应。

3.2 访问策略阻断

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图13

如图13所示,在主机A上ping主机B,显示通信正常,在主机B上ping主机A,显示丢包率100%。网络是双向通信的,为什么在这里只有一个方向可以通信呢?

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图14

图14所示为主机A一侧采集到的数据包。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图15

图15所示为主机B一侧采集到的数据包。

如图14、图15所示,分别在主机A一侧和主机B一侧各采集到了31个ICMP Echo Message,说明数据包被网络正常转发到了目标网络。

主机A未作响应是由于Windows默认的系统防火墙策略不允许被Ping。

此处可以得出的结论是,直接Ping一台Windows主机Ping程序会返回“请求超时”。

如果需要对Windows主机做连通性测试,可以采取临时关闭Windows系统防火墙的办法。

3.3 数据包路由失败

ICMP不仅可以探测网络连通性,还可以探测数据包转发路径,因此大多数的网络环境中都会在关键位置通过防火墙等设备禁止ICMP的包通过,尽力隐藏内部网络结构。当我们使用Ping来对网络进行探测时,免不了会遇到这样的情况。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图16

如图16所示,在防火墙接口2一侧阻止接收ICMP包。当从主机A Ping主机B时Ping程序会返回“请求超时”。这一次的“请求超时”与前面两次虽然Ping程序显示一样,但网络中的具体情况又不一样。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图17

图17所示为主机A一侧采集到的数据包。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图18

图18所示为主机B一侧采集到的数据包。

如图17所示,主机A一侧采集到了主机A发送的4次Echo Message,但未采集到任何回应包,这与Ping程序返回的“请求超时”情况一致。

如图18所示,主机B一侧采集到了主机A发送的4次Echo Message,主机B发送的4次Echo Reply Message,但由于Echo Reply Message被防火墙阻止未能被转发回主机A所在网络。同时可以观察到,防火墙在阻止Echo Reply Message后发向主机B发送了Destination Unreachable(目的不可达)包。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图19

如图19所示,Destination Unreachable包类型字段值为3,用于表示目的不可达,code字段值为13,表示不可达原因是通信被强制禁止。同时这个ICMP包的负载部分携带的是被阻止包的IP头和ICMP内容。

此处可以得出的结论是,如果Echo Reply Message在远端返回时被阻断,Ping程序会返回“请求超时”。

3.4 无法访问目标网络

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图20

如图20所示,在防火墙接口1一侧阻止入向ICMP包,Ping程序显示“无法访问目标网”。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图21

如图21所示,Destination Unreachable包类型字段值为3,用于表示目的不可达,code字段值为13,表示不可达原因是通信被强制禁止。同时这个ICMP包的负载部分携带的是被阻止包的IP头和ICMP内容。

此处可以得出的结论是,如果Echo Reply Message在近端发出时被阻断,Ping程序会返回“无法访问目标网”。

3.5 无法访问目标主机

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图22

如图22所示,当使用Ping程序探测一个网关没有路由的网络时,Ping程序会显示“无法访问目标主机”。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图23

如图23所示,收到探测“10.35.81.1”的Echo Message后,网关“50.84.8.1”向主机A发送了Destination Unreachable包,code字段值为1,表示主机不可达。这里是表示网关设备上没有到达“10.35.81.1”的路由,因此Echo Message包将被丢弃,同时返回了Destination Unreachable包。

通过这个现象我们可以得出一个结论,当路由设备没有到达目标主机的路由时,将返回Destination Unreachable包,code字段值为1,Ping程序将显示“无法访问目标主机”。

以上是在Windows主机上常见的Ping结果解析,建议您亲自动手做一做,也可以在Linux主机上试试看在上述不同情况下,Linux主机的Ping程序会显示什么。

04 场景4 路径MTU检测

网络转发路径MTU检测是网管员必会技能。接下来我们一起解析当我们在操作系统上通过Ping进行MTU探测时,发出的数据究竟是什么内容呢?

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图24

如图24所示,“-l”参数用于设置探测包携带数据量,单位为字节,“-f”参数用于设置数据包不允许分片,这样一旦探测包超过路径MTU将因无法分片而不能转发。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图25

将网关设备的接口IP MTU设置为1400字节,在主机A上通过Ping命令的扩展参数来实现路径MTU探测。

如图25所示,当设置“-l 1472”时,可以收到主机B的回复;当设置“-l 1473”时,Ping程序显示“收到来自50.84.8.1的回复:需要拆分数据包但是设置DF。”

抛开收到回复的情况不谈,来看当设置“-l 1473”时网络中的数据包是什么情况。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图26

如图26所示,主机A设置“-l 1473”时发送的Echo Message整个数据帧大小为1419字节“①”,由二层头部14字节、IP头部20字节、ICMP部分1381字节(ICMP头部8字节、设置携带数据1473字节“③”)“②”、以及帧校验序列4字节组成。Windows主机在发出Echo Message时,默认携带数据填充为“abcdefg… … … …uvw”循环。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图27

如图27所示,由于设置了“-f”参数,会将数据包IP头部的“不能分片”字段置位,以通知任何设备这个IP数据包不允许分片。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图28

网关设备收到如图27所示的数据包后,由于该数据包不能分片且总大小超过了接口IP MTU 1400,因此回复了如图28所示的Destination Unreachable包“①”。

ICMP头部的code字段设置值为4表示需要分片但设置不允许“②”,ICMP负载部分携带了Echo Message的IP头部及ICMP头部“③”。

由此可总结出,当发送的数据包超过某台设备接口MTU时,Ping程序会显示“需要拆分数据包但是设置 DF。”

05 场景5 Linux 主机的Ping命令

Linux主机的Ping命令与Windows主机的Ping命令大同小异,但有两个主要区别:

1是参数使用不一样,2是填充内容不一样。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图29

如图29所示,在Linux主机上,如需设置Ping的填充数据大小应使用“-s”参数,如需设置IP头部不分片字段应使用“-M do”参数。如需更多命令帮助,可以执行“man ping”进入Linux的Ping命令帮助来获得解释。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图30

如图30所示,使用命令“ping 10.35.80.1 -s 1000 -M do”就可以发送携带1000字节ICMP负载,IP头部设置不分片字段的Echo Message。注意Linux主机默认情况下Ping是不停的发送Echo Message,直至手动打断“ctrl+c”。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图31

如图31所示,Linux主机发送Echo Message时,填充的内容以字节为单位,每个字节的值从“0x00”递增直至“0xFF”,然后循环“②”。

但第一次循环例外,第一次循环的前16个字节用于携带Linux时间戳“①”。

将该部分数据按照Linux时间戳格式进行运算,就可以得出该包产生的时间。

如果您希望更方便、更直观的使用Ping、观察Ping结果,可以使用Ping工具。

当你 ping 的时候,你知道背后发生了什么吗?

当你 ping 的时候,你知道背后发生了什么吗?

图32

除此之外,通过ICMP的十几种类型字段和若干代码字段,使用Ping还可以实现如IP TTL超时检测、端口或服务可达性检测等功能。

06 结语

Ping是网络管理中一项基本而使用的工具。

在通过Ping做网络状况检测时,将ICMP理论知识和数据包解码分析技巧相结合,可以在网络运维与故障排查中取得更好效果,让运维工作更加轻松高效。

建议亲自动手做一做,抓包看一看,正所谓:“学而时习之,无包不运维”。

上一篇 [OpenClaw 文档]帮助--Node 运行时
下一篇 存储S5500T(S3900)系统硬盘FW升级