对于 Ping 的过程,你真的了解吗?

一、概览

对于 ping 命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,最先使用的命令肯定是 ping 命令吧?一般我们用 ping 查看网络情况,主要是检查两个指标,第一个是看看是不是超时,第二个看看是不是延迟太高。如果超时那么肯定是网络有问题啦(禁 ping 情况除外),如果延迟太高,网络情况肯定也是很糟糕的。那么对于 ping 命令的原理,ping 是如何检查网络的?大家之前有了解吗?接下来我们来跟着 ping 命令走一圈,看看 ping 是如何工作的。

二、环境准备和抓包

2.1 环境准备1.抓包工具。我这里使用 Wireshark。2.我准备了两台电脑,进行 ping 的操作。ip 地址分别为:A 电脑:192.168.2.135MAC 地址:98:22:EF:E8:A8:87B 电脑:192.168.2.179MAC 地址:90:A4:DE:C2:DF:FE2.2 抓包操作

打开 Wireshark,选取指定的网卡进行抓包,进行 ping 操作,在 A 电脑上 ping B 电脑的 ip。

image

抓包情况如下:

image

这里先简单的介绍下 Wireshark 的控制面板,这个面板包含 7 个字段,分别是:

  • NO:编号
  • Time:包的时间戳
  • Source:源地址
  • Destination:目标地址
  • Protocol:协议
  • Length:包长度
  • Info:数据包附加信息

三、深入解析

上图中抓包编号 54-132 显示的就是整个 ping 命令的过程,我们知道 ping 命令不是依托于 TCP 或者 UDP 这种传输层协议的,而是依托于 ICMP 协议实现的,那么什么是 ICMP 协议呢?这里简单介绍下:

3.1 ICMP 协议的产生背景

[RFC792] 中说明了 ICMP 产生的原因:由于互联网之间通讯会涉及很多网关和主机,为了能够报告数据错误,所以产生了 ICMP 协议。也就是说 ICMP 协议就是为了更高效的转发 IP 数据报和提高交付成功的机会。

3.2 ICMP 协议的数据格式image

根据上图我们知道了 ICMP 协议头包含 4 个字节,头部主要用来说明类型和校验 ICMP 报文。下图是对应的类型和代码释义列表,我们后面分析抓包的时候会用到。

image

简单介绍完了 ICMP,那么抓包过程中出现的 ARP 协议是什么呢?我们同样来简单解释下:

3.3 ARP 协议

我们知道,在一个局域网中,计算机通信实际上是依赖于 MAC 地址进行通信的,那么 ARP(Address Resolution Protocol)的作用就是根据 IP 地址查找出对应 ip 地址的 MAC 地址。

3.4 Ping 过程解析

了解了上面的基础概念后,我们来分析下抓包的数据。图 b 的流程如下:

  • A 电脑(192.168.2.135)发起 ping 请求,ping 192.168.2.179。
  • A 电脑广播发起 ARP 请求,查询 192.168.2.179 的 MAC 地址。
  • B 电脑应答 ARP 请求,向 A 电脑发起单向应答,告诉 A 电脑自己的 MAC 地址为 90:A4:DE:C2:DF:FE。
  • 知道了 MAC 地址后,开始进行真正的 ping 请求,由于 B 电脑可以根据 A 电脑发送的请求知道源 MAC 地址,所有就可以根据源 MAC 地址进行响应了。

上面的请求过程我画成流程图比较直观一点:

image

观察仔细的朋友可能已经发现,Ping4 次请求和响应结束后,还有一次 B 电脑对 A 电脑的 ARP 请求,这是为什么呢?这里我猜测应该是有 2 个原因:

1.由于 ARP 有缓存机制,为了防止 ARP 过期,结束后重新更新下 ARP 缓存,保证下次请求能去往正确的路径,如果 ARP 过期就会导致出现一次错误,从而影响测试准确性。

2.由于 ping 命令的响应时间是根据请求包和响应包的时间戳计算出来的,所以一次 ARP 过程也是会消耗时间。这里提前缓存最新的 ARP 结果就是节省了下次 ping 的 arp 时间。

为了验证我们的猜测,我再进行一次 ping 操作,抓包看看是不是和我们猜测的一样。此时,计算机里面已经有了 ARP 的缓存,我们执行 ARP -a 看看缓存的 arp 列表:

image

我们看看第二次 ping 的抓包:

image

我们看到上图中在真正 ping 之前并没有进行一次 ARP 请求,这也就是说,直接拿了缓存中的 arp 来执行了,另外当 B 计算机进行响应之前还是进行了一次 ARP 请求,它还是要确认下之前的 ARP 缓存是否为正确的。然后结束 ping 操作之后,同样在发一次 ARP 请求,更新下自己的 ARP 缓存。这里和我们的猜想基本一致。

弄懂了 ping 的流程之后我们来解析下之前解释的 ICMP 数据结果是否和抓包的一致。我们来点击一个 ping request 看看 ICMP 协议详情:

image

图中红框内就行 ICMP 协议的详情了,这里的 Type=8, code=0, 校验是正确。我们对比就知道了这是一个请求报文。我们再点击 Response frame:57,这里说明响应报文在序号 57。详情如下:

image

上图的响应报文,Type=0, code=0。这里知道就是响应报文了,然后最后就是根据请求和响应的时间戳计算出来的响应延迟。3379.764 ms-3376.890 ms=2.874 ms。

四、总结

我们分析了一次完整的 ping 请求过程,ping 命令是依托于 ICMP 协议的,ICMP 协议的存在就是为了更高效的转发 IP 数据报和提高交付成功的机会。ping 命令除了依托于 ICMP,在局域网下还要借助于 ARP 协议,ARP 协议能根据 IP 地址查出计算机 MAC 地址。ARP 是有缓存的,为了保证 ARP 的准确性,计算机会更新 ARP 缓存。

服务推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值