1. 故事
按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。
序幕:溫習一下
第 1 步/共 12 步
小比的旅程
由阿麥去 example.com,我要經過家中路路、ISP Router 和互聯網上的 Router。每經過一部 Router,我背包上的 TTL(存活時間) 就減 1,減到 0 就會被丟棄。
動畫文字版(全部步驟)
- 序幕:溫習一下
- 小比的旅程 小比:由阿麥去
example.com,我要經過家中路路、ISP Router 和互聯網上的 Router。每經過一部 Router,我背包上的 TTL(存活時間) 就減 1,減到 0 就會被丟棄。- 詳細內容:小故事 9「走出家門」
- 第一幕:網絡醫生的聽筒
- 網頁打不開! 阿麥:我打不開
example.com!是我的 Wi-Fi 壞了?路路病了?ISP 出事?還是伺服器關了機?我完全不知道從何入手。 - ICMP:網絡的報告信 路路:別慌,讓我這位網絡醫生出診!我們 Router 和電腦之間,有一種專門用來報告和測試的訊息,叫 ICMP(互聯網控制訊息協定)。第一件工具:Ping。
- Echo Request(回應請求):「你在嗎?」
- Echo Reply(回應回覆):「我在!」
- Time Exceeded(逾時):「TTL 減到 0,封包丟棄了」
- Destination Unreachable(目的地無法到達):「此路不通」
- 先聽家中路路的心跳 小比:阿麥輸入
ping 192.168.1.1。我背著 Echo Request 去問路路:「你在嗎?」路路立即回覆 Echo Reply:「我在!」來回只用了 1 毫秒。time=1.2 ms→ 家中網絡正常
- 再聽伺服器的心跳 小比:接著
ping 192.0.2.80。這次我要走遠一點,但伺服器也回覆了!來回約 12 毫秒。網絡由頭到尾都是通的。time=12.3 ms:Round-trip Time(來回時間)ttl=61:回覆到達時剩下的 TTL
- 找到病因 路路:用 IP Address 可以到達,但
ping example.com卻說找不到這個名字。病因在 DNS(網域名稱系統)!阿麥修正了 DNS 設定,網頁就打開了。- ① Ping 家中 Router:檢查家中網絡
- ② Ping 互聯網上的 IP Address:檢查整條路
- ③ Ping 網站名稱:檢查 DNS
- 第二幕:Traceroute 逐站點名
- 哪一站最慢? 阿麥:網頁打開了,但很慢。Ping 只告訴我「來回大約 180 毫秒」,卻不知道是哪一站拖慢了。有沒有辦法逐站點名?
- TTL = 1 小比:Traceroute 出動!它故意把我的 TTL 設成 1。我一到家中路路,TTL 就減到 0,被丟棄了。路路用 ICMP 回覆 Time Exceeded:「我是第 1 站
192.168.1.1。」 - TTL = 2 小比:這次 TTL 設成 2。經過路路剩 1,到 ISP Router 減到 0。ISP Router 回覆:「我是第 2 站
203.0.113.254。」 - TTL = 3、4…… 小比:TTL = 3,互聯網 Router
192.0.2.1回報自己是第 3 站。TTL = 4,我終於到達伺服器,它回覆「到達了!」整條路線完整列出來了。1 192.168.1.1 1.2 ms2 203.0.113.254 6.8 ms3 192.0.2.1 180.5 ms← 這一站開始變慢4 192.0.2.80 182.1 ms
- 沉默不等於生病 路路:有時某一站顯示
* * *,或者 Ping 一直逾時。可能只是那部設備或 Firewall(防火牆)設定成不回覆 ICMP,它其實運作正常。醫生要綜合多種檢查結果才下判斷! - 總結:網絡醫生的工具箱 路路: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 就是利用這一點:
- 送出 TTL = 1 的封包 → 第 1 站(家中路路)回覆 Time Exceeded。
- 送出 TTL = 2 的封包 → 第 2 站(ISP Router)回覆 Time Exceeded。
- 如此類推,直至封包到達目的地,目的地回覆「到達了」。
每一次回覆的寄件人,就是那一站的 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. 動手試試
任務:做一次網絡醫生
- 打開「命令提示字元」(Windows)或「終端機」(macOS)。
- 輸入
ping加上家中 Router 的位址(常見是192.168.1.1或192.168.0.1)。Windows 預設送 4 次就停;macOS 會一直送,按 Ctrl + C 停止。 - 再 Ping 一個你常去的網站名稱,比較兩次的
time。 - 最後輸入
tracert 網站名稱(Windows)或traceroute 網站名稱(macOS),數一數由你家到那個網站經過了幾站。有沒有看到* * *?
小互動
Traceroute 的正確次序
阿麥執行 traceroute。把找出第一、二站的五個步驟排好次序。
- 阿麥記下第 1 站是 192.168.1.1
- 送出 TTL = 1 的封包
- ISP Router 把 TTL 減到 0,回覆 Time Exceeded
- 家中路路把 TTL 減到 0,丟棄封包並回覆 Time Exceeded
- 送出 TTL = 2 的封包
6. 比喻的極限
- Ping 不通,不代表對方「死了」。 很多伺服器和 Firewall 故意不回覆 Ping,但網頁照樣打得開。醫生聽不到心跳,可能只是病人穿了厚外套。
- Ping 成功,也不代表網頁一定打得開。 Ping 只證明對方收到 ICMP;網頁用的是 TCP(傳輸控制協定)Port 443,那個服務可能已經停了。
- Traceroute 看到的只是「一個方向」。 去程和回程可能走不同的路;而且每次探路的封包也可能走不同的路線,所以同一站有時會出現兩個不同的位址。
- 中間一站慢,不一定是它的錯。 Router 通常會把回覆 ICMP 放到最低優先,所以某一站單獨變慢、之後各站卻正常,多數只是它懶得回覆,並不是真的塞車。
- 網絡醫生只做檢查,不會治病。 Ping 和 Traceroute 只告訴你問題在哪一段;要修好,還是要找負責那一段的人,例如自己、ISP 或網站管理員。
7. 小測驗
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(傳輸層安全)怎樣替信封口、蓋上火漆印。