網絡小故事 16 · 入門

網絡醫生出診ICMP、Ping 與 Traceroute

上不了網時,怎樣找出問題出在哪一站?

主角:路路、小比、阿麥閱讀時間約 10 分鐘

建議先讀:小故事 9「Router 與 Default Gateway」、小故事 12「Routing Table」

1. 故事

按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。

序幕:溫習一下

第 1 步/共 12 步

小比的旅程

由阿麥去 example.com,我要經過家中路路、ISP Router 和互聯網上的 Router。每經過一部 Router,我背包上的 TTL(存活時間) 就減 1,減到 0 就會被丟棄。

動畫文字版(全部步驟)
  1. 序幕:溫習一下
  2. 小比的旅程 小比:由阿麥去 example.com,我要經過家中路路、ISP Router 和互聯網上的 Router。每經過一部 Router,我背包上的 TTL(存活時間) 就減 1,減到 0 就會被丟棄。
    • 詳細內容:小故事 9「走出家門」
  3. 第一幕:網絡醫生的聽筒
  4. 網頁打不開! 阿麥:我打不開 example.com!是我的 Wi-Fi 壞了?路路病了?ISP 出事?還是伺服器關了機?我完全不知道從何入手。
  5. ICMP:網絡的報告信 路路:別慌,讓我這位網絡醫生出診!我們 Router 和電腦之間,有一種專門用來報告和測試的訊息,叫 ICMP(互聯網控制訊息協定)。第一件工具:Ping。
    • Echo Request(回應請求):「你在嗎?」
    • Echo Reply(回應回覆):「我在!」
    • Time Exceeded(逾時):「TTL 減到 0,封包丟棄了」
    • Destination Unreachable(目的地無法到達):「此路不通」
  6. 先聽家中路路的心跳 小比:阿麥輸入 ping 192.168.1.1。我背著 Echo Request 去問路路:「你在嗎?」路路立即回覆 Echo Reply:「我在!」來回只用了 1 毫秒。
    • time=1.2 ms → 家中網絡正常
  7. 再聽伺服器的心跳 小比:接著 ping 192.0.2.80。這次我要走遠一點,但伺服器也回覆了!來回約 12 毫秒。網絡由頭到尾都是通的。
    • time=12.3 ms:Round-trip Time(來回時間)
    • ttl=61:回覆到達時剩下的 TTL
  8. 找到病因 路路:用 IP Address 可以到達,但 ping example.com 卻說找不到這個名字。病因在 DNS(網域名稱系統)!阿麥修正了 DNS 設定,網頁就打開了。
    • ① Ping 家中 Router:檢查家中網絡
    • ② Ping 互聯網上的 IP Address:檢查整條路
    • ③ Ping 網站名稱:檢查 DNS
  9. 第二幕:Traceroute 逐站點名
  10. 哪一站最慢? 阿麥:網頁打開了,但很慢。Ping 只告訴我「來回大約 180 毫秒」,卻不知道是哪一站拖慢了。有沒有辦法逐站點名?
  11. TTL = 1 小比:Traceroute 出動!它故意把我的 TTL 設成 1。我一到家中路路,TTL 就減到 0,被丟棄了。路路用 ICMP 回覆 Time Exceeded:「我是第 1 站 192.168.1.1。」
  12. TTL = 2 小比:這次 TTL 設成 2。經過路路剩 1,到 ISP Router 減到 0。ISP Router 回覆:「我是第 2 站 203.0.113.254。」
  13. TTL = 3、4…… 小比:TTL = 3,互聯網 Router 192.0.2.1 回報自己是第 3 站。TTL = 4,我終於到達伺服器,它回覆「到達了!」整條路線完整列出來了。
    • 1 192.168.1.1 1.2 ms
    • 2 203.0.113.254 6.8 ms
    • 3 192.0.2.1 180.5 ms ← 這一站開始變慢
    • 4 192.0.2.80 182.1 ms
  14. 沉默不等於生病 路路:有時某一站顯示 * * *,或者 Ping 一直逾時。可能只是那部設備或 Firewall(防火牆)設定成不回覆 ICMP,它其實運作正常。醫生要綜合多種檢查結果才下判斷!
  15. 總結:網絡醫生的工具箱 路路:Ping 測試「你在嗎?」和來回時間;Traceroute 利用 TTL 逐站點名,找出問題在哪一段。兩者都靠 ICMP 這種報告信。下次上不了網,你也可以做網絡醫生!

2. 問題在哪裡

由阿麥(192.168.1.10)到 example.com(192.0.2.80),小比要經過好幾站:家中路路、ISP(互聯網服務供應商)的 Router(路由器)、互聯網上的 Router,最後才到伺服器。(留意:192 開頭不一定是 Private,只有 192.168 開頭才是。)

網頁打不開時,瀏覽器只會顯示一句「無法連線」。可能出事的地方卻有很多:

  • 阿麥自己的 Wi-Fi(無線網絡)斷了?
  • 家中路路當機了?
  • ISP 的線路出了問題?
  • 伺服器關了機?
  • 還是 DNS(網域名稱系統)查不到名字?

不知道病因,就只能亂試一通:重新開機、拔線、打電話投訴……既費時,又未必有用。

3. 網絡怎樣解決

醫生看病,會先用聽筒聽心跳,再逐個部位檢查。

網絡也有自己的「聽筒」:ICMP(互聯網控制訊息協定),是 Router 和電腦之間專門用來報告錯誤和做測試的訊息。

靠 ICMP 回覆運作的兩件常用工具:

  • Ping:問對方「你在嗎?」,並量度來回要多久。
  • Traceroute:利用 TTL(存活時間),逐站點名,列出小比沿途經過的每一部 Router。

4. 看深一點

ICMP 常見的訊息

ICMP 訊息放在 IP 封包裡面傳送,每種訊息用一個 Type(類型)號碼分辨:

Type 名稱 意思
8 Echo Request(回應請求) 「你在嗎?」
0 Echo Reply(回應回覆) 「我在!」
11 Time Exceeded(逾時) 「TTL 減到 0,封包丟棄了。」
3 Destination Unreachable(目的地無法到達) 「此路不通。」

Ping:聽心跳

Ping 送出 Echo Request,對方回覆 Echo Reply。以下是 macOS/Linux 的例子(Windows 的格式略有不同,但內容一樣):

$ ping 192.0.2.80
64 bytes from 192.0.2.80: icmp_seq=0 ttl=61 time=12.3 ms
64 bytes from 192.0.2.80: icmp_seq=1 ttl=61 time=12.1 ms
64 bytes from 192.0.2.80: icmp_seq=2 ttl=61 time=12.6 ms
  • time=12.3 ms:Round-trip Time(來回時間),即由送出到收到回覆的時間。
  • ttl=61:回覆到達阿麥時,背包上還剩下的 TTL。很多系統起始值是 64,所以這個回覆經過了 3 部 Router,下面 Traceroute 也會列出這 3 站。
  • 沒有回覆時,Windows 會顯示 Request timed out,macOS 會顯示 Request timeout for icmp_seq …,Linux 則完全沒有新的一行。

三步看病法

故事中阿麥按次序做了三次 Ping:

步驟 指令 結果 說明
① ping 192.168.1.1 成功,約 1 ms 家中網絡正常
② ping 192.0.2.80 成功,約 12 ms 整條路都是通的
③ ping example.com 找不到這個名字 病因在 DNS

由近至遠,每一步排除一個可能。用 IP Address(網絡位址)可以到達,用名字卻不行,問題多數就在 DNS。

Traceroute:逐站點名

每經過一部 Router,IP 封包的 TTL 就減 1;減到 0,那部 Router 會丟棄封包,並回覆 ICMP Time Exceeded。Traceroute 就是利用這一點:

  1. 送出 TTL = 1 的封包 → 第 1 站(家中路路)回覆 Time Exceeded。
  2. 送出 TTL = 2 的封包 → 第 2 站(ISP Router)回覆 Time Exceeded。
  3. 如此類推,直至封包到達目的地,目的地回覆「到達了」。

每一次回覆的寄件人,就是那一站的 IP Address。沿途每一站叫一個 Hop(躍點)。實際上,每一站通常會測試 3 次,所以每行有 3 個時間。

後來網頁雖然打開了,卻變得很慢。阿麥再執行 Traceroute:

$ traceroute 192.0.2.80
 1  192.168.1.1      1.2 ms    1.1 ms    1.3 ms
 2  203.0.113.254    6.8 ms    7.0 ms    6.9 ms
 3  192.0.2.1      180.5 ms  181.2 ms  179.8 ms
 4  192.0.2.80     182.1 ms  182.6 ms  181.9 ms

時間由第 3 站開始大增,而且之後一直維持在高位,代表第 2 站和第 3 站之間那一段變慢了。

不同電腦,不同指令

  • Windows:輸入 tracert,用 ICMP Echo Request 探路;到達目的地時,對方回覆 Echo Reply。
  • macOS/Linux:輸入 traceroute,預設用 UDP(用戶資料包協定)封包探路;到達目的地時,對方回覆 Destination Unreachable,表示「這個 Port(連接埠)沒有程式在用」,Traceroute 就知道已經到終點。

* * *:沉默不等於生病

某一站顯示 * * *,表示那一站 3 次都沒有回覆。原因可能是:

  • 那部 Router 或 Firewall(防火牆)設定成不回覆 ICMP;
  • Router 太忙,把回覆 ICMP 的工作放到最後。

如果後面的站仍然有回覆,那一站其實運作正常。只有「由某一站開始,之後全部都是 * * *」,才比較像是真的斷了線。

5. 動手試試

任務:做一次網絡醫生

  1. 打開「命令提示字元」(Windows)或「終端機」(macOS)。
  2. 輸入 ping 加上家中 Router 的位址(常見是 192.168.1.1 或 192.168.0.1)。Windows 預設送 4 次就停;macOS 會一直送,按 Ctrl + C 停止。
  3. 再 Ping 一個你常去的網站名稱,比較兩次的 time。
  4. 最後輸入 tracert 網站名稱(Windows)或 traceroute 網站名稱(macOS),數一數由你家到那個網站經過了幾站。有沒有看到 * * *?

小互動

Traceroute 的正確次序

阿麥執行 traceroute。把找出第一、二站的五個步驟排好次序。

  1. 阿麥記下第 1 站是 192.168.1.1
  2. 送出 TTL = 1 的封包
  3. ISP Router 把 TTL 減到 0,回覆 Time Exceeded
  4. 家中路路把 TTL 減到 0,丟棄封包並回覆 Time Exceeded
  5. 送出 TTL = 2 的封包

6. 比喻的極限

  • Ping 不通,不代表對方「死了」。 很多伺服器和 Firewall 故意不回覆 Ping,但網頁照樣打得開。醫生聽不到心跳,可能只是病人穿了厚外套。
  • Ping 成功,也不代表網頁一定打得開。 Ping 只證明對方收到 ICMP;網頁用的是 TCP(傳輸控制協定)Port 443,那個服務可能已經停了。
  • Traceroute 看到的只是「一個方向」。 去程和回程可能走不同的路;而且每次探路的封包也可能走不同的路線,所以同一站有時會出現兩個不同的位址。
  • 中間一站慢,不一定是它的錯。 Router 通常會把回覆 ICMP 放到最低優先,所以某一站單獨變慢、之後各站卻正常,多數只是它懶得回覆,並不是真的塞車。
  • 網絡醫生只做檢查,不會治病。 Ping 和 Traceroute 只告訴你問題在哪一段;要修好,還是要找負責那一段的人,例如自己、ISP 或網站管理員。

7. 小測驗

第 1 題,共 3 題Ping 用的是哪一種訊息?
第 2 題,共 3 題Traceroute 怎樣找出沿途的第 2 站?
第 3 題,共 3 題ping 192.0.2.80 成功,但 ping example.com 失敗,問題最可能在哪裡?

8. 重點筆記

  • ICMP(互聯網控制訊息協定)是網絡的「報告信」,用來報告錯誤和做測試。
  • Ping 送出 Echo Request(Type 8),對方回覆 Echo Reply(Type 0),量度 Round-trip Time(來回時間)。
  • 由近至遠 Ping:家中 Router → 互聯網上的 IP Address → 網站名稱,可以逐步找出病因。
  • Traceroute 由 TTL = 1 開始逐次加 1,每一站在 TTL 減到 0 時回覆 Time Exceeded(Type 11),列出整條路線;Windows 用 tracert,macOS/Linux 用 traceroute。
  • * * * 或 Ping 不通,可能只是對方不回覆 ICMP,要綜合多種檢查結果才下判斷。

延伸閱讀

有了 Ping 和 Traceroute,你已經可以替自己的網絡「看病」。不過,小比沿途經過那麼多站,背包裡的信會不會被人偷看,甚至被改掉?下一個故事,我們會看看 HTTPS 和 TLS(傳輸層安全)怎樣替信封口、蓋上火漆印。