首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

ICMP 協定深度解析 (一):協定原理與核心訊息格式詳解

     編輯:關於VC++

ICMP (Internet Control Message Protocol) 與 IP 協定同層於 OSI 網路層 (第 3 層),是 IP 協定的重要補充,主要功能包含:

  • 主機探測:確認目標主機是否存活
  • 路由維護與選擇:路由器發現、重導向、路徑 MTU 探測
  • 流量控制:來源抑制 (Source Quench,已淘汰)

核心訊息類型詳細解析 (依 RFC 792)

1. 回送請求/回應 — Type 8 / Type 0 (Ping 核心)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Identifier          |        Sequence Number        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Data (optional)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Type:8 = Echo Request (請求),0 = Echo Reply (回應)
  • Code:固定為 0
  • Checksum:ICMP 訊息 (從 Type 開始) 的 16-bit 反碼和再取反
  • Identifier:協助配對請求/回應,常用 Process ID
  • Sequence Number:序號,偵測封包遺失/重序
  • Data:選擇性資料,回應必須原樣返回

處理規則:回應訊息交換來源/目的 IP,Type 改為 0,重新計算 Checksum。

2. 逾時訊息 — Type 11 (Traceroute 核心)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type=11   |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Unused                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Internet Header + 64 bits of Original Data Datagram          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Code 0:傳送逾時 (TTL=0 被丟棄) —— 路由器產生
  • Code 1:分片重組逾時 —— 目的主機產生
  • 附帶原始 IP 標頭 + 前 64 位元資料 (含 TCP/UDP 埠號),供發送端匹配上層連線

3. 目的地不可達 — Type 3

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type=3    |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Unused                                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Internet Header + 64 bits of Original Data Datagram          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Code 0:網路不可達 (路由器)
  • Code 1:主機不可達 (路由器/主機)
  • Code 2:協定不可用 (主機)
  • Code 3:埠不可達 (主機) —— 掃描器判斷開放埠關鍵
  • Code 4:需分片但 DF=1 (路由器) —— PMTU 探測基礎
  • Code 5:來源路由失敗 (路由器)

Code 0,1,4,5 由路由器產生;Code 2,3 由目的主機產生。

主機探測實戰邏輯

  1. 發送 ICMP Echo Request (Type 8) 至目標 IP
  2. 收到 Echo Reply (Type 0) → 主機存活
  3. 收到 Destination Unreachable (Type 3, Code 1) → 主機離線或防火牆攔截
  4. 無回應 (逾時) → 主機離線、防火牆過濾 ICMP、或路由不通

補充探測手段:TCP SYN 掃描 (埠回應)、Banner Grabbing、NMAP 綜合掃描、Netcraft 等線上服務。

Checksum 計算標準演算法

  1. 將檢驗和欄位歸零
  2. 以 16-bit 為單位累加所有字詞 (奇數位元組補零)
  3. 將進位折疊回低 16-bit (sum = (sum >> 16) + (sum & 0xFFFF) 重複直到無進位)
  4. 取反碼 (~sum) 即為檢驗和

本系列後續文章將展示三種 Ping 實作方式:ICMP.dll (簡易)、RAW Socket (標準)、Traceroute 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved