ping 與 traceroute 的工作原理分析
一、ping
ping 程式的主要目的是測試主機是否可達,它傳送 ICMP 回顯請求報文給目的主機,並等待返回 ICMP 回顯應答
ping 程式一般會週期性持續地傳送 ICMP 請求報文,除非使用者手動終止,或指定了傳送報文個數
回顯請求和回顯應答通過序列號(icmp_seq)進行匹配,下圖中序列號依次為 1、2、3、4 ...
ping 程式通過資料報中記錄的傳送請求時間值
常見問題:
1. 為什麼 ping 第一次一般會產生更多耗時?
因為 ping 第一次的時候,需要首先進行 ARP 解析,獲取 IP 地址對應的 MAC 地址(同時將對映關係快取),
而下次 ping 的時候會直接從 ARP 快取記憶體讀取,少了一個步驟,自然時間就縮短了!
二、traceroute
官方方案(TCP/IP詳解裡提供的基於 UDP 的方案):通過封裝一份 UDP 資料報(指定一個不可能使用的埠,30000以上),依次將資料報的 TTL 值置為 1、2、3...,併發送給目的主機。當路徑上第一個路由器收到 TTL 值為 1 的資料報時,首先將該資料報的 TTL 值減 1,發現 TTL 值為 0,而自己並非該資料報的目的主機,就會向源主機發送一個 ICMP 超時報文,traceroute 收到該超時報文,就得到了路徑上第一臺路由器的地址;然後照此原理,traceroute 傳送 TTL 為 2 的資料報時,會收到路徑上第二臺路由器返回的 ICMP 超時報文,記錄第二臺路由器的地址;直到報文到達目的主機,目的主機不會返回 ICMP 超時,但由於埠無法使用,就會返回一份埠不可達報文給源主機,源主機收到埠不可達報文
注意:目的主機埠號最開始設定為 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 程式收不到埠不可達報文,就仍會持續傳送請求 ...