農林漁牧網

您現在的位置是:首頁 > 農業

HCIE學習 Ping tracert原理詳解

2022-08-23由 泰克馮瑩瑩 發表于 農業

ping協議發出什麼報文

ping和tracert作為網路工程師平時最常用的兩個工具,都是基於ICMP來實現的。今天準備給大家分享下其詳細工作原理。

HCIE學習 Ping tracert原理詳解

ICMP

ICMP(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議簇的一個子協議,用於在IP主機、路由器之間傳遞控制訊息。控制訊息是指網路通不通、主機是否可達、路由是否可用等網路本身的訊息。

這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。如下圖1,它可以透過不同數值的 “type”和“code” 欄位來發送不同含義的包。

HCIE學習 Ping tracert原理詳解

圖1 ICMP報文格式

不同的“type”和“code”表示的含義會有所不一樣,表1中給大家列舉了常見的ICMP訊息“type”和“code”。

表1 ICMP訊息型別程式碼對應表

HCIE學習 Ping tracert原理詳解

上表中我們最常見的控制訊息就有ping請求包和響應包、tracert包。我們接下來就先給大家講解下ping的基本原理。

HCIE學習 Ping tracert原理詳解

ping

如下圖就是ping的請求包和響應包,ICMP是屬於IP層協議,所以其封裝在IP包中,協議號為1。而ping的請求包屬於ICMP包中眾多型別中的一種,其type欄位為8表示ping的請求包,為0表示ping的響應包。

HCIE學習 Ping tracert原理詳解

圖2 ping請求包

HCIE學習 Ping tracert原理詳解

圖3 ping響應包

我們ping的目的就是測試和某個目的地址能否正常通訊,當我們在主機或者路由器上敲下“ping x。x。x。x”時,主機或者路由器就會向目的IP傳送ping的請求包,目的主機收到後立即回覆ping響應包,收到ping響應包即可認為和目的主機之間能正常通訊,這就是ping的基本原理。以下用圖4中所示案例給大家解析其過程。

HCIE學習 Ping tracert原理詳解

圖4 ping原理案例圖

整個網路IP網段規劃如圖,且正常執行OSPF協議。在此基礎上,R1去ping R5的loopback0口10。5。5。5。

則R1封裝一個以10。5。5。5為目的IP的ping包傳送出去,10。5。5。5收到ping請求包,立即給R1回覆ping的響應包。剛我們說到ping包的目的IP是10。5。5。5,那源IP又是誰呢?源IP是出介面的IP,即R1的GE0/0/0的IP,而不會用loopback0口作為源IP,除非在敲ping命令時指定源IP。華為路由器和交換機裝置上指定源IP的方式如

下:ping -a 10。1。1。1 10。5。5。5則指定源為10。1。1。1。-a則表示指定源IP,除此以外,ping命令後還可以接很多引數,如圖5所示。

HCIE學習 Ping tracert原理詳解

圖5 華為裝置ping命令可使用引數

我們把一些常用引數給大家解釋下:

-a:指定源IP,不指定則以出介面作為源IP;

-c:發ping包的個數,不指定則預設發5個;

-h:發ping包時IP包頭部中填充的TTL值,不指定則TTL預設為255;

-i:選擇從哪個介面發包出去,不指定則按路由表中的出介面發包;

-s:指定發ping包的大小,不指定則按56位元組傳送;

-t:等待的超時時間,預設為2000ms,不指定則ping包發出2s後沒有收到ping響應包則認為超時。

以上便是ping常用指定引數的解釋。講到這裡可能有小夥伴不禁想問那如果是R2去ping R5的loopback0時,在不指定源的情況下,會用哪個出口作為源地址。

R2達到R5的loopback0介面路由是負載的,所以GE0/0/1和GE0/0/2的介面IP都有可能,是隨機的。可能還有小夥伴想問具體怎麼隨機的?這就涉及到當路由表中路由條目是負載時,裝置具體怎麼轉發資料包的問題了。接下來先給大家解釋下資料在路由負載情況下怎麼轉發資料包。

HCIE學習 Ping tracert原理詳解

負載方式

裝置在轉發資料時,負載方式有兩種,第一種是逐包負載,第二種是逐流負載。那麼逐包負載和逐流負載又是什麼意思呢?

逐包負載,按包的個數負載。以圖4為例說明,當R2有多個包需要傳送給10。5。5。5時,第一個包選擇GE0/0/1為出口,則第二個包則選擇GE0/0/2為出口。此種方式容易造成收發順序不一致,例如,R2有四個包需要傳送給10。5。5。5,傳送順序為①②③④,①③選擇從GE0/0/1口傳送,②④選擇從GE0/0/2口傳送,但因為上面一條路徑擁塞,導致①③轉發比較慢。最終R5收到包的順序為②④①③,所以華為裝置預設採用逐流負載。

逐流負載,同一種流量只會向同一條路徑轉發,例如R2有FTP和HTTP的流量都需要發包給10。5。5。5,FTP流量選擇從GE0/0/1介面傳送,則HTTP流量則有可能從GE0/0/2傳送。就不會造成同一種流量的收發包順序不一致,但是此方式不好的點在於容易造成負載不均衡。當FTP流量和HTTP流量大小不一致時,會發生一條線路轉發流量多,另一條則比較少。

那裝置又是如何判斷哪些流量是同一種流量的呢?需要根據報文的五元組來判斷,五元組有源IP、目的IP、協議號、源埠號、目的埠號。五元組相同則認為是同一種流量,轉發報文時則只向同一條線路轉發。

具體轉發時,會用五元組進行hash計算,計算出一個hash值,然後用hash值除於2(2表示負載的路由條數,負載路由條目是3則除於3,以此類推),然後看餘數,餘數此時要麼為0,要麼為1。為0則選擇GE0/0/1,為1則選擇GE0/0/2。所以同種流量的五元組是一致的,則其hash值是一致的,最後的餘數也是一致的,選擇的路徑自然一致。

當然,不是所有流量都有五元組,有的只有三元組,例如OSPF包和ICMP包,它們並沒有用TCP或者UDP封裝,所有沒有源目埠號,只有源目IP和協議號,此時則用源目IP和協議號計算。這就是裝置逐流負載的原理。

回到圖4中,R2去ping 10。5。5。5時,因為沒有指定源IP,所以用目的IP和協議號兩個值hash計算,根據計算結果選擇GE0/0/1或者GE0/0/2,選擇GE0/0/1則以該介面IP作為源IP傳送ping包。

細心的小夥伴讀到這裡或許會發現,那豈不是意味著R2 ping 10。5。5。5時,只會向R3或者R4一個方向發包。對的,所以此時R2 ping 10。5。5。5時只會選擇一條路徑。

那為什麼我們有時候tracert 某個地址的時候會顯示多條路徑呢?tracert又是怎麼實現的呢?

HCIE學習 Ping tracert原理詳解

tracert

接下來我們開始給大家分析下tracert的原理

以上就是ping的基本原理,那tracert的原理又是怎麼樣的?

當我們tracert某個地址時,裝置會發送TTL逐次加1的ping包或者UDP包,並且預設情況下每個TTL值傳送三個包。為了便於大家閱讀,我把圖4放到下面來,用它舉例說明。但是百度因為圖片重複不給過,只能麻煩大家再翻到前面看圖4案例

當我們R1上tracert 10。5。5。5時,R1會向10。5。5。5傳送UDP的包,第一次傳送TTL=1的包,連續傳送三個。因為其TTL=1,所以此包只能傳送到R2。

R2處理完後會把TTL減為0則不能再繼續傳送,然後會向R1返回一個TTL減為0的錯誤報告訊息,如圖6就是一個TTL減為0錯誤訊息。此訊息中還會攜帶R1發出的UDP包,表示對該UDP包的TTL報錯。

HCIE學習 Ping tracert原理詳解

圖6 TTL減為0錯誤訊息

此TTL減為0錯誤訊息源IP為R2的GE0/0/0口IP,所以我們就可以知道第一跳的裝置IP地址。之後R1在傳送TTL=2的UDP或ping包出去,此包會發送到第二跳裝置。第二跳裝置同樣返回TTL減為0錯誤訊息,此訊息源IP又為第二跳裝置的IP的地址,所以我們就能知道第二跳裝置的IP地址,依次類推,就能知道整條路徑上所有裝置的IP地址。

每個TTL值的包,裝置會發送三個,所以會返回三個TTL減為0錯誤訊息,在我們的返回介面上就能看到三個時間,這三個時間即表示從發包到收到TTL減為0錯誤訊息的時間,如圖7所示。

HCIE學習 Ping tracert原理詳解

圖7 tracert的時間

當然tracert命令也可以像ping一樣,後面可以接很多引數,包括控制用哪個介面地址去tracert目的地址。我們來看下tracert後面可以接哪些引數。

HCIE學習 Ping tracert原理詳解

圖8 tracert後可接引數展示

-a:指定發包時的源IP地址,不指定則以路由表的出介面作為源地址;

-f:指定第一次發包的TTL值,不指定則TTL為1;

-m:指定TTL最大值,不指定則預設為30,即TTL傳送到30時還沒有跟蹤到目的則自動停止不再發送;

-p:傳送UDP包時目的埠號,不指定則用33434;

-q:指定每個TTL值傳送的包數,不指定則每個TTL值傳送3個包;

以上便是tracert命令後常用引數解釋。

剛在給大家講解tracert原理時,說過當我們tracert某個地址時,裝置會發送TTL逐次加1的ping包或者UDP包,有時候發ping請求包,有時則傳送UDP包,這又是怎麼回事呢?

我們的個人PC tracert某個地址時,是向某個地址傳送ICMP的ping請求包。我們前面剛給大家解釋過負載的原理,因為ping請求包的源目IP和協議號都是固定的,所以其在負載選路時只會向其中某一條條路徑傳送。

假如R1 tracert 10。5。5。5時傳送ping的請求包,則R2在轉發此請求包,只會向R3或者R4轉發(因為其hash值固定),導致不能跟蹤出兩條路徑來,即在R1的介面第二跳只會顯示R3或者R4。

這也是我們個人PC在跟蹤某個地址的路徑時只能跟蹤出一條路徑的原因,那我們在華為路由器或者交換機上跟蹤時能tracert出多條路徑的原理又是什麼呢?

華為路由器或者交換機上tracert某個目的地址時,裝置不是傳送ICMP的ping包,而是傳送UDP的包,並且該UDP報文的目的埠號在依次加1,如圖9所示。

HCIE學習 Ping tracert原理詳解

圖9 tracet時傳送UDP包埠號變化圖

因為其目的埠號在逐次加1,所以其五元組是不一致的,所以這些UDP報文到達R2時,計算出的hash值是不一致的。

最終R2在轉發這些UDP包是就會向不同介面轉發,這也就是在華為路由器或者交換機上能tracert出多條路徑的原因。相信講到這裡大家應該能很清楚ICMP中ping和tracert兩大工具的原理了。

專業分析IT技術,純乾貨,請各位點點關注啦