淺談ICMP/ping、traceroute、MTR、fping

日常網絡中常用的監控大多是基於ICMP協議開發的,今天打算梳理一下已知的各種監控工具(手段),看看他們之間有什麼區別和關聯。配合Wireshark完成了一些對協議上的理解。本博客中提到的用源地址是172.31.0.7(我雲主機中的內網ip)目的地址是202.101.33.1沒有什麼特殊的意義,隨便敲了一個可用的地址,就目前狼多肉少的年代,隨意敲一個ip出來可能都是在用的。

注:以下截圖和參數均在CentOS 6.5中呈現的,其他系統和版本可能不相同。


ICMP協議

ICMP是(Internet Control Message Protocol)Internet控制報文協議。它本身不會像TCP、UDP那樣作爲信息載體的傳輸協議,但是它可以承載一些數據交互性的數據,針對網絡情況作出判斷和結果輸出。按照官方語言解釋就是:錯誤偵測與回報機制。

簡單的說一下ICMP的類型:

ICMP類型介紹——描述

類型0 Echo Reply——回顯應答(Ping應答)

類型3 Network Unreachable——網絡不可達

 

類型11 TTL equals 0 during transit——傳輸期間生存時間爲0

好了,我們帶入應用慢慢理解其中的意思吧。我們在排查網絡故障中常用的基於ICMP的工具有ping、traceroute、MTR、fping,用的最多的應該就是ping了吧?話不多說,就從ping開始入手吧。

ping

使用

ping的使用很簡單,無論在Windows、linux、mac系統中都是可以直接拿來用的,最原始的使用格式就是ping後面加上目的ip即可,默認是用設備的接口地址作爲源地址進行ping操作,也可以通過增加參數來更改默認值。

-c count

增加-c參數可以指定ping的次數,比如計算50次中的丟包率,延遲就需要寫入-c 50即可。

-i interval

這裏明確說一下這是小寫的i不要記混,ping默認的間隔是1秒發送一次ping包,可以通過-i修改間隔時間,間隔時間最短目前只支持到0.2s。

-s packetsize

修改ping包的大小,默認值爲56字節,可以測試大包修改相應的數值。

-t ttl

通過-t可以修改ttl值(生命週期),這裏多說一點,現實網絡中傳輸是要經過運營商的,也就是常見的電信、聯通、移動等ISP服務提供商,所以兩個設備之間必定有多設備進行轉發,纔可以把數據包傳到目的設備上,當數據包經過一次轉發設備ttl值就會遞減1個值,所以默認ping的話只要對端設備不進行icmp策略限制,只要對端不是宕機狀態,理論上ping是完全可以把包送過去的,國內最遠的距離也不過30跳,當然如果中間路由有環路發生,ttl值就會遞減到0從而丟棄報文。

利用這一點,就可以通過ttl值來檢測網絡中的跳數,比如我在篩選IDC網絡質量時會設定一個目的地址,多個IDC機房同時ping向同一個目的ip,把ttl值固定在10,凡是沒有ping通的就說明已經超過了10跳,沒有通的IDC就會被篩選在外了。

-I interface or address

這裏的i就是大i(I)了,所代表的意思是指定接口/ip地址爲源進行ping操作,默認是通過自己的接口ip作爲源的,或者是設備上的默認路由接口,所以使用該參數就可以更換想要的源地址進行ping操作。

抓包

ping-抓包截圖

– 通過抓包來看ping所使用的協議類型爲ICMP。

– 報文內容上有源ip地址和目的ip地址。

– ping的工作原理是一問一答的形式,request作爲發起端的“問”,reply作爲回覆端的“答”。

– request和reply的ttl值也不相同,一個是64一個是241。

– “time字段”展示就是發送時間和迴應時間,通過計算可以得出ping的延時。

ping延時字段

– 以毫秒爲單位的時間,這裏的時間值,就是我們使用ping時屏幕上回顯出來的延時值。

Traceroute

使用

在使用上直接輸入traceroute後面跟上目的ip地址就可以正常使用。如需要更改默認配置可參考以下參數。

-i device

Specifies the interface through which traceroute should send packets. By default, the interface is selected according to the routing table.

默認情況下調用默認接口、默認路由ip爲源向目的ip進行探測,通過-i參數可以修改默認源接口或源ip地址。

-m

max_ttl Specifies the maximum number of hops (max time-to-live value) traceroute will probe. The default is 30.

默認ttl值爲30,也就是說默認可以探測出30跳設備ip信息,在國內30跳完全夠用,除非有環路發生。如果爲了排除某些超過額定跳數的節點可以通過-m來設定。

-w waittime

Set the time (in seconds) to wait for a response to a probe (default 5.0 sec)

每次探測等待迴應的時間默認爲5秒,如果某個節點有icmp迴應限制,不進行icmp迴應,那麼traceroute進程需要等上5秒後纔會發出下一次探測請求,通過-w可以修改等待時間。

-q nqueries

Sets the number of probe packets per hop. The default is 3.

每一箇中間節點設備的探測次數默認爲3次,如果某一跳的負載設備有5個或者更多,那麼默認探測可能就無法全面的反饋出轉發節點信息,可以通過-q參數修改每一跳的發包數量。

-n

Do not try to map IP addresses to host names when displaying them.

默認情況下traceroute在探測時會解析主機名,如果我們不需要知道主機名只需要ip信息的話加上-n即可。

-f first_ttl

Specifies with what TTL to start. Defaults to 1.

首次探測ttl爲1,這是爲了全面的反饋出中間路徑的所有設備信息,但是如果前幾個設備都是內網設備,探測內網對於監控來說是沒有必要的,所以我們可以通過-f參數修改初始ttl值來忽略前幾跳的內網設備。

traceroute-f-參數對比

抓包

traceroute-UDPICMP

– 與ping很相似,都有源地址和目的地址。

– traceroute的報文形式比較特殊,並不是全部使用icmp協議,從抓包上看同時使用了udp協議。

– 左圖是在linux系統中回顯的結果,右圖是通過抓包工具展示的情況,對比分析。

– 圖中黑底色的條目是異常報文,作爲報錯顯示出來。

– 通過抓包查看,探測是使用udp進行逐條探測,然後“不知道什麼原因”探測就失敗了,失敗之後通過icmp返回數據。

– traceroute默認測試的時候出現了大量的dns報文,也就是說默認是添加了解析的可以通過-n參數取消dns解析,不查看ip的主機名。

探測失敗的原因

tracert-ttl遞增

– 依次打開了幾個抓包窗口,細心的朋友應該會發現在標題欄顯示出來的分組號並不是連續的,那是因爲traceroute探測時默認發出3個探測報文,所以分組號也是相隔3個。

– 根據抓包中紅色指針的位置看,ttl值是逐漸遞增的,也就是說每發出3次報文後,ttl遞增1個。

– 由此看出,traceroute在探測到目的ip地址時候,第一次探測ttl爲1,然後就失敗了(上文ping中說到ttl爲0報文就被丟棄),失敗的時候通過icmp返回了一個ip,這個ip就回顯在我們的探測界面上了。然後進行第二次探測ttl值該爲2時,同樣也會失敗,然後返回值,周而復始直到最終到達目的ip地址上。

– icmp返回的信息會攜帶着被誰丟棄的報文,然後把它的ip帶回來並顯示出來,這樣也就是我們在使用時看到的顯示出逐跳的ip地址。

– 通過修改參數-q可以修改每跳發送的數據包,默認值爲3個,在網絡環境中轉發設備或者轉發接口會有很多,通過修改-q參數可以提升每次探測的數量從而可以被更多的同跳其他設備進行包轉發,返回的值(轉發設備ip、轉發延遲、轉發丟包等信息)可作爲排障的參考。

MTR

抓包

MTR的作用和traceroute很相似,大致上都是逐跳的回顯出每跳設備的ip信息。

mtr-crt與抓包對比

– 不難看出它的探測機制也是TTL逐條遞增來探測的,同樣是根據TTL爲0時返回失敗的信息。

– 從左邊回顯出來數據來看,MTR是實時的,設置好發包頻率就可以快速的回顯數據。

– 右邊抓包數據來看粉底色的數據爲正常的數據包傳輸,黑底色爲錯誤信息包的回顯輸出。

– 仔細對比兩邊的數據發現第六跳和其他跳數返回值不太一樣,按理說也應該在右邊抓包圖中出現黑底色的數據,但是該出中卻沒有出現。

第六跳出現了

mtr-第6跳出現了

– 我上面的截圖中,左右兩邊的時間是不一樣,左邊是已經發第8個包了,右邊爲一開始的輸出結果。

– 一開始的時候左邊第六跳確實沒有回顯出來,但是多次探測後第六跳出現,也就是圖中顯示的丟包百分比。

– 然後抓包數據在後來的幾次發包中才有了數據呈現。

MTR與traceroute對比

既然提到兩種探測機制比較相近但是又不完全一樣,理所應該做個對比。

mtr與traceroute對比

  1. 首先看到的是MTR全程使用的ICMP協議,traceroute間接使用UDP探測,ICMP回顯。
  2. 通過應用界面的輸出結果MTR爲實時探測,traceroute相對來說數據更新較爲後置,如果需要更新數據,需要手動多次探測。
  3. MTR輸出信息全面,丟包、最大延遲、平均延遲、最小延遲都可以展現出來,traceroute只能展現出ip信息和延遲丟包信息。
  4. MTR的多次探測是輪詢完一次之後繼續下一輪的探測,而traceroute可逐條發送多個探測報文進行探測,多次探測後再繼續探測下一個轉發節點。
  5. 它們同樣利用TTL遞增來探測逐跳設備信息。

fping

fping就像是扇形的ping檢測,由一個源地址爲節點出發,分散性的ping向目標ip段,讓測試變得更加高效。

使用

-g

ip區間表示需要增加-g參數,可以用fping -g 192.168.1.0/24這樣的形式展示也可以用fping -g 192.168.1.1 – 192.168.1.254這樣區間展現的形式。

-q

安靜模式,所謂安靜就是中途不輸出錯誤信息,直接在結果中顯示,輸出結構整齊、高效。

-C

這裏的“c”是大“C”,輸入每個ip探測的次數。

-i

通過-i參數可以修改發包間隔,默認爲25毫秒一個探測報文。

抓包

fping-crt和抓包左右對照

– 通過截圖中的信息可以看出,fping全程使用ICMP協議,猶如使用了多次ping工具。

– 理解我說的扇形ping。

– 遇到不通的地址返回“- – – – -”表示失敗。

– 多次返回ping的延遲數據。

– 左側紅框內的ip和右側紅框內的ip對應,依次遍歷所有/27內的所有ip信息。

fping與ping的對比

同樣的,既然兩者在探測方法上很相似,那就做個對比吧。

fping與ping中的date數據不同

1. 它們使用的協議相同都是ICMP。

2. 探測機制和默認回顯相同都是延遲、丟包狀態。

3. fping可同時探測多個ip,ping只能手工輸出不通ip段。

4. fping的數據包大小爲56字節,ping的數據包字節爲48(ping全部默認字節爲56)。

5. fping默認ping間距爲25毫秒,ping默認爲1秒。

總結

分析也分析了,對比也對比了,簡單的總結一下吧。

1. 單獨進行網絡連通性測試使用ping即可。

2. 範圍性的檢測連通性,比如檢測一個辦公室內,哪些ip正在使用,可以使用fping。

3. 在網絡排查中單獨ping很難把所有中間轉發鏈路和轉發接口全部壓上的,所以使用fping,利用五元組(源目ip、源目mac、端口號)中的不同的目的ip、目的mac可以儘可能的壓上所有鏈路,進行網絡探測工作。

4. fping還可以用於網絡監控、監控設備存活、批量輸出延遲信息使用。

5. traceroute可直接探測源目ip地址中間,轉發設備的ip信息和連通性。

6. MTR可以實時監測每時每刻的轉發信息。

7. 相比traceroute的信息輸出,MTR有着更全面輸出結果。

8. MTR的整齊輸出格式可用於日常監控使用,可以結合ping或者fping進行連通性探測,當出現某個目的ip不通時激活MTR進程,進行逐條探測,然後以文本形式輸出(-r參數),可作爲歷史故障分析使用。

日常網絡工作中會遇到千奇百怪的故障類型,只會一種探測手段肯定無法全面的分析故障,多掌握一種工具,就多了一把利器,多了一條解決問題的路。

願我們的運維之路越走越寬,越走越順!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章