谈到这个问题,我们首先想到的就应该是分情况考虑:
一、同一网段内的ping操作
假设主机A的IP为:1.1.1.1
主机B的IP为:1.1.1.3
主机A去ping同一网段的主机B,它会封装二层报文,首先去查本地MAC地址表,发现没有B的地址,此时就会发送ARP报文。
目的MAC:源MAC:OP:发送端MAC:发送端IP:目的端MAC:目的端IP
FFFFF:A的MAC:1:A的MAC:1.1.1.1:0000000:1.1.1.3
通过观察报文发现:外面封装了目的MAC地址为FFFFF,源地址为A的MAC的头部,里面的部分意思是:我的MAC和IP都在了,你的IP也有了,返回给我你的MAC地址。
交换机收到A的ARP请求后,就会将查找自己的MAC地址表,如果有,则直接返回给A;如果没有则从所有端口将该报文广播出去;B接收到报文后,给A返回如下格式的报文:
目的MAC:源MAC:OP:发送端MAC:发送端IP:目的端MAC:目的端IP
A的MAC:B的MAC:1:B的MAC:1.1.1.3:A的MAC:1.1.1.1
这样A就学到了B的MAC地址;
下面就可以愉快的进行ICMP报文通信了。
A封装ICMP报文,发送给B,格式如下:
目的地址:源地址:目的IP:源IP:ICMP报文
B的MAC:A的MAC:1.1.1.3:1.1.1.1:request
将学到的MAC地址封装到报文头部,利用MAC地址进行通信;
B收到后,回复报文格式如下:
目的地址:源地址:目的IP:源IP:ICMP报文
A的MAC:B的MAC:1.1.1.1:1.1.1.3:Echoc answer
整个过程就是:先利用ARP学习到B的地址,然后再利用MAC地址发送ICMP报文。
二、不同网段的ping
此时网络中还有一个主机C,IP地址为:2.2.2.2(够2的!)
ApingC的过程如下:
首先A想发报文给C,查找MAC地址表发现,没有C的MAC地址,同时发现C与自己不在一个网段,于是它先发送一个ARP请求,学习到网关的MAC地址;这里可以把网关理解为同一网段的B;
然后再把ICMP报文封装好,发送给网关;
目的地址:源地址:源IP:目的IP:ICMP报文
网关的MAC:A的MAC:1.1.1.1:2.2.2.2:request
报文到达网关之后,路由器根据目的地址查找路由表,找到转发出口。
去掉原来的MAC头部。换成如下的头部:
目的地址:源地址:
C的MAC:另一侧网关的MAC 其他的不变
如果路由器也没有C的MAC地址,则从转发端口先发送ARP报文,学习C的MAC地址。
C收到ICMP报文后,应答如下:
目的地址:源地址:目的IP:源IP:ICMP
网关的MAC:C的MAC:1.1.1.1:2.2.2.2:echo answer
总结
跨网段ping时,可以理解为:两个同网段的过程,通过路由器连接起来了。
最终A学到的也只是网关的MAC地址,这就够了,报文能够顺利转发出去了。