前文我们讲解了ARP协议、IP协议、ICMP协议,有了这些基础,咱们再来讲解ping命令后面的原理,就简单多了。我们以一个例子来讲解,如下图所示,PC-A【10.74.97.116 /28】要去ping PC-B【10.74.97.125 /28】,看是否能ping通。A与B之间是通过网线直连,这也是把问题简单话,现实中直连的场景还是毕竟少,不过本文是讲解ping的原理,所以其他的简化,突出重点。
1 前提
在分析之前,我们先得搞清楚几点:
(1)对A而言,自己的IP地址、子网掩码、MAC地址这些信息都是已知的;
(2)对A而言,B的IP地址是知道的,A要去ping B,肯定会知道B的IP地址,要不然ping谁去;
(3)对A而言,B的子网掩码、MAC地址这些都是不知道的,没人告诉它。
对B而言,也是一样。我们只分析A发送数据给B的过程,至于B回复数据给A的过程,道理是一样的。读者理解A到B的数据发送原理后,可以自己试着分析B回复数据给A的过程。
2 路由表简单介绍
任何需要通过IP地址通信的设备,都会在本地维持这一个路由表。比如Windows可以通过命令【route print -4】查看路由表,Linux可以通过命令【ip route】查看。当一个设备的接口配置了IP地址并且接口状态是up的时候,会在本地路由表中,生成几条路由表项。
例如本例中的PC-A(Windows),给网卡配置了IP地址【10.74.97.114 /24】后,会在路由表中生成以下表项。
C:\Users\wenca>route print -4
Network Destination Netmask Gateway Interface Metric
10.74.97.112 255.255.255.240 On-link 10.74.97.116 291
10.74.97.116 255.255.255.255 On-link 10.74.97.116 291
10.74.97.127 255.255.255.255 On-link 10.74.97.116 291
可以发现A中路由表多了三条表项,第一条是到此IP所在网段(子网)的路由,第二条是到此IP自己的路由,第三条是到此IP对应的网段广播地址的路由。而且三条路由的Gateway都是On-link,表示这这三条都是直连路由。也就是去往这三个目的地,直接二层封包即可,不需要先把数据包给到Gateway,让Gateway去转发。
本例中的PC-B(Linux),网卡配置了IP地址【10.74.97.125 /24】,对应的路由表如下所示。
root@wenca-dell:~$ ip route
10.74.97.112/28 dev eth0 proto kernel scope link src 10.74.97.116
3 原理分析
在A【ip地址为10.74.97.116 /28】的命令行下,敲入【ping 10.74.97.125】,如下所示。
C:\Users\wenca>ping 10.74.97.125
(1)A查找路由表:找去往B的路由
A根据目的IP地址【10.74.97.125】,去查找自己的路由表。发现该地址【10.74.97.125】匹配了路由表知道第一条,而是找到对应的Gateway【On-link】,表示A自己与B在同一个网段。
(2)A查找ARP表:找B的MAC地址
A发现B与自己在同一个网段,于是用B的IP地址,去找ARP表,没有找到B的IP地址对应的MAC地址。
然后A发送ARP广播请求,询问【10.74.97.125】对应的MAC地址是多少,如下图所示。
B收到此广播后回复此ARP广播,告诉A自己(B)的MAC地址多少,如下图所示。
A收到B的回复后,把B的IP地址和MAC地址映射关系写到ARP表中,方便将来的查询,如下所示。
C:\Users\wenca>arp -a
Interface: 10.74.97.116 --- 0x5
Internet Address Physical Address Type
10.74.97.125 00-50-56-89-0a-1b dynamic
(3)A发送ICMP请求给B,B回复
上面完成后,A已经有了B的IP地址和MAC地址,发送ICMP请求包,如下图所示。
B收到此ICMP请求包以后,准备回复此ICMP请求,但是没有A的MAC,而是发送ARP广播,请求A的MAC。
A收到此ARP广播后,回复此请求,如下图所示(我的抓包过滤了A的MAC,因此不会看到B的ARP广播)。
B收到A的ARP响应报文后,知道了A的IP地址和MAC地址,于是发送ICMP响应报文,如下图所示。
至于后面的NO.6--NO.11,是因为Windwos上执行ping命令,默认会发送4此ICMP请求,如下图所示。
可以看到在后面的3此ICMP交互期间,是没有ARP包的,那是因为A和B已经知道了对方的IP和MAC,记录在各自的ARP表中。
(4)在A的命令行界面下可以看到结果如下所示。
C:\Users\wenca>ping 10.74.97.125
Pinging 10.74.97.125 with 32 bytes of data:
Reply from 10.74.97.125: bytes=32 time=5ms TTL=128
Reply from 10.74.97.125: bytes=32 time=2ms TTL=128
Reply from 10.74.97.125: bytes=32 time=6ms TTL=128
Reply from 10.74.97.125: bytes=32 time=5ms TTL=128