Learning Objectives
- 說明 ICMP 在 IP 網路裡負責回報錯誤與診斷,並認得 echo、目的地無法到達、逾時三種常見訊息
- 讀懂 ping 的輸出:序號、TTL、來回時間與遺失率各代表什麼
- 分辨「有設備回報無法到達」和「完全沒有回應」兩種失敗,推論問題可能在哪裡
- 依照由下往上的順序排錯:實體連線、位址與遮罩、閘道、DNS、路由與回程、防火牆
- 在模擬網路裡用 show、ping、nslookup、traceroute 找出並修好設定錯誤
IP 送丟了封包,誰來告訴你
IP 只負責「盡力」把封包送到目的地,路上出了問題,封包就被丟掉。可是被丟掉的原因很多: 沒有路由、目的主機不存在、TTL 用完了。如果什麼訊息都沒有,送出的人只會一直等,不知道該修哪裡。
ICMP(Internet Control Message Protocol,網際網路控制訊息協定)就是負責回報這些狀況的協定,定義在 RFC 792(1981 年)。 ICMP 訊息也裝在 IP 封包裡送出(IP 標頭的協定欄位是 1),由出問題的那台設備送回給原本的來源。
| 類型 | 名稱 | 誰送出 | 什麼時候 |
|---|---|---|---|
| 8 | echo request(回音請求) | ping 的來源 | 想知道對方在不在、路通不通 |
| 0 | echo reply(回音回覆) | 目的地 | 收到 echo request 時回覆 |
| 3 | destination unreachable(目的地無法到達) | 路由器或目的主機 | code 0:網路無法到達(沒有路由);code 1:主機無法到達(問不到 MAC);code 3:連接埠無法到達(對方沒有程式在用這個 UDP 埠) |
| 11 | time exceeded(逾時) | 路由器 | TTL 減到 0,封包被丟掉 |
兩件事要記住:
- 錯誤訊息裡會附上出問題那個封包的 IP 標頭與開頭的一段資料,來源才知道是哪一個封包、送給誰的出了事。
- ICMP 錯誤訊息本身出問題時,不會再回報,不然兩台設備可能互相回報、沒完沒了。
ICMP 屬於網路層的輔助協定,沒有連接埠號碼。IPv6 也有自己的 ICMPv6,角色相同,還多負責了鄰居探索(取代 ARP)。
讀懂 ping 的輸出
模擬器的輸出比較精簡。實際系統的 ping(以 Linux 為例,各作業系統的格式略有不同)長這樣:
$ ping -c 3 192.0.2.10
PING 192.0.2.10 (192.0.2.10) 56(84) bytes of data.
64 bytes from 192.0.2.10: icmp_seq=1 ttl=62 time=1.42 ms
64 bytes from 192.0.2.10: icmp_seq=2 ttl=62 time=1.38 ms
64 bytes from 192.0.2.10: icmp_seq=3 ttl=62 time=1.40 ms
--- 192.0.2.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.380/1.400/1.420/0.016 ms
| 欄位 | 意思 | 怎麼用 |
|---|---|---|
icmp_seq |
第幾個 echo request | 序號跳號(1、2、4)表示中間那個沒有收到回覆 |
ttl |
回覆抵達時剩下的 TTL | 初始值常見 64 或 128,相減可以估計經過幾台路由器 |
time |
來回時間(RTT) | 同一個區域網路通常在幾毫秒內;忽大忽小可能是線路壅塞 |
packet loss |
遺失率 | 偶爾遺失可能是壅塞或無線訊號差;100% 表示完全沒有回覆 |
ping 失敗時有兩種很不一樣的情況:
| 你看到的 | 代表 | 下一步 |
|---|---|---|
From 10.0.0.2 … Destination Host Unreachable |
路上有設備回報:送到那裡就過不去了 | 去那台設備看路由表、ARP,或目的主機是否存在 |
沒有任何回覆行,最後 100% packet loss |
沒有人回報:封包或回覆在某處被默默丟掉 | 可能是回程沒有路由、防火牆擋掉 ICMP、對方主機關機;用 traceroute 找停在哪一跳 |
另外兩個常見的誤會:
- ping 不通,不代表對方壞了。 很多伺服器與防火牆會擋掉 echo request,網頁照樣能開。
- ping 得通,不代表服務正常。 ping 只證明 IP 這一層通了,網頁伺服器有沒有在跑、TCP 80 有沒有被擋,要用 http 或瀏覽器另外測。
traceroute 的原理在第 9 課學過:依序送出 TTL 1、2、3… 的封包,讓路上每台路由器回報「逾時」(類型 11),最後由目的地回覆。
某一行是 * 但後面的行正常,表示那一跳沒有回報;從某一行開始全部是 *,就要懷疑那附近的路由,特別是回程。
小測驗:ICMP 與 ping
traceroute 能找出路徑上的每一台路由器,靠的是哪一種 ICMP 訊息?
ping -c 5 的輸出只有 icmp_seq=1、2、3、5 四行,統計寫 20% packet loss。哪一個說法正確?
PC 執行 ping 後看到 From 10.0.0.2 icmp_seq=1 Destination Host Unreachable。這行是誰送給你的?
由下往上排錯
「網路不通」可能是任何一層出了問題。與其亂猜,不如照分層的順序由下往上一層一層排除。 每一步都只回答一個問題,確認沒問題再往上走:
| 順序 | 檢查什麼 | 怎麼檢查(本模擬器的指令) | 常見的錯 |
|---|---|---|---|
| 1 實體連線 | 線有沒有接、介面有沒有連線燈號、Wi-Fi 有沒有連上 | 看燈號與介面狀態;show ip 會標出「介面未連線」,link <介面> up 把線接回去 |
線沒插好、接錯埠、介面被關閉 |
| 2 位址與遮罩 | 自己的位址和前綴是否落在正確的網段 | show ip,和同網段運作正常的電腦比較 |
位址打錯、遮罩錯、DHCP 沒拿到位址 |
| 3 閘道 | 能不能到達預設閘道 | ping <閘道> |
閘道寫錯、閘道不在自己的網段 |
| 4 DNS | 名稱能不能查到位址 | nslookup <名稱>;比較「用 IP 通、用名稱不通」 |
DNS 伺服器位址打錯、伺服器沒有這筆紀錄 |
| 5 路由與回程 | 封包到得了對方、回覆回得來嗎 | ping <遠端 IP>、traceroute、各路由器的 show route |
少了去程或回程的路由 |
| 6 防火牆 | 某一種流量是否被擋 | ping 通、但 http 不通;show acl |
規則擋掉需要的埠,或順序寫錯 |
順序的道理:上層依賴下層。位址設錯時連閘道都到不了,查 DNS 只是白費力氣; 而第 4 步把「名稱的問題」和「路的問題」分開:用 IP 位址能通、用名稱不通,就是 DNS;用 IP 位址也不通,就繼續往路由找。
實際排錯時常常先做一個「跳到中間」的測試,例如直接 ping 遠端的 IP:通了,下面幾層都沒問題,往上找;不通,再往下逐層檢查。 不管從哪裡開始,每次只改一個設定、改完馬上再測,才知道是哪一個修改解決了問題。
小測驗:排錯的順序
PC 的位址是 192.168.1.10/24,預設閘道設成 192.168.2.1。ping 任何其他網段都失敗。問題在哪一步?
ping 203.0.113.80 成功,但 ping www.example.com 顯示找不到主機。最該先檢查什麼?
可以 ping 通網頁伺服器,瀏覽器卻連不上它的網頁。哪一個推論最合理?
筆電接上有線網路後什麼都不通,show ip 顯示介面「沒有位址」,網路孔的連線燈號也沒亮。最先做什麼?
重點整理
- ICMP 由發現問題的設備送回來源,負責回報錯誤與診斷:echo request/reply(ping)、目的地無法到達(類型 3)、逾時(類型 11,traceroute 靠它)。
- 讀 ping:
icmp_seq跳號=遺失、ttl估計經過幾台路由器、time是來回時間、最後看遺失率。 - 「有設備回報無法到達」告訴你停在哪裡;「完全沒有回應」要懷疑回程路由、防火牆或對方沒開機。
- ping 不通不一定是壞了(可能擋 ICMP),ping 通也不代表服務正常(還要測 TCP)。
- 排錯由下往上:實體連線 → 位址與遮罩 → 閘道 → DNS → 路由與回程 → 防火牆;每次只改一個設定,改完馬上再測。
到這裡,封包已經能在網路之間正確來回。下一課往上一層到傳輸層:同一台電腦上有很多程式同時連網,收到的資料要交給哪一個程式?答案是連接埠,以及最簡單的傳輸協定 UDP。