備注: 測試機器為Mac
重點展示本機發出icmp的過程(dns-->arp-->icmp)
本機默認網關
->route -n get e -n get default
route to: default
destination: default
mask: default
gateway: 192.168.0.1
interface: en0
flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 0
清除arp緩存以后,ping www.baidu.com
->arp -d -a;arp -d -a;arp -a;ping
www.baidu.com
192.168.0.1 (192.168.0.1) deleted ##arp -d -a 返回結果,沒有緩存不返還任何信息
PING www.a.shifen.com (119.75.213.61): 56 data bytes
64 bytes from 119.75.213.61: icmp_seq=0 ttl=56 time=5.947 ms
64 bytes from 119.75.213.61: icmp_seq=1 ttl=56 time=6.376 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 5.947/6.162/6.376/0.214 ms
wireshark抓包
流程:
通過dns服務拿到IP--->IP不跟自己在一個網段,通過需要路由轉發--->通過路由信息得到網關IP(192.168.0.1)------>arp廣播獲得網關MAC(c8:xx:xx:xx:xx:c8)---傳遞Icmp包
這里之所以arp廣播在dns前面,是因為我的機器有其它的進程的通信用到了arp廣播,因為arp廣播后會有記錄,所以DNS后直接從緩存中拿到了網關MAC. 此時就可以把MAC封裝到幀中作為destination地址,在3層的時候加上src ip和destination ip...
測試過程的優化
下圖是我優化過的抓包結果,在抓包過程中做了一個循環,用來清除arp緩存,循環和代碼輸出結果如下:
->while [ 1 ]
> do
>echo =======delete
> arp -d -a
> done
...
...
=======delete
=======delete
192.168.0.1 (192.168.0.1) deleted
=======delete
=======delete
=======delete
...
...
...
這樣就會出現下圖中的結果,我們看到DNS只執行了一次.
由於我們一直在清除ARP所以發送ICMP之前會出現若干次的ARP廣播.
總結
- ping我們可以認為是通過發送icmp包來探測主機狀態.
- ping程序需要發送icmp協議,該協議位於IP協議之上,所以我們要知道源IP和目的IP並封裝到IP報文中,這時用到了DNS解析結果: 119.75.216.20
- IP報文到達二層之后,需要封裝源主機和"目的主機"(下一跳地址,並不是2中提到的目的地址)的MAC地址,成為幀.
- 通過物理鏈路傳輸
- 經過多個路由的轉發到達119.75.216.20,轉發過程中重新封裝幀.

