二.Ping命令、ICMP報文和IP數據包
Ping命令基於的是TCP/IP協議簇中的ICMP協議,在編寫基於ICMP協議的網絡應用程序時,應注意下面二點:
1. ICMP報文是封裝在IP數據包中傳輸的。
了解這一點對後面編程非常重要,圖03是IP數據包的組成結構圖:
圖03:IP數據包的組成結構圖
習慣上把IP數據包劃分為三個部分:
(1).IP數據包中的前二十個字節的數據,即圖03中從【4位版本】到【32位目的地址IP】,這稱為IP首部。
(2).選項,即圖03中的【選項(如果有)】部分。
(3).數據,即圖03中的【數據】部分。
其中後面二個部分組成的就是ICMP報文。ICMP報文的具體組成結構如圖04所示:
圖04:ICMP報文組成結構圖
2. ICMP協議沒有固定的端口號。
ICMP協議和其他協議不同,其他協議基本都對應固定的端口號,如HTTP協議是通過80端口號來交換數據的。
了解上面的二點對後面在Visual C#實現Ping命令是非常有用的。因為在下面的在編寫Visual C#實現Ping命令的程序中,程序中定義一個名稱為"IcmpPacket"類,通過這個類來構造ICMP報文,而定義"IcmpPacket"類依據的就是圖03所示的ICMP報文組成結構。同樣由於ICMP協議沒有對應固定的端口號,這就意味著,編寫Visual C#實現Ping命令中可以隨意選擇端口號,本文選擇的端口號是"30"。
由於ICMP協議是一個復雜的協議,而本文由於篇幅所限,對ICMP的很多細節,就不能一一介紹,如果你對ICMP協議感興趣或對上面的介紹的仍然感覺有點模糊,那就請參閱探討ICMP協議的相關書籍,它們一般介紹的都很詳細。