在工做開發過程當中,咱們常常會使用到ping和traceroute。在這裏,咱們將細述其工做原理,讓你在會用的基礎之上理解其內部工做過程。緩存
Ping 是 ICMP 的一個重要應用,主要用來測試兩臺主機之間的連通性。Ping 的原理是經過向目的主機發送 ICMP Echo 請求報文,目的主機收到以後會發送 Echo 回答報文。Ping 會根據時間和成功響應的次數估算出數據包往返時間以及丟包率。服務器
Ping的完整工做流程:
Ping本質上是ICMP數據包,因此其工做流程就是ICMP數據包的發送與解析流程。
大體流程以下:
構造ICMP數據包-->構造IP數據包-->構造以太網數據幀----物理傳輸到目標主機---->獲取以太網數據幀-->解析出IP數據包-->解析出ICMP數據包-->發送回送應答報文微信
本地主機處理流程:網絡
目的主機處理流程:工具
因此,Ping的本質其實就是ICMP回送請求報文和回送應答報文。咱們可經過Wireshark抓包工具對Ping進行分析。使用ping命令:測試
本機會向遠端主機發送ICMP回送請求報文。3d
遠端主機收到後會發送回送應答報文:
code
Traceroute 是 ICMP 的另外一個應用,用來跟蹤一個分組從源點到終點的路徑。有2種實現方案:基於UDP實現和基於ICMP實現。blog
在基於UDP的實現中,客戶端發送的數據包是經過UDP協議來傳輸的,使用了一個大於30000的端口號,服務器在收到這個數據包的時候會返回一個端口不可達的ICMP錯誤信息,客戶端經過判斷收到的錯誤信息是TTL超時仍是端口不可達來判斷數據包是否到達目標主機。流程以下:圖片
Linux中的traceroute就是這種實現方式。
在這一種實現中咱們不使用UDP協議,而是直接發送一個ICMP回顯請求(echo request)數據包,服務器在收到回顯請求的時候會向客戶端發送一個ICMP回顯應答(echo reply)數據包。流程與上面類似,只是最後判斷結束上爲目標主機(而不是中間通過的主機或路由器)返回一個ICMP回顯應答,則結束。
Windows中的tracert就是這種實現方式。利用Wireshark分析以下:
在cmd下輸入tracert www.baidu.com
:
每一跳默認發送三個數據包,咱們會看到下面這樣的輸出:
能夠看到TTL逐個遞增,而且最終到達目的主機180.97.33.107,到達目的主機,目的主機回覆,終止。
關注微信公衆號,天天進步一點點!