網絡封包分析是網路除錯與安全審計的基礎技能。本文系統梳理以太網幀格式及上層 IP、TCP、UDP 協議頭部結構,並對照 RFC 標準說明關鍵欄位含義,為開發封包分析工具提供參考。
資料在以太網以「幀」為單位傳輸,標準幀格式(不含前導碼與幀定界符):
| 欄位 | 長度 | 說明 |
|---|---|---|
| 目的 MAC | 48 bits | 接收端實體位址 |
| 來源 MAC | 48 bits | 發送端實體位址 |
| 類型/長度 | 16 bits | 上層協議標識 (參見下表) |
| 資料載荷 | 46-1500 bytes | IP 封包等上層資料 |
| FCS | 32 bits | 幀檢查序列 (CRC32) |
| 十六進制 | 協議 |
|---|---|
| 0x0800 | IPv4 |
| 0x0806 | ARP |
| 0x8035 | RARP |
| 0x809B | AppleTalk |
| 0x8137-0x8138 | Novell IPX |
| 0x814C | SNMP |
| 0x86DD | IPv6 |
當 EtherType = 0x0800 時,載荷為 IPv4 封包。頭部最小 20 bytes:
| 欄位 | 位數 | 說明 |
|---|---|---|
| 版本 | 4 | 固定為 4 |
| 頭部長度 (IHL) | 4 | 32-bit 字為單位,最小 5 (20 bytes) |
| 服務類型 (TOS) | 8 | QoS 優先級/可靠性等 |
| 總長度 | 16 | 整個 IP 封包長度 (bytes) |
| 識別 | 16 | 分片重組標識 |
| 標誌 | 3 | DF(不分片)、MF(更多片段) |
| 片段偏移 | 13 | 分片相對原始資料位移 (8 bytes 為單位) |
| 生存時間 (TTL) | 8 | 路由躍點上限,防止迴路 |
| 協議 | 8 | 上層協議:6=TCP, 17=UDP, 1=ICMP |
| 頭部檢查和 | 16 | 僅驗證頭部完整性 |
| 來源 IP | 32 | 發送端 IPv4 位址 |
| 目的 IP | 32 | 接收端 IPv4 位址 |
| 選項/填充 | 變動 | 罕見,對齊至 32-bit |
IP 協議欄位 = 6 時,載荷為 TCP 區段。頭部最小 20 bytes:
| 欄位 | 位數 | 說明 |
|---|---|---|
| 來源埠 | 16 | 發送端應用埠號 |
| 目的埠 | 16 | 接收端應用埠號 |
| 序號 | 32 | 本區段首字節在資料流中的絕對位置 |
| 確認號 | 32 | 期望收到的下一字節序號 (ACK 標誌置 1 時有效) |
| 資料偏移 | 4 | 頭部長度 (32-bit 字單位),最小 5 |
| 保留 | 6 | 必為 0 |
| 控制旗標 | 6 | URG/ACK/PSH/RST/SYN/FIN |
| 視窗大小 | 16 | 接收緩衝區剩餘容量 (bytes),流控關鍵 |
| 檢查和 | 16 | 含偽頭部、頭部、資料 |
| 緊急指標 | 16 | URG=1 時,指示緊急資料結束位置 |
| 選項 | 變動 | MSS、Window Scale、SACK、Timestamp 等 |
IP 協議欄位 = 17 時,載荷為 UDP。固定 8 bytes 頭部:
| 欄位 | 位數 | 說明 |
|---|---|---|
| 來源埠 | 16 | |
| 目的埠 | 16 | |
| 長度 | 16 | UDP 頭部+資料總長度 (最小 8) |
| 檢查和 | 16 | 含偽頭部、頭部、資料,可選 (0 表不計算) |
ntohs()/ntohl() 轉換memcpy 逐欄位提取掌握上述協議結構,配合 WinPcap/libpcap 或原始 Socket (SOCK_RAW),即可開發出功能完整的網絡監聽與分析工具。