一般来说,用 ping 查看网络情况,主要是检查两个指标:
如果超时那么肯定是网络有问题(禁 ping 情况除外),如果延迟太高,网络情况肯定也是很糟糕的。
这篇文章就带着你,来跟着 ping 命令走一圈,看看 ping 是如何工作的
抓包工具:Wireshark 准备两台电脑,进行互 ping 操作:
打开 Wireshark,选取指定的网卡进行抓包,进行 ping 操作,在 A 电脑上 ping B 电脑的 IP。
抓包情况如下:
这里先简单的介绍下 Wireshark 的控制面板,这个面板包含 7 个字段,分别是:
上图中抓包编号 54-132 显示的就是整个 ping 命令的过程,我们知道 ping 命令不是依托于 TCP 或者 UDP 这种传输层协议的,而是依托于 ICMP 协议实现的, 那么什么是 ICMP 协议呢?这里简单介绍下:
[RFC792] 中说明了 ICMP 产生的原因:
由于互联网之间通讯会涉及很多网关和主机,为了能够报告数据错误,所以产生了 ICMP 协议。也就是说 ICMP 协议就是为了更高效的转发 IP 数据报和提高交付成功的机会。
根据上图,你会知道 ICMP 协议头包含 4 个字节,头部主要用来说明类型和校验 ICMP 报文。
下图是对应的类型和代码释义列表,后面分析抓包的时候会用到。
简单介绍完了 ICMP,那么抓包过程中出现的 ARP 协议是什么呢?同样来简单解释下:
我们知道,在一个局域网中,计算机通信实际上是依赖于 MAC 地址进行通信的,那么 ARP( AddressResolutionProtocol)的作用就是根据 IP 地址查找出对应的 MAC 地址。
了解了上面的基础概念后,我们来分析下抓包的数据,其流程如下:
上面的请求过程我画成流程图比较直观一点:
观察仔细的朋友,可能已经发现,Ping 4 次请求和响应结束后,还有一次 B 电脑对 A 电脑的 ARP 请求,这是为什么?
这里我猜测应该是有 2 个原因:
为了验证猜测,我再进行一次 ping 操作,抓包看看是不是和猜测的一样。此时,计算机里面已经有了 ARP 的缓存,执行 ARP-a 看看缓存的 arp 列表:
看看第二次 ping 的抓包:
可以看到,上图中在真正 ping 之前并没有进行一次 ARP 请求。
这也就是说,直接拿了缓存中的 ARP 来执行了,另外当 B 计算机进行响应之前还是进行了一次 ARP 请求,它还是要确认下之前的 ARP 缓存是否为正确的。
结束 ping 操作之后,同样再发一次 ARP 请求,更新下自己的 ARP 缓存,这里和我们的猜想基本一致。
弄懂了 ping 的流程之后我们来解析下之前解释的 ICMP 数据结果是否和抓包的一致。
我们来点击一个 ping request 看看 ICMP 协议详情:
图中红框内就行 ICMP 协议的详情了,这里的 Type=8,code=0, 校验是正确,且这是一个请求报文。
我们再点击 Responseframe:57,这里说明响应报文在序号 57。详情如下:
上图的响应报文, Type=0,code=0,这里知道就是响应报文了,然后最后就是根据请求和响应的时间戳计算出来的响应延迟。3379.764ms-3376.890ms=2.874ms。
你看,上面的文章其实是分析了一次完整的 ping 请求过程。
ping 命令是依托于 ICMP 协议的, ICMP 协议的存在就是为了更高效的转发 IP 数据报和提高交付成功的机会。
ping 命令除了依托于 ICMP,在局域网下还要借助于 ARP 协议, ARP 协议能根据 IP 地址反查出计算机的 MAC 地址。
另外 ARP 是有缓存的,为了保证 ARP 的准确性,计算机会更新 ARP 缓存。
学了这个,以后面试再问 ping 的详细过程,应该就比较稳了吧