1. 程式人生 > >ping 與 traceroute 的工作原理分析

ping 與 traceroute 的工作原理分析

一、ping

       ping 程式的主要目的是測試主機是否可達,它傳送 ICMP 回顯請求報文給目的主機,並等待返回 ICMP 回顯應答

       ping 程式一般會週期性持續地傳送 ICMP 請求報文,除非使用者手動終止,或指定了傳送報文個數

       回顯請求和回顯應答通過序列號(icmp_seq)進行匹配,下圖中序列號依次為 1、2、3、4 ...

       ping 程式通過資料報中記錄的傳送請求時間值

接收到回顯應答報文的當前時間值,計算往返耗時(time)

       

常見問題:

1.  為什麼 ping 第一次一般會產生更多耗時?

     因為 ping 第一次的時候,需要首先進行 ARP 解析,獲取 IP 地址對應的 MAC 地址(同時將對映關係快取),

     而下次 ping 的時候會直接從 ARP 快取記憶體讀取,少了一個步驟,自然時間就縮短了!

二、traceroute 

       

traceroute 程式的主要目的是獲取從當前主機到目的主機所經過的路由

       官方方案(TCP/IP詳解裡提供的基於 UDP 的方案):通過封裝一份 UDP 資料報(指定一個不可能使用的埠,30000以上)依次將資料報的 TTL 值置為 1、2、3...,併發送給目的主機。當路徑上第一個路由器收到 TTL 值為 1 的資料報時,首先將該資料報的 TTL 值減 1,發現 TTL 值為 0,而自己並非該資料報的目的主機,就會向源主機發送一個 ICMP 超時報文,traceroute 收到該超時報文,就得到了路徑上第一臺路由器的地址;然後照此原理,traceroute 傳送 TTL 為 2 的資料報時,會收到路徑上第二臺路由器返回的 ICMP 超時報文,記錄第二臺路由器的地址;直到報文到達目的主機,目的主機不會返回 ICMP 超時,但由於埠無法使用,就會返回一份埠不可達報文給源主機,源主機收到埠不可達報文

,證明資料報已經到達了目的地,停止後續的 UDP 資料報傳送,將記錄的路徑依次打印出來,使命完成,結束任務。

      注意:目的主機埠號最開始設定為 33435,且每傳送一個數據報加 1,可以通過命令列選項來改變開始的埠號

       

      約束:

      1. 不能保證現在的路由也是將來所要採用的路由,甚至兩份連續的 IP 資料報都可能採用不同的路由;

      2. 不能保證 ICMP 報文的路由與 traceoute 程式傳送的 UDP 資料報採用同一路由,時間測量可能不準;

      3. 返回的 ICMP 報文中的信源 IP 地址是 UDP 資料報到達的路由器介面的 IP 地址;

      

          當從網路1某主機執行 traceroute 程式到網路3某主機,返回的路徑將是 if1 和 if3 的地址;

          而反方向,將打印出 if4 和 if2 的地址

缺陷:

       1. 中間路由器有可能做了限制,不返回 ICMP 超時報文,traceroute 就無法獲得其地址了,

           只能打印出 * 或 no reply

       2. 目的主機可能由於安全原因不會向源主機返回埠不可達的 ICMP 報文

            儘管探測資料報已經到達了目的主機,但 traceroute 程式收不到埠不可達報文,就仍會持續傳送請求 ...