Ping的实质
Ping程序的实质是利用了ICMP请求回显和回显应答报文,但ARP请求和应答报文也在其中起了非常重要的作用。
Ping的逻辑过程
以从PC1 ping PC2(命令:ping 11.1.1.2 -I 10.1.1.1)为例说明Ping的逻辑过程。
10.1.1.1/24 10.1.1.2/24 11.1.1.1/24 11.1.1.2/24
a b c d
PC1---------------------------------RTA---------------------------------------PC2
1、ping程序生成一个ICMP请求回显报文。
ICMP报文沿协议栈向下传输到ip层,封装ip头,包含源地址IP与目的地址IP。在此封装过程中,IP层已经根据IP地址和掩码判断出了源IP与目的IP不属于同一网段(网段判断的规则为:把IP地址的高XX位保留,其余位置0,IP地址共有四段,每段8位,共32位,顺序为左高右低。比如PC1的IP:10.1.1.1,掩码24,IP所属的网段为10.1.1.0-10.1.1.255),如图1所示。
图1 ICMP报文
2、ICMP报文再向下传到链路层,准备进行以太帧头的封装,但由于无法知道目的mac地址,暂时无法进行封装,如图2所示。
图2 ICMP报文封装
3、由于已经知道了源IP与目的IP不属于同一网段,故主机要查找FIB表,找自己的下一跳,分以下两种情况:
如果没找到下一跳,则得不到下一跳的ip,自然也得不到下一跳的mac地址,以太帧头无法进行封装,于是就ping不通。
如果找到了下一跳,得到了下一跳的ip,但此时还不知道下一跳的mac,故要发送ARP广播请求。ARP的请求或应答分组格式如图3所示,参数如表1所示。
图3 ARP分组格式
表1 参数说明
参数名 | 参数值 | 说明 |
---|---|---|
以太网目的地址 | ff:ff:ff:ff:ff:ff | 为全1 |
以太网源地址 | PC1的mac地址,即10.1.1.1/24对应的mac地址 | 无 |
OP | 1 | 表示ARP请求 |
发送端以太网地址 | PC1的mac地址,即10.1.1.1/24对应的mac地址 | - |
发送端IP地址 | PC1的IP地址,即10.1.1.1/24 | - |
目的以太网地址 | 以0填充 | - |
目的IP地址 | 下一跳PC1 to RTA 的IP地址10.1.1.2/24 | - |
说明:
- 以太首部中的以太网目的地址与ARP请求中的目的以太网地址是不一样的,前者为全1,表示广播,这样才能被所有直连设备接收到。
- 后者是下一跳的mac地址,因为未知,所以填充为全0。但以太首部中的以太网源地址和ARP请求中的发送端以太网地址是一样的,为重复信息。
- FIB(Forward Information Base)表:即路由表。
表2 参数说明
参数名 | 参数值 | 说明 |
以太网目的地址 | PC1的mac地址,即10.1.1.1/24对应的mac地址 | - |
以太网源地址 | RTA to PC1的mac地址,即10.1.1.2/24对应的mac地址 | - |
OP | 2 | 表示ARP应答 |
发送端以太网地址 | RTA to PC1的mac地址,即10.1.1.2/24对应的mac地址 | - |
发送端IP地址 | RTA to PC1的IP地址,即10.1.1.2/24 | - |
目的以太网地址 | PC1的mac地址,即10.1.1.1/24对应的mac地 | - |
目的IP地址 | PC1的IP地址,即10.1.1.1/24 | - |
说明:
在ARP应答中,以太首部中的源地址和目的地址与ARP应答报文中的发送端地址和目的地址完全相同。
以ARP Request为例说明ARP分组格式的参数填写,界面如图4所示。图4 ARP分组格式界面显示
- 00 01为硬件类型,值为1表示以太网地址。
- 08 00为协议类型,值为8表示IP地址。
- 06表示硬件地址长度为6字节。
- 04表示协议地址长度为4字节。
- 00 01表示OP,值为1表示是ARP请求。
- 00 e0 fc 01 a5 03表示发送端以太网地址。
- c0 a8 62 01表示发送端IP地址。
- 00 00 00 00 00 00表示目的以太网地址为未知。
- c0 a8 62 02表示目的IP地址。
说明:
以后很可能RTA也要向PC1进行数据传送,为避免总是发送ARP请求及应答,减少网络上的通信量采取以下做法:
- 当PC1向RTA发送ARP请求时,就已经将自己的IP地址到物理地址的映射写入ARP请求中。
- 当RTA收到PC1的ARP请求后,RTA就将PC1的这一映射写入到了自己的ARP缓存中。
7、当封装到以太帧头时,发现目的mac地址(11.1.1.2/24对应的mac地址)未知,故也要发ARP广播请求。在此ARP请求中:
- 以太网源地址为RTA to PC2的mac地址,即11.1.1.1/24对应的mac地址。
- OP为1,表示ARP请求。
- 发送端以太网地址为RTA to PC2的mac地址,即11.1.1.1/24对应的mac地址。
- 发送端IP地址为RTA to PC2的IP地址,即11.1.1.1/24。
- 目的以太网地址为未知,以全0填充。
- 目的IP地址为PC2的IP地址11.1.1.2/24。
- 以太网目的地址为RTA to PC2的mac地址,即11.1.1.1/24对应的mac地址。
- 以太网源地址为PC2的mac地址,即11.1.1.2/24对应的mac地址。
- OP为2,表示ARP应答。
- 发送端以太网地址为PC2的mac地址,即11.1.1.2/24对应的mac地址。
- 发送端IP地址为PC2的IP地址,即11.1.1.2/24。
- 目的以太网地址为RTA to PC2的mac地址,即11.1.1.1/24对应的mac地址。
- 目的IP地址为RTA to PC2的IP地址,即11.1.1.1/24。
说明:
与前面RTA学习PC1的ARP映射一样,PC2也相应地在自己的ARP缓存中记录了RTAc口的IP地址到物理地址的映射。9、RTA此时已经收到ARP应答,得到了PC2的mac地址,进行以太帧头的封装。然后将数据报发送给PC2。
10、PC2回应PC1的ICMP包。
11、PC2收到此数据报后,拆封以太帧头,拆封IP首部后发现是个ICMP请求回显报文,于是会回复一个ICMP回显应答报文给PC1。此时的源IP地址变成了PC2的IP地址11.1.1.2/24,目的IP地址变成了PC1的IP地址10.1.1.1/24。由于目的IP与源IP不在同一网段,所以PC2也要查找FIB表,经查找得知下一跳为RTA c口 11.1.1.1/24。如前所述,PC2的ARP缓存中已经记录了RTA c口的映射信息,故不需要再向RTA发送ARP请求,直接在ARP缓存中读到RTA 11.1.1.1/24的mac地址进行封装,将数据报发给RTA。同理RTA也不用向PC1发送ARP请求,直接在自己的ARP缓存中读到PC1的mac地址,将数据报转发给PC1。
12、PC1收到数据报后,逐层拆封以太帧头、IP首部,得到ICMP回显应答,显示ping通。