当 Ping 命令后,背后发生了什么?

网络
对于 ping命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,先使用的命令肯定是ping命令吧?

 01 概览

[[274853]]

对于 ping命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,最先使用的命令肯定是ping命令吧?一般我们用ping查看网络情况,主要是检查两个指标:

  • 第一个是看看是不是超时
  • 第二个看看是不是延迟太高

如果超时那么肯定是网络有问题(禁 ping情况除外);如果延迟太高,网络情况肯定也是很糟糕的。

那么对于 ping命令的原理,ping是如何检查网络的?大家之前有了解吗?接下来我们来跟着ping命令走一圈,看看ping是如何工作的。

02 环境准备和抓包

环境准备

抓包工具:Wireshark 准备两台电脑,进行互 ping操作:

  1. A电脑(IP地址: 192.168.2.135/ MAC地址:98:22:EF:E8:A8:87)
  2. B电脑(IP地址: 192.168.2.179/ MAC地址:90:A4:DE:C2:DF:FE)

抓包操作

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

 

当 Ping 命令后,背后发生了什么?

 

抓包情况如下:

 

当 Ping 命令后,背后发生了什么?

 

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

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

03 深入解析

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

ICMP协议的产生背景

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

ICMP协议的数据格式

 

当 Ping 命令后,背后发生了什么?

 

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

当 Ping 命令后,背后发生了什么?

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

ARP协议

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

Ping过程解析

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

A 电脑( 192.168.2.135)发起ping请求,ping192.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地址进行响应了。

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

当 Ping 命令后,背后发生了什么?

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

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

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

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

当 Ping 命令后,背后发生了什么?

我们看看第二次 ping的抓包

当 Ping 命令后,背后发生了什么?

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

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

当 Ping 命令后,背后发生了什么?

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

当 Ping 命令后,背后发生了什么?

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

04 总结

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

 

责任编辑:武晓燕 来源: 今日头条
相关推荐

2019-11-12 14:41:41

Redis程序员Linux

2021-12-16 15:58:48

Linux内存微软

2022-02-15 13:20:28

特斯拉电动车

2023-11-02 08:00:00

ClickHouse数据库

2018-03-16 15:31:50

2016-10-15 10:33:14

阿里云降价云计算

2011-03-31 09:20:45

URLDNSWeb应用程序

2021-02-25 10:02:32

开机键Linux内存

2020-08-17 12:47:07

Mozilla裁员浏览器

2023-01-14 16:11:27

浏览器URL回车

2010-02-07 09:00:29

AndroidLinux Kerne

2021-04-11 10:40:16

Git软件开发

2021-01-18 08:23:23

内存时底层CPU

2020-09-01 11:40:01

HTTPJavaTCP

2019-09-16 17:16:29

Hadoop数据湖数据结构

2023-08-29 16:26:20

Linux命令行

2015-07-03 09:27:43

网络闰秒

2022-06-03 08:12:52

InnoDB插入MySQL

2021-11-23 23:31:43

C语言数据类型系统

2020-08-20 11:50:31

语言类型转换代码
点赞
收藏

51CTO技术栈公众号