1、引言
在錯綜複雜的網絡的世界裏,如何知道對方主機是否可達,鏈路是否暢通是一個不太簡單的問題。如今有兩種經常使用的程序或命令來檢查這些問題(ping與traceroute命令)。 "ping"這個名字來源於航海的聲納定位操做。其操做相似於聲納定位。只不過這裏發送的是ICMP數據包而不是聲波。該命令的目的是用於肯定某個主機是否可達,距離當前主機多遠。 traceroute,正如它的名字同樣,該命令用來打印出主機A到主機B中間走過的路由IP地址。linux
2、ping命令
1.原理
ping的原理實際上很簡單。就是主機A想要知道主機B的某些信息(如是否可達)。這時候主機A就像主機B發送一份ICMP回顯請求數據包,而且爲主機B迴應等待一段時間(超時);主機B收到ICMP回顯請求數據包後迴應一個ICMP回顯應答數據包給主機A,若主機B不可達或出錯,主機A會超時或收到ICMP不可達差錯數據包。須要注意的是ping命令只會檢查到某個主機而不可以具體到某個端口號。
微信
2.ICMP回顯請求/應答數據包
上圖爲該數據包格式。網絡
- 具體的ICMP數據包參見:(5)TCP/IP協議-ICMP協議
- 當前類型字段值爲:0-ICMP回顯請求數據包,8-ICMP回顯應答數據包。
- 代碼段:都爲0
- 標識符:unix系統一般是設置稱品尼高程序的進程ID
- 序列號:沒發送一次新的回顯請求就加1
3.抓包
運行ping baidu.com 併發
用wireshark抓包能夠看到,有四組ICMP回顯請求/應答數據包 3d
對於其中一組(47與48) unix
除了Type字段不一樣,其餘都相同指針
4.ping命令經常使用的IP選填字段。
還記得IP數據包有一個選項字段(參見:(3)TCP/IP協議-IP協議的圖1)。這個選項區域是可選的。該區域能夠作不少事情,如記錄每一次的路由跳轉ip地址或者傳輸時間等等。 對於ping命令能夠乾的事情有記錄每一次的跳轉路由或者傳輸時間。這裏以記錄IP路由爲例,其餘相似: code
- code:一個字節,指明該選項是什麼選項。對於RR選項(Route Record,記錄IP路由)來講,爲7。
- len:一個字節,指明總的字節數,一般該值爲39。
- ptr:一個字節,指針字段,指向存放下一個IP地址的位置。能夠把該字段後面的當成一個棧,ptr指向棧頂。
- 後面的字段:每4個字節爲一個IP地址。因爲IP地址最大首部長度的限制,最多存放9個IP地址。
能夠window經過命令ping -r 9 baidu.com
來查看,linux經過ping -R baidu.com
來查看 cdn
3、traceroute命令
咱們描述了IP記錄路由選項。爲何不使用這個選項而另外開發一個新的應用程序?有三個方面的緣由:blog
- 不是全部的路由器都支持IP記錄路由選項;
- 記錄路由通常是單向的選項。發送端設置了該選項,那麼接收端不得不從收到的IP首部中提取出全部的信息,而後所有返回給發送端;
- IP首部中留給選項的空間有限,不能存放當前大多數的路徑;這是最主要的緣由。
1.原理
- traceroute程序使用ICMP數據包(超時與端口不可達)和IP首部中的TTL字段(生存週期,初始值通常是64)。
- 每一個處理數據報的路由器都須要把 TTL的值減1。若是路由器轉發數據報的時延超過1秒,那麼它將把TTL值減去所消耗的時間(秒數)。TTL字段的目的是防止數據報在選路時無休止地在網絡中流動。
- 當路由器收到一份IP數據包,若是其TTL字段是0或1,則路由器不轉發該數據報(接收到這種數據報的目的主機能夠將它交給應用程序,這是由於不須要轉發該數據報。
- 發送過程:
- 它發送一份TTL字段爲1的IP數據包給目的主機。
- 處理這份數據報的第一個路由器將TTL值減1,丟棄該數據報,併發回一份超時ICMP數據包。
- 這樣就獲得了該路徑中的第一個路由器的地址。
- 而後 traceroute程序發送一份TTL值爲2的數據報,這樣咱們就能夠獲得第二個路由器的地址。
- 繼續這個過程直至該數據報到達目的主機。
- 可是目的主機哪怕接收到 TTL值爲1的IP數據報,也不會丟棄該數據報併產生一份超時ICMP數據包,這是由於數據報已經到達其最終目的地。因爲traceroute發送的是一份UDP數據包,選擇一個不可能的值做爲 UDP端口號(大於30000),使目的主機的任何一個應用程序都不可能使用該端口,所以,當該數據報到達時,將使目的主機的UDP模塊產生一份「端口不可達」錯誤的ICMP數據包。這樣,traceroute程序所要作的就是區分接收到的ICMP數據包是超時仍是端口不可達,以判斷何時結束。
2.舉例
在liunx上運行traceroute baidu.com
或window上運行tracert baidu.com
。
- 其中每一行,爲路由的一跳。
- 一行默認重試三次,若ip相同,只顯示一遍(如第1跳),若不一樣分開顯示。後面的時間是分別是三次跳轉時間。
都看到這裏了,要不要掃二維碼關注一下微信公衆號林灣村龍貓。