Ping 與 ICMP 回應機制
ICMP Echo Request/Reply 格式
類型(8/0) | 代碼(0) | 檢驗和 | 識別符 | 序號 | 選擇性資料
Type: 8=Request, 0=Reply
關鍵設計點
- 識別符:進程 ID,區分同主機多個 Ping 實例
- 序號:每送一個遞增,配對請求/回應
- 時間戳:資料區常放發送時間,計算 RTT
- TTL:回應通常設 255,觀察路徑跳數
IP 選項:記錄路由與時間戳
記錄路由 (RR, 選項類型 7)
類型(7) | 長度(39) | 指標 | 最多 9 個 IP 位址 (36 bytes) | 填充
指標初始 4,每記錄一個 +4,滿為 40
- 每個路由器記錄出介面 IP
- 目的主機記錄入介面 IP
- IP 標頭最大 60 bytes,固定 20 + 選項 3 + 最多 37 bytes 數據
時間戳 (選項類型 0x44)
類型(0x44) | 長度 | 指標 | OF(4) | FL(4) | 時間戳資料
FL=0: 僅時間戳
FL=1: IP+時間戳 (最多 4 組)
FL=3: 預先指定 IP,僅匹配時記錄時間戳
Traceroute 追蹤路由路徑
核心原理:TTL 遞增 + ICMP Time Exceeded
- 發送 UDP 封包,TTL=1, 2, 3...
- 每個路由器 TTL 遞減為 0 → 丟棄並回送 ICMP Type 11 Code 0 (TTL Exceeded in Transit)
- 目的主機收到 UDP 但埠不可達 → 回送 ICMP Type 3 Code 3 (Port Unreachable)
- 封包內含:序號、TTL 副本、發送時間戳 (計算每跳 RTT)
ICMP Time Exceeded 格式
類型(11) | 代碼(0/1) | 檢驗和 | 未用 | 原始 IP 標頭 + 前 8 bytes 資料
IP 選路決策流程
路由表搜尋順序
- 尋找主機路由 (完整匹配 32 bits)
- 尋找網路路由 (網路號匹配)
- 使用預設路由 (0.0.0.0/0)
路由表旗標解讀
| 旗標 | 含義 |
| U | 路由啟用 |
| G | 通往閘道 (間接路由) |
| H | 主機路由 |
| D | 由重導向建立 |
| M | 由修改建立 |
route 指令範例
route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2
目的地 遮罩 閘道 度量 介面
ICMP 重導向與路由器發現
ICMP Redirect (Type 5)
類型(5) | 代碼(0-3) | 檢驗和 | 應用閘道 IP | 原始 IP 標頭 + 前 8 bytes
- 代碼:0=網路, 1=主機, 2=TOS+網路, 3=TOS+主機
- 僅路由器產生,主機收到後驗證:同網段、非自身、間接路由
- 優化:主機直接發送給更優閘道
ICMP Router Discovery (Type 9/10)
- 主機啟動送 Router Solicitation (Type 10) 廣播/多播
- 路由器回 Router Advertisement (Type 9) 含優先級
- 路由器定期多播通告,主機動態更新路由表
- 優先級:有號 32-bit 整數,越大優先級越高
RIP 路由資訊協定
RIPv1 封包格式 (UDP 埠 520)
命令(1) | 版本(1) | 零(2) | 地址族(2) | 零(2) | IP位址(4) | 零(4) | 零(4) | 度量(4)
最多 25 條路由/封包 (20 bytes + 24×20 bytes)
運作機制
- 初始化:啟動介面發送 Request (命令=1, 地址族=0, 度量=16) 索取完整表
- 週期更新:每 30 秒廣播完整路由表
- 觸發更新:度量變化立即發送變更項目
- 超時機制:180 秒 (6 個週期) 未更新 → 度量設 16 (不可達)
- 度量:跳數 (直接連接=1, 最大 15, 16=不可達)
RIPv2 增強 (RFC 2453)
命令 | 版本(2) | 路由域 | 地址族 | 路由標記 | IP位址 | 子網遮罩 | 下一跳 | 度量
支援:VLSM、CIDR、認證、多播 (224.0.0.9)、下一跳指定
- 路由域:識別 RIP 進程實例
- 路由標記:外部路由標識 (如 BGP 重發布)
- 子網遮罩:支援非固定長度子網
- 下一跳:優化轉發路徑,0 表示發送者
RIP 限制與現狀
- 最大 15 跳 → 不適合大型網路
- 收斂慢、頻寬浪費 (定期全表廣播)
- 現多為 OSPF/IS-IS/BGP 取代,RIP 仍用於小型/邊緣網路