ping 原理

最近看了好多面试的题目,其中也被问到了关于ping的问题以及一些原理性的东西,于是拜读了很多人的博客,最后也是豁然开朗,决定总结一下,也是为了防止遗忘吧。

要想理解ping的原理,我们首先来看一下ARP的报文格式
ping 原理
其中op:

1:表示arp请求
2:表示arp应答
3:表示rarp请求
4:表示rarp应答

接下来,我们来看一个同一广播域内的ping报文:
ping 原理
我们的host2想要去ping host1,那么主机1就要封装二层报文,首先host2会查看自己的MAC地址表,看有没有host1的地址,如果没有,host2就会向外部发送ARP广播包
ARP帧报文格式如下:(省略了arp报文的硬件类型,上层协议类型,MAC地址长度,IP地址长度)

目的MAC 源MAC 帧类型 op 发送者MAC 发送者IP 目标MAC 目标IP
FF-FF-FF-FF-FF-FF 52-54-00-00-11-22 0806 1 52-54-00-00-11-22 192.168.1.2 00-00-00-00-00-00 192.168.1.1

首先,我们的交换机接收到报文以后,会查询交换机的MAC地址表(具有学习功能),如果有host1的MAC地址,直接返回给host2;如果没有,交换机就会向所有端口发送ARP广播,其他端口上的主机发现以后,如果目标不是自己,就会丢弃报文;直到host1主机接收到了报文以后,就会响应host1的MAC地址是多少,同时学习主机host2的MAC地址,并按照同样格式的ARP报文返回给host2.

host1返回的ARP帧报文:

目的MAC 源MAC 帧类型 op 发送者MAC 发送者IP 目标MAC 目标IP
52-54-00-00-11-22 52-54-00-00-11-11 0806 2 52-54-00-00-11-11 192.168.1.1 52-54-00-00-11-22 192.168.1.2

这个时候,主机host2已经学习到了host1的MAC地址,于是发送icmp报文

目的地址 源地址 源IP 目标IP ICMP报文
52-54-00-00-11-11 52-54-00-00-11-22 192.168.1.2 192.168.1.1 Echo Request

host1收到报文之后,会复

目的地址 源地址 源IP 目标IP ICMP报文
52-54-00-00-11-22 52-54-00-00-11-11 192.168.1.1 192.168.1.2 Echo Answer

接下来,我们来看一看不同广播域之间的ping
ping 原理
首先要确保全网可达!!!
如果我们的host2 还想ping主机,host2得先去找网关转发,但是如果说,它也不知道网关的情况下怎么办呢?它就会像ping host1那样,先发送ARP报文,确定网关的mac 然后发送icmp报文交给路由器。
我们省略arp报文
host2发送ICMP报文至网关

目的地址 源地址 源IP 目标IP ICMP报文
52-54-00-00-11-33 52-54-00-00-11-22 192.168.1.2 192.168.2.1 Echo Request

当路由器接收到来自host2的icmp报文之后,发现目的地址的IP为192.168.2.1,查询路由发现,得找一个出去的接口,于是去掉原来的mac地址头,加上自己的mac地址头并且向host3转发,(如果网关也没有host3的mac,也得发送ARP报文问询,并且路由器的端口也能学习主机的mac地址,主机host3也能学习路由器的MAC地址),具体报文如下:

目的地址 源地址 源IP 目标IP ICMP报文
52-54-00-00-11-55 52-54-00-00-11-44 192.168.1.2 192.168.2.1 Echo Request

主机host3已经学到了路由器的mac,这会就会返回icmp报文

目的地址 源地址 源IP 目标IP ICMP报文
52-54-00-00-11-44 52-54-00-00-11-55 192.168.2.1 192.168.1.2 Echo Answer