ICMP就是所謂的Internet控制報文協議(Internet Control Message Protocol),在網絡中,一般用它來傳遞差錯報文以及其他應注意的信息。ICMP一般被認為是和IP協議同一層的協議,IMCP報文通常被IP層或者更高層的協議(如:TCP或者UDP)使用,ICMP對於互聯網以及其他基於IP協議的網絡的正常運行起著非常重要的作用。有許多重要的網絡程序都是基於ICMP協議上的,最為著名如Ping和Tracert等。本文就來介紹用Visual C#實現基於ICMP協議重要的網絡命令Ping的方法。
Ping命令是可以說是一個"跨平台"程序,這是因為Ping命令不僅存在Windows系統上,在Unix系統上也有Ping命令,其實對其他只要是支持網絡的操作系統,一般也都存在該命令。Ping命令的主要作用是檢測網絡上主機的狀態。要是在幾年前,我們還可以下如此斷言,如果不能Ping通某台主機,那麼也就無法Telnet或者FTP到這台主機,但隨著互聯網的安全意識的增加,出現了訪問控制清單的路由器和防火牆,由於ICMP報文是在IP數據包中被傳輸的,而到達一台主機不僅取決於IP層是否到達,還取決於使用何種協議和端口。譬如金山公司的金山網镖就可以禁止其他機器Ping通這台主機。所以在現在的情況下,即時Ping不通某台機器,但也有可能FTP登陸到這台機器,或者通過HTTP來浏覽這台機器上的Web頁面。
一.Ping命令簡介
首先進入Windows系統中的命令提示符,輸入"Ping/?"後,單擊回車鍵,您就可以了解Ping命令的各種參數的使用方法。最為常見的使用方法是"Ping 遠程計算機名稱(或者遠程計算機的IP地址)",如果在Ping命令的返回字符中有"Reply from",說明此主機在線,具體如圖01:
圖01:Ping通主機時的運行界面
如果返回字符中有"Request timeout",一般情況此主機不在線,具體如圖02:
圖02:Ping不通主機時的運行界面
二.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協議的相關書籍,它們一般介紹的都很詳細。
三.簡介Visual C#實現Ping命令使用的類:
Visual C#實現Ping命令中涉及到很多的類,其中最重要的是Socket類。這是因為程序中發送含有ICMP報文的IP數據包,接收含有ICMP超時或ICMP會顯報文的IP數據包和設定IP數據包中的TTL數值都會使用到Socket類。表01和表02是Socket類中的常用屬性和方法及其簡要說明。