服務器網絡故障處理——ping丟包或不通時鏈路測試說明
前言
當客戶端訪問目標服務器出現 ping 丟包或 ping 不通時,可以通過 tracert 或 mtr 等工具進行鏈路測試來判斷問題來源。本文先介紹了進行鏈路測試的相關工具,然后對測試結果分析及測試步驟進行了說明。
鏈路測試工具介紹
根據操作系統類型的不同,鏈路測試所使用的工具也有所不同。分別簡要介紹如下。
- Linux 環境下鏈路測試工具介紹
- Windows 環境下鏈路測試工具介紹
Linux 環境下鏈路測試工具介紹
traceroute 命令行工具
mtr 命令行工具(建議優先使用)
traceroute 命令行工具
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 數據包用于探測。
用法說明:
traceroute [-I] [ -m Max_ttl ] [ -n ] [ -p Port ] [ -q Nqueries ] [ -r ] [ -s SRC_Addr ] [ -t TypeOfService ] [ -f flow ] [ -v ] [ -w WaitTime ] Host [ PacketSize ]
示例輸出:
[root@haiyuan ~]# traceroute -I 122.112.248.206
traceroute to 122.112.248.206 (122.112.248.206), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 100.80.0.1 (100.80.0.1) 11.044 ms 10.834 ms 16.801 ms
4 10.39.3.129 (10.39.3.129) 8.574 ms 9.014 ms 23.937 ms
5 192.168.10.2 (192.168.10.2) 9.062 ms 9.004 ms 8.572 ms
6 * * *
7 10.44.2.130 (10.44.2.130) 2.521 ms 2.530 ms 2.494 ms
8 10.44.2.18 (10.44.2.18) 6.319 ms 6.192 ms 5.826 ms
9 10.1.0.146 (10.1.0.146) 2.346 ms 2.391 ms 1.988 ms
10 10.1.0.126 (10.1.0.126) 127.950 ms 126.041 ms 125.266 ms
11 10.1.0.133 (10.1.0.133) 3.891 ms 3.814 ms 3.675 ms
12 106.39.255.77 (106.39.255.77) 66.390 ms 66.165 ms 66.187 ms
13 * * *
14 220.181.0.210 (220.181.0.210) 5.114 ms 5.102 ms *
15 220.181.0.197 (220.181.0.197) 7.653 ms 7.641 ms 7.526 ms
16 * * *
17 * * *
18 * * *
19 101.95.192.5 (101.95.192.5) 34.033 ms 34.029 ms 34.165 ms
20 101.95.192.5 (101.95.192.5) 32.002 ms 32.067 ms 32.161 ms
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
常見可選參數說明:
-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 命令行工具(建議優先使用)
mtr (My traceroute)也是幾乎所有 Linux 發行版本預裝的網絡測試工具。他把 ping和 traceroute 的功能并入了同一個工具中,所以功能更強大。
mtr 默認發送 ICMP 數據包進行鏈路探測。可以通過 -u 參數來指定使用 UDP 數據包用于探測。
相對于 traceroute 只會做一次鏈路跟蹤測試,mtr 會對鏈路上的相關節點做持續探測并給出相應的統計信息。所以,mtr能避免節點波動對測試結果的影響,所以其測試結果更正確,建議優先使用。
用法說明:
mtr [-hvrctglspni46] [--help] [--version] [--report] [--report-cycles=COUNT] [--curses] [--gtk] [--raw] [--split] [--no-dns] [--address interface][--psize=bytes/-s bytes][--interval=SECONDS] HOSTNAME [PACKETSIZE]
示例輸出:
mtr 122.112.248.206
常見可選參數說明:
-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):標準偏差。越大說明相應節點越不穩定。
Windows 環境下鏈路測試工具介紹
TRACERT 命令行工具
WinMTR 工具(建議優先使用)
TRACERT 命令行工具
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“超時”消息中包含了相應節點的信息。
用法說明:
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name
示例輸出:
C:\Users\Administrator>tracert -d 122.112.248.206
通過最多 30 個躍點跟蹤到 122.112.248.206 的路由
1 1 ms 1 ms 1 ms 192.168.1.1
2 3 ms 3 ms 3 ms 10.212.0.1
3 7 ms 3 ms 3 ms 182.51.56.137
4 4 ms 3 ms 15 ms 182.51.56.110
5 472 ms 7 ms 8 ms 202.127.112.1
6 * * * 請求超時。
7 12 ms 47 ms 12 ms 10.35.50.2
8 9 ms 10 ms 52 ms 222.223.243.121
9 9 ms 10 ms 13 ms 27.129.6.129
10 10 ms 14 ms 10 ms 27.129.1.253
11 20 ms 20 ms 19 ms 27.129.1.5
12 * 996 ms 23 ms 202.97.25.89
13 51 ms 48 ms 47 ms 61.152.86.241
14 * 50 ms * 101.95.206.218
15 51 ms 52 ms 48 ms 101.95.246.198
16 45 ms 45 ms 51 ms 101.95.192.5
17 * * * 請求超時。
18 * * * 請求超時。
19 * * * 請求超時。
20 * * * 請求超時。
21 * * * 請求超時。
22 * * * 請求超時。
23 * * * 請求超時。
24 * * * 請求超時。
25 * * * 請求超時。
26 * * * 請求超時。
27 * * * 請求超時。
28 * * * 請求超時。
29 * * * 請求超時。
30 * * * 請求超時。
跟蹤完成。
常見可選參數說明:
-d:指定不將地址解析為主機名(禁用 DNS 反解)。
-h:maximum_hops,指定搜索目標地址時的最大躍點數。
-j: host-list,指定沿主機列表的松散源路由。
-w:timeout,由每個回復的 timeout 指定的等待毫秒數。
-R:跟蹤往返行程路徑(僅適用于 IPv6)。
-S:srcaddr,要使用的源地址(僅適用于 IPv6)。
-4:強制使用 IPv4。
-6:強制使用 IPv6。
target_host:目標主機域名或 IP 地址。
WinMTR 工具(建議優先使用)
WinMTR 是 mtr 工具在 Windows 環境下的圖形化實現,但進行了功能簡化,只支持 mtr部分參數的調整設置。WinMTR 默認發送ICMP 數據包進行探測,無法切換。
WinMTR 可以從其官方網站下載獲取。
和 mtr 一樣,相比 tracert,WinMTR 能避免節點波動對測試結果的影響,所以測試結果更正確。所以,在 WinMTR 可用的情況下,建議優先使用 WinMTR 進行鏈路測試。
用法說明:
WinMTR 無需安裝,直接解壓運行即可。操作方法非常簡單,說明如下:
1、如下圖所示,運行程序后,在 Host 字段輸入目標服務器域名或 IP(注意前面不要包含空格)。
2、點擊 Start 開始測試(開始測試后,相應按鈕變成了 Stop)。
3、運行一段時間后,點擊 Stop 停止測試。
4、其它選項說明:
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):分別是到相應節點延遲的最小值、平均值、最大值和最后一次值。
第八列(StDev):標準偏差。越大說明相應節點越不穩定。
鏈路測試結果分析簡要說明
由于 mtr(WinMTR)有更高的準確性。本文以其測試結果為例,對鏈路測試結果的分析進行簡要說明。
后續說明,以如下鏈路測試結果示例圖為基礎進行闡述:
對鏈路測試結果進行分析時,需要關注如下要點:
網絡區域
鏈路負載均衡
結合Avg(平均值)和 StDev(標準偏差)綜合判斷
Loss%(丟包率)的判斷
關于延遲
網絡區域
正常情況下,從客戶端到目標服務器的整個鏈路,會顯著的包含如下區域:
- 客戶端本地網絡(本地局域網和本地網絡提供商網絡):如前文鏈路測試結果示例圖中的區域 A。如果該區域出現異常,如果是客戶端本地網絡相關節點出現異常,則需要對本地網絡進行相應排查分析。否則,如果是本地網絡提供商網絡相關節點出現異常,則需要向當地運營商反饋問題。
- 運營商骨干網絡:如前文鏈路測試結果示例圖中的區域 B。如果該區域出現異常,可以根據異常節點 IP 查詢歸屬運營商,向相應運營商反饋問題。
- 目標服務器本地網絡(目標主機歸屬網絡提供商網絡): 如前文鏈路測試結果示例圖中的區域 C。如果該區域出現異常,則需要向目標主機歸屬網絡提供商反饋問題。
鏈路負載均衡
如前文鏈路測試結果示例圖中的區域 D 所示。如果中間鏈路某些部分啟用了鏈路負載均衡,則 mtr 只會對首尾節點進行編號和探測統計。中間節點只會顯示相應的 IP 或域名信息。
結合Avg(平均值)和 StDev(標準偏差)綜合判斷
由于鏈路抖動或其它因素的影響,節點的 Best 和 Worst 值可能相差很大。而 Avg(平均值) 統計了自鏈路測試以來所有探測的平均值,所以能更好的反應出相應節點的網絡質量。
而 StDev(標準偏差值)越高,則說明數據包在相應節點的延時值越不相同(越離散)。所以,標準偏差值可用于協助判斷 Avg 是否真實反應了相應節點的網絡質量。例如,如果標準偏差很大,說明數據包的延遲是不確定的。可能某些數據包延遲很小(例如:25ms),而另一些延遲卻很大(例如:350ms),但最終得到的平均延遲反而可能是正常的。所以,此時 Avg 并不能很好的反應出實際的網絡質量情況。
綜上,建議的分析標準是:
如果 StDev 很高,則同步觀察相應節點的 Best 和 Wrst,來判斷相應節點是否存在異常。
-
如果 StDev 不高,則通過 Avg來判斷相應節點是否存在異常。
注:上述 StDev “高”或者“不高”,并沒有具體的時間范圍標準。而需要根據同一節點其它列的延遲值大小來進行相對評估。比如,如果 Avg 為 30ms,那么,當 StDev 為 25ms,則認為是很高的偏差。而如果 Avg 為 325ms,則同樣的 StDev(25ms),反而認為是不高的偏差。
Loss%(丟包率)的判斷
任一節點的 Loss%(丟包率)如果不為零,則說明這一跳網絡可能存在問題。導致相應節點丟包的原因通常有兩種:
- 運營商基于安全或性能需求,人為限制了節點的 ICMP 發送速率,導致丟包。
- 節點確實存在異常,導致丟包。
可以結合異常節點及其后續節點的丟包情況,來判定丟包原因:
- 如果隨后節點均沒有丟包,則通常說明異常節點丟包是由于運營商策略限制所致。可以忽略相關丟包。如前文鏈路測試結果示例圖中的第 2 跳所示。
- 如果隨后節點也出現丟包,則通常說明異常節點確實存在網絡異常,導致丟包。如前文鏈路測試結果示例圖中的第 5 跳所示。
另外,需要說明的是,前述兩種情況可能同時發生。即相應節點既存在策略限速,又存在網絡異常。對于這種情況,如果異常節點及其后續節點連續出現丟包,而且各節點的丟包率不同,則通常以最后幾跳的丟包率為準。如前文鏈路測試結果示例圖所示,在第 5、6、7跳均出現了丟包。所以,最終丟包情況,以第 7 跳的 40% 作為參考。
關于延遲
延遲跳變
如果在某一跳之后延遲明顯陡增,則通常判斷該節點存在網絡異常。如前文鏈路測試結果示例圖所示,從第 5 跳之后的后續節點延遲明顯陡增,則推斷是第 5 跳節點出現了網絡異常。
不過,高延遲并不一定完全意味著相應節點存在異常。如前文鏈路測試結果示例圖所示,第 5 跳之后,雖然后續節點延遲明顯陡增,但測試數據最終仍然正常到達了目的主機。所以,延遲大也有可能是在數據回包鏈路中引發的。所以,最好結合反向鏈路測試一并分析。
ICMP 限速導致延遲增加
ICMP 策略限速也可能會導致相應節點的延遲陡增,但后續節點通常會恢復正常。如前文鏈路測試結果示例圖所示,第 3 跳有 100% 的丟包率,同時延遲也明顯陡增。但隨后節點的延遲馬上恢復了正常。所以判斷該節點的延遲陡增及丟包是由于策略限速所致。