转载自:ping命令整个过程详解
略有增删改。
在这里讲ping的两情况:一种是同一网段内,一种是跨网段的ping。
一、同一网段内
首先,如果主机A,要去ping主机B,那么主机A,就要封装二层报文,他会先查自己的ARP缓存表(IP-MAC的映射),如果没有B的MAC地址,A就会向外发送一个ARP广播包,如图:
其中ARP报文格式如下:
其中OP
1:表示ARP请求
2:表示ARP应答
3:表示RARP请求
4:表示RARP应答
首先,交换机收到这个报文后,它会学习到A的MAC和入端口号并保存在MAC地址表中(MAC-port映射)(或者更新A的MAC-port生存期),接着,它会向所有端口发送这个ARP广播包,其它主机收到后,发现不是在找自己,就纷纷丢弃了该报文,不去理会(路由器可以隔绝广播域,一般情况下会丢弃广播包,除非开了代理ARP功能)。主机B收到报文后,就立即响应,我的MAC地址是多少,并回复一个ARP响应报文格式给主机A。如图:
二、不同网段内ARP报文格式为:
交换机收到ARP响应包之后,先学习B的MAC-port并记录在MAC地址表中(或者更新B的MAC-port的生存期),接着它根据目的MAC查找MAC地址表,发现这个目的MAC跟port有映射,所以直接把这个ARP响应包从该端口发出去给A了。
而主机A根据ARP响应包,学到了主机B的MAC地址,就把这个MAC地址封装到ICMP协议的二层报文中向主机B发送,报文格式如下:
交换机这个时候已经知道目的MAC为B的数据包要从哪个端口发出去了,所以它会把ICMP包直接从该端口单播出去。
当主机B收到了这个报文后,发现是主机A 的ICPM回显请求,就按同样的格式,返回一个值给主机A,这样就完成了同一网段内的ping过程。
在这里,讲了这么久的局域网内的PING,实际过程的发生不到1毫秒。
如果主机A要ping主机C,那么主机A发现主机C的IP和自己不是同一网段,他就去找网关转发,但是他也不知道网关的MAC地址情况下呢?他就会向之前那个步骤一样先发送一个ARP广播,学到网关的MAC地址,再发封装ICMP报文给网关路由器.。ICMP报文格式如下(目的MAC是路由器的网卡地址,目的IP还是主机C的ip。这也进一步反应了链路层只管一跳,而网络层管host-to-host):
当路由器收到主机A发过来的ICMP报文,发现其目的地址是本身MAC地址,根据目的的IP2.1.1.1,查路由表,发现2.1.1.1/24的路由表项,得到一个出端口,去掉原来的MAC头部,加上自己的MAC地址向主机C转发。(如果网关也没有主机C的MAC地址,还是要向前面一个步骤一样,ARP广播一下即可相互学到。路由器2端口能学到主机D的MAC地址,主机D也能学到路由器2端口的MAC地址。)报文格式如下(源MAC是路由器网卡地址,目的MAC是主机C的地址):
最后,在主机C已学到路由器2端口MAC地址,路由器2端口转发给路由器1端口,路由1端口学到主机A的MAC地址的情况下,他们就不需要再做ARP解析,就将ICMP的回显请求回复过来。报文格式大致如下:
路由器收到ICMP响应后,修改ICMP包的目的MAC为00-50-56-C0-00-01,源MAC为00-50-56-C0-00-02,源IP和目的IP保持不变。