系列TCP/IP協議-ping與traceroute命令(006)

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回顯請求/應答數據包

圖1.ICMP回顯請求/應答數據包格式

上圖爲該數據包格式。網絡

  • 具體的ICMP數據包參見:(5)TCP/IP協議-ICMP協議
  • 當前類型字段值爲:0-ICMP回顯請求數據包,8-ICMP回顯應答數據包。
  • 代碼段:都爲0
  • 標識符:unix系統一般是設置稱品尼高程序的進程ID
  • 序列號:沒發送一次新的回顯請求就加1

3.抓包

運行ping baidu.com 併發

圖2. 運行ping

用wireshark抓包能夠看到,有四組ICMP回顯請求/應答數據包 3d

圖3.四組抓包數據

對於其中一組(47與48) unix

圖4. ping的ICMP回顯請求數據包
圖5.ping的ICMP回顯應答數據包

除了Type字段不一樣,其餘都相同指針

4.ping命令經常使用的IP選填字段。

還記得IP數據包有一個選項字段(參見:(3)TCP/IP協議-IP協議的圖1)。這個選項區域是可選的。該區域能夠作不少事情,如記錄每一次的路由跳轉ip地址或者傳輸時間等等。   對於ping命令能夠乾的事情有記錄每一次的跳轉路由或者傳輸時間。這裏以記錄IP路由爲例,其餘相似: code

圖6. IP記錄路由選項

  • 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

圖7.linux中的ip路由選填字段

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

圖8. Linux上運行結果

  • 其中每一行,爲路由的一跳。
  • 一行默認重試三次,若ip相同,只顯示一遍(如第1跳),若不一樣分開顯示。後面的時間是分別是三次跳轉時間。

都看到這裏了,要不要掃二維碼關注一下微信公衆號林灣村龍貓

微信公衆號rudy_tan_home
相關文章
相關標籤/搜索