Wireshark分析PING命令的过程
Wireshark的使用可以参考:wireshark抓包新手使用教程 - jack_Meng - 博客园
前言
相信大家对ping命令都很熟悉,也经常用来检测网络环境,但你对ping命令背后的运行过程有多少了解呢?
正文部分涉及两个背景知识:ARP协议和ICMP协议,简单说ARP协议是根据Mac地址查找IP,而ICMP协议是用来检测网络情况的,感兴趣的小伙伴可以自行查阅这两个协议
ping命令的流程
下面以几个案例来分析,先介绍一些本机和网关地址
本机的地址:
IPv4 地址 . . . . . . . . . . . . : 192.168.4.6
物理地址. . . . . . . . . . . . . : 5C-80-B6-FE-A5-0B
子网掩码 . . . . . . . . . . . . : 255.255.255.0
网关的地址:
IPv4 地址 . . . . . . . . . . . . : 192.168.4.1
物理地址. . . . . . . . . . . . . : b4-de-df-24-5f-1b
ping一个其他网段且不存在的地址
先打开Wireshark抓包再输入命令哦
# 清除本机ARP表
arp -d
# ping命令
ping 10.10.10.10
获取网关地址
从下图可以看出,26号包是我本机发起的ARP广播,查找网关的Mac地址,这是因为ping命令指向的地址 10.10.10.10 和我本机地址 192.168.4.6 不在同一个网段,因此需要借助网关转发;
而本机的ARP表被清空了,因此需要先发起ARP广播获取网关的Mac地址
在Wireshark的过滤栏中输入arp,表示筛选arp协议相关的包
Mac地址前面部分是网卡厂商的标识,由于这是全球统一的,因此Wireshark直接显示厂商的名称,如IntelCor表示的是因特尔的网卡,而zte表示的是中兴的网卡
发起ICMP请求
本机发起的ICMP请求,但目标Mac却是网关,这是为什么呢?
原因是本机不知道目标IP的Mac地址,它需要借助网关来转发,因此需要先将数据包发送给网关;
而该地址不存在,所以没有响应。
而若是本机的ARP表中已经存在网关的地址,则可以省去第一步,可以直接将ICMP包发送给网关
ping一个其他网络且存在的地址
C:\WINDOWS\system32>ping www.baidu.com
正在 Ping www.a.shifen.com [163.177.151.110] 具有 32 字节的数据:
来自 163.177.151.110 的回复: 字节=32 时间=13ms TTL=55
来自 163.177.151.110 的回复: 字节=32 时间=11ms TTL=55
来自 163.177.151.110 的回复: 字节=32 时间=12ms TTL=55
来自 163.177.151.110 的回复: 字节=32 时间=15ms TTL=55
163.177.151.110 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 11ms,最长 = 15ms,平均 = 12ms
39号包和上面提到的一样,本机发起的请求,目标IP是163.177.151.110,而目标Mac地址是网关
由于此时ARP表中已经有网关的记录,无需发起ARP广播获取网关的Mac地址
而我们查看一下40号包,可以发现该包的源IP地址是163.177.151.110,但源Mac地址是网关,而目标Mac地址和目标IP地址都是本机
这是由于数据包在网络传输中需要经过许多设备,而这个数据包的源IP地址和目标IP地址不变,源Mac地址和目标Mac地址会随着经过的网络环境发生变化,在本机所处的局域网中,最后一步是由网关将数据包转发到本机,这就是为什么这个包的源Mac地址是网关而目标Mac地址是本机了
采用NAT协议的网络是会修改对外数据包的源IP地址哦
ping一个本网络且存在的地址
先来查看一下本机的ARP表
C:\WINDOWS\system32>arp -a
接口: 192.168.4.6 --- 0x1c
Internet 地址 物理地址 类型
192.168.4.1 b4-de-df-24-5f-1b 动态
192.168.4.230 00-11-32-82-cc-f3 动态
192.168.4.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.22 01-00-5e-00-00-16 静态
224.0.0.251 01-00-5e-00-00-fb 静态
224.0.0.252 01-00-5e-00-00-fc 静态
239.255.255.250 01-00-5e-7f-ff-fa 静态
255.255.255.255 ff-ff-ff-ff-ff-ff 静态
可以看到有好几个IP与Mac地址的映射,而如果我们ping一个不在该表的IP
C:\WINDOWS\system32>ping 192.168.4.5
正在 Ping 192.168.4.5 具有 32 字节的数据:
来自 192.168.4.5 的回复: 字节=32 时间=738ms TTL=64
来自 192.168.4.5 的回复: 字节=32 时间=54ms TTL=64
来自 192.168.4.5 的回复: 字节=32 时间=5ms TTL=64
来自 192.168.4.5 的回复: 字节=32 时间=11ms TTL=64
192.168.4.5 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 5ms,最长 = 738ms,平均 = 202ms
可以看到这次和前两次不同,发起的ARP广播直接请求192.168.4.5的Mac地址,而192.168.4.5也直接回应本机。
让我们再来看看ICMP包的情况,从157号和158号包可以看出,两个主机之间的通信并没有经过网关,这是由于两个IP处在同一个网段,因此系统直接对目标地址发起了ARP请求,并且后续的ICMP包也无需经过网关,两个主机处于同一个广播域。
还有一个细节是当ARP表记录了192.168.4.5的地址后,请求的延时低了许多,这是因为减少了ARP广播获取192.168.4.5 Mac地址的步骤,可以直接发送ICMP包给对应主机。
总结
从前面的三个例子中可以看出,ping命令的运行过程是这样的:
- 判断目标IP地址是否为本网络
- 若是,则查找本机的ARP表,若表中没有记录则对目标IP发起ARP广播,不经过网关
- 若不是,则查找本机ARP表是否有网关的记录,若有则直接发起ICMP协议,目标IP是ping的IP,目标Mac地址是网关;而若表中没有,则发起对网关的ARP请求,获取网关的Mac地址后再发送ICMP包
- 若目标IP与本机处于同一网络,并且ARP表中有记录,则可以免去ARP广播请求获取目标Mac地址的步骤,直接与目标主机通信ICMP数据包
- 若目标IP与本机不是同一个网络,则通信需要借助网关,数据包的源Mac地址和目标Mac地址会被修改