當用戶端通路目标伺服器出現 ping 丢包或 ping 不通時,可以通過 tracert 或 mtr 等工具進行鍊路測試來判斷問題來源。本文先介紹了進行鍊路測試的相關工具,然後對測試結果分析及測試步驟進行了說明。
根據作業系統類型的不同,鍊路測試所使用的工具也有所不同。分别簡要介紹如下。
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#windows%20%e7%8e%af%e5%a2%83%e4%b8%8b%e9%93%be%e8%b7%af%e6%b5%8b%e8%af%95%e5%b7%a5%e5%85%b7%e4%bb%8b%e7%bb%8d">windows 環境下鍊路測試工具介紹</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#traceroute%20%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%b7%a5%e5%85%b7">traceroute 指令行工具</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#mtr%20%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%b7%a5%e5%85%b7%ef%bc%88%e5%bb%ba%e8%ae%ae%e4%bc%98%e5%85%88%e4%bd%bf%e7%94%a8%ef%bc%89">mtr 指令行工具(建議優先使用)</a>
traceroute 是幾乎所有 linux 發行版本預裝的網絡測試工具,用于跟蹤 internet 協定(ip)資料包傳送到目标位址時經過的路徑。
traceroute 先發送具有小的最大存活時間值(max_ttl)的 udp 探測資料包,然後偵聽從網關開始的整個鍊路上的 icmp time_exceeded 響應。探測從ttl=1 開始,ttl 值逐漸增加,直至接收到icmp port_unreachable 消息。icmp port_unreachable 消息用于辨別目标主機已經被定位,或指令已經達到允許跟蹤的最大 ttl 值。
traceroute 預設發送 udp 資料包進行鍊路探測。可以通過 -i 參數來指定發送 icmp 資料包用于探測。
用法說明:
示例輸出:
常見可選參數說明:
-d 使用socket層級的排錯功能。
-f 設定第一個檢測資料包的存活數值ttl的大小。
-f 設定不要分段辨別。
-g 設定來源路由網關,最多可設定8個。
-i 使用指定的網卡送出資料包。用于主機有多個網卡時。
-i 使用icmp資料包替代 udp 資料包進行探測。
-m 設定檢測資料包的最大存活數值ttl的大小。
-n 直接使用ip位址而非主機名稱(禁用 dns 反查)。
-p 設定udp傳輸協定的通信端口。
-r 忽略普通的routing table,直接将資料包送到遠端主機上。
-s 設定本地主機送出資料包的ip位址。
-t 設定檢測資料包的tos數值。
-v 詳細顯示指令的執行過程。
-w 設定等待遠端主機回包時間。
-x 開啟或關閉資料包的正确性檢驗。
mtr (my traceroute)也是幾乎所有 linux 發行版本預裝的網絡測試工具。他把 ping和 traceroute 的功能并入了同一個工具中,是以功能更強大。
mtr 預設發送 icmp 資料包進行鍊路探測。可以通過 -u 參數來指定使用 udp 資料包用于探測。
相對于 traceroute 隻會做一次鍊路跟蹤測試,mtr 會對鍊路上的相關節點做持續探測并給出相應的統計資訊。是以,mtr能避免節點波動對測試結果的影響,是以其測試結果更正确,建議優先使用。
-r 或 --report:以報告模式顯示輸出。
-p 或 --split:将每次追蹤的結果分别列出來,而非如 --report統計整個結果。
-s 或 --psize:指定ping資料包的大小。
-n 或 --no-dns:不對ip位址做域名反解析。
-a 或 --address:設定發送資料包的ip位址。用于主機有多個ip時。
-4:隻使用 ipv4 協定。
-6:隻使用 ipv6 協定。
另外,也可以在 mtr 運作過程中,輸入相應字母來快速切換模式,比如:
?或 h:顯示幫助菜單。
d:切換顯示模式。
n:切換啟用或禁用 dns 域名解析。
u:切換使用 icmp或 udp 資料包進行探測。
傳回結果說明:
預設配置下,傳回結果中各資料列的說明:
第一列(host):節點ip位址和域名。如前面所示,按n鍵可以切換顯示。
第二列(loss%):節點丢包率。
第三列(snt):每秒發送資料包數。預設值是10,可以通過參數 -c 指定。
第四列(last):最近一次的探測延遲值。
第五、六、七列(avg、best、wrst):分别是探測延遲的平均值、最小值和最大值。
第八列(stdev):标準偏差。越大說明相應節點越不穩定。
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#tracert%20%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%b7%a5%e5%85%b7">tracert 指令行工具</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#winmtr%20%e5%b7%a5%e5%85%b7%ef%bc%88%e5%bb%ba%e8%ae%ae%e4%bc%98%e5%85%88%e4%bd%bf%e7%94%a8%ef%bc%89">winmtr 工具(建議優先使用)</a>
tracert (trace route) 是 windows 自帶的網絡診斷指令行實用程式,用于跟蹤 internet 協定 (ip) 資料包傳送到目标位址時經過的路徑。
tracert 通過向目标位址發送 icmp 資料包來确定到目标位址的路由。在這些資料包中,tracert 使用了不同的 ip“生存期”(ttl) 值。由于要求沿途的路由器在轉發資料包前至少必須将 ttl 減少 1,是以 ttl 實際上相當于一個躍點計數器 (hop counter)。當某個資料包的 ttl 達到零 (0) 時,相應節點就會向源計算機發送一個 icmp“逾時”的消息。
tracert 第一次發送 ttl 為 1 的資料包,并在每次後續傳輸時将 ttl 增加 1,直到目标位址響應或達到 ttl 的最大值。中間路由器發送回來的 icmp“逾時”消息中包含了相應節點的資訊。
-d:指定不将位址解析為主機名(禁用 dns 反解)。
-h:maximum_hops,指定搜尋目标位址時的最大躍點數。
-j: host-list,指定沿主機清單的松散源路由。
-w:timeout,由每個回複的 timeout 指定的等待毫秒數。
-r:跟蹤往返行程路徑(僅适用于 ipv6)。
-s:srcaddr,要使用的源位址(僅适用于 ipv6)。
-4:強制使用 ipv4。
-6:強制使用 ipv6。
target_host:目标主機域名或 ip 位址。
winmtr 是 mtr 工具在 windows 環境下的圖形化實作,但進行了功能簡化,隻支援 mtr部分參數的調整設定。winmtr 預設發送icmp 資料包進行探測,無法切換。
和 mtr 一樣,相比 tracert,winmtr 能避免節點波動對測試結果的影響,是以測試結果更正确。是以,在 winmtr 可用的情況下,建議優先使用 winmtr進行鍊路測試。
winmtr 無需安裝,直接解壓運作即可。操作方法非常簡單,說明如下:
如下圖所示,運作程式後,在 host 字段輸入目标伺服器域名或 ip(注意前面不要包含空格)。
點選 start 開始測試(開始測試後,相應按鈕變成了 stop)。
運作一段時間後,點選 stop 停止測試。
其它選項說明:
copy text to clipboard:将測試結果以文本格式複制到粘貼闆。
copy html to clipboard:将測試結果以 html 格式複制到粘貼闆。
export text:将測試結果以文本格式導出到指定檔案。
export html:将測試結果以 html 格式導出到指定檔案。
options:可選參數,包括:
interval(sec):每次探測的間隔(過期)時間。預設為 1 秒。
ping size(bytes): ping 探測所使用的資料包大小,預設為 64 位元組。、
max hosts in lru list: lru 清單支援的最大主機數,預設值為 128。
resolve names:通過反查 ip 以域名顯示相關節點。
第一列(hostname):節點 ip 或域名。
第二列(nr):節點編号。
第三列(loss%):節點丢包率。
第四列(sent):已發送的資料包數量。
第五列(recv):已成功接收的資料包數量。
第六、七、八、九列(best 、avg、worst、last):分别是到相應節點延遲的最小值、平均值、最大值和最後一次值。
由于 mtr(winmtr)有更高的準确性。本文以其測試結果為例,對鍊路測試結果的分析進行簡要說明。
對鍊路測試結果進行分析時,需要關注如下要點:
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e7%bd%91%e7%bb%9c%e5%8c%ba%e5%9f%9f">網絡區域</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e9%93%be%e8%b7%af%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1">鍊路負載均衡</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e7%bb%93%e5%90%88avg%ef%bc%88%e5%b9%b3%e5%9d%87%e5%80%bc%ef%bc%89%e5%92%8c%20stdev%ef%bc%88%e6%a0%87%e5%87%86%e5%81%8f%e5%b7%ae%ef%bc%89%e7%bb%bc%e5%90%88%e5%88%a4%e6%96%ad">結合avg(平均值)和 stdev(标準偏差)綜合判斷</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#loss%25%ef%bc%88%e4%b8%a2%e5%8c%85%e7%8e%87%ef%bc%89%e7%9a%84%e5%88%a4%e6%96%ad">loss%(丢包率)的判斷</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e5%85%b3%e4%ba%8e%e5%bb%b6%e8%bf%9f">關于延遲</a>
正常情況下,從用戶端到目标伺服器的整個鍊路,會顯著的包含如下區域:
由于鍊路抖動或其它因素的影響,節點的 best 和 worst 值可能相差很大。而 avg(平均值) 統計了自鍊路測試以來所有探測的平均值,是以能更好的反應出相應節點的網絡品質。
而 stdev(标準偏內插補點)越高,則說明資料包在相應節點的延時值越不相同(越離散)。是以,标準偏內插補點可用于協助判斷 avg 是否真實反應了相應節點的網絡品質。例如,如果标準偏差很大,說明資料包的延遲是不确定的。可能某些資料包延遲很小(例如:25ms),而另一些延遲卻很大(例如:350ms),但最終得到的平均延遲反而可能是正常的。是以,此時 avg 并不能很好的反應出實際的網絡品質情況。
綜上,建議的分析标準是:
如果 stdev 很高,則同步觀察相應節點的 best 和 wrst,來判斷相應節點是否存在異常。
如果 stdev 不高,則通過 avg來判斷相應節點是否存在異常。
注:上述 stdev “高”或者“不高”,并沒有具體的時間範圍标準。而需要根據同一節點其它列的延遲值大小來進行相對評估。比如,如果 avg 為30ms,那麼,當 stdev 為 25ms,則認為是很高的偏差。而如果 avg 為 325ms,則同樣的 stdev(25ms),反而認為是不高的偏差。
任一節點的 loss%(丢包率)如果不為零,則說明這一跳網絡可能存在問題。導緻相應節點丢包的原因通常有兩種:
營運商基于安全或性能需求,人為限制了節點的 icmp 發送速率,導緻丢包。
節點确實存在異常,導緻丢包。
可以結合異常節點及其後續節點的丢包情況,來判定丢包原因:
常見的鍊路異常場景及測試報告執行個體如下所示:
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e7%9b%ae%e6%a0%87%e4%b8%bb%e6%9c%ba%e7%bd%91%e7%bb%9c%e9%85%8d%e7%bd%ae%e4%b8%8d%e5%bd%93">目标主機網絡配置不當</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#icmp%20%e9%99%90%e9%80%9f">icmp 限速</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e7%8e%af%e8%b7%af">環路</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e9%93%be%e8%b7%af%e4%b8%ad%e6%96%ad">鍊路中斷</a>
示例資料:
在該示例中,資料包在目标位址出現了 100% 的丢包。乍一看是資料包沒有到達,其實很有可能是目标伺服器相關安全政策(比如防火牆、iptables 等)禁用了 icmp 所緻,導緻目的主機無法發送任何應答。
是以,該場景需要排查目标伺服器的安全政策配置。
在該示例中,在第 5 跳出現了明顯的丢包,但後續節點均未見異常。是以推斷是該節點 icmp 限速所緻。
該場景對最終用戶端到目标伺服器的資料傳輸不會有影響,是以,分析的時候可以忽略。
在該示例中,資料包在第 5 跳之後出現了循環跳轉,導緻最終無法到達目标伺服器。這通常是由于營運商相關節點路由配置異常所緻。
是以,該場景需要聯系相應節點歸屬營運商處理。
在該示例中,資料包在第 4 跳之後就無法收到任何回報。這通常是由于相應節點中斷所緻。建議結合反向鍊路測試做進一步确認。
該場景需要聯系相應節點歸屬營運商處理。
相關步驟詳細說明如下:
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e8%8e%b7%e5%8f%96%e6%9c%ac%e5%9c%b0%e7%bd%91%e7%bb%9c%e5%af%b9%e5%ba%94%e5%85%ac%e7%bd%91%20ip">擷取本地網絡對應公網 ip</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e6%ad%a3%e5%90%91%e9%93%be%e8%b7%af%e6%b5%8b%e8%af%95%ef%bc%88ping%20%e5%92%8c%20mtr%ef%bc%89">正向鍊路測試(ping 和 mtr)</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e5%8f%8d%e5%90%91%e9%93%be%e8%b7%af%e6%b5%8b%e8%af%95%ef%bc%88ping%20%e5%92%8c%20mtr%ef%bc%89">反向鍊路測試(ping 和 mtr)</a>
<a href="https://help.aliyun.com/knowledge_detail/13390527.html#%e6%b5%8b%e8%af%95%e7%bb%93%e6%9e%9c%e5%88%86%e6%9e%90">測試結果分析</a>
在用戶端本地網絡通路 ip.taobao.com 等網站,如下圖,擷取本地網絡對應的公網 ip。
從用戶端向目标伺服器做 ping 和 mtr 鍊路測試:
從用戶端向目标伺服器域名或 ip 做持續的 ping 測試(建議至少 ping 100 個資料包),記錄測試結果。
根據用戶端作業系統環境的不同,使用 winmtr 或 mtr,設定測試目的位址為目标伺服器域名或ip,然後進行鍊路測試,記錄測試結果。
進入目标伺服器系統内部,做反向 ping 和 mtr 鍊路測試
從目标伺服器向前述步驟 1 擷取的用戶端 ip做持續的 ping 測試(建議至少 ping 100 個資料包),記錄測試結果。
根據目标伺服器作業系統環境的不同,使用 winmtr 或 mtr,設定測試目的位址為前述步驟 1 擷取的用戶端 ip,然後進行鍊路測試,記錄測試結果。