ICMP協(xié)議的工作原理
ICMP協(xié)議的功能非常重要,在網(wǎng)絡(luò)協(xié)議的學(xué)習(xí)中,這部分知識也是我們講解的重點。那么對于ICMP協(xié)議的工作原理,以及工作流程具體是如何完成的呢?我們就來詳細(xì)介紹一下這方面的效驗問題。首先我們要明確一下ICMP的定義。
ICMP定義
英文原義:InternetControlMessageProtocol
中文釋義:(RFC-792)Internet控制消息協(xié)議
ICMP是“InternetControlMessageProtocol"(Internet控制消息協(xié)議)的縮寫。它是TCP/IP協(xié)議族的一個子協(xié)議,用于在IP主機、路由器之間傳遞控制消息。控制消息是指網(wǎng)絡(luò)通不通、主機是否可達(dá)、路由是否可用等網(wǎng)絡(luò)本身的消息。這些控制消息雖然并不傳輸用戶數(shù)據(jù),但是對于用戶數(shù)據(jù)的傳遞起著重要的作用。
我們在網(wǎng)絡(luò)中經(jīng)常會使用到ICMP協(xié)議,只不過我們覺察不到而已。比如我們經(jīng)常使用的用于檢查網(wǎng)絡(luò)通不通的Ping命令,這個“Ping"的過程實際上就是ICMP協(xié)議工作的過程。還有其他的網(wǎng)絡(luò)命令如跟蹤路由的Tracert命令也是基于ICMP協(xié)議的。
ICMP協(xié)議內(nèi)容
ICMP的全稱是InternetControlMessageProtocol。從技術(shù)教度來說,ICMP就是一個“錯誤偵測與回報機制",其目的就是讓我們能夠檢測網(wǎng)路的連線狀況﹐也能確保連線的準(zhǔn)確性﹐其功能主要有:
◆偵測遠(yuǎn)端主機是否存在。
◆建立及維護(hù)路由資料。
◆重導(dǎo)資料傳送路徑。
◆資料流量控制。
ICMP在溝通之中,主要是透過不同的類別(Type)與代碼(Code)讓機器來識別不同的連線狀況。常用的類別如下表所列﹕
ICMP是個非常有用的協(xié)定﹐尤其是當(dāng)我們要對網(wǎng)路連接狀況進(jìn)行判斷的時候。下面讓我們看看常用的ICMP實例,以更好了解ICMP的功能與作用。
ICMP協(xié)議的重要性
ICMP協(xié)議對于網(wǎng)絡(luò)安全具有極其重要的意義。ICMP協(xié)議本身的特點決定了它非常容易被用于攻擊網(wǎng)絡(luò)上的路由器和主機。例如,在1999年8月海信集團(tuán)“懸賞"50萬元人民幣測試防火墻的過程中,其防火墻遭受到的ICMP攻擊達(dá)334050次之多,占整個攻擊總數(shù)的90%以上!可見,ICMP的重要性絕不可以忽視!
比如,可以利用操作系統(tǒng)規(guī)定的ICMP數(shù)據(jù)包最大尺寸不超過64KB這一規(guī)定,向主機發(fā)起“PingofDeath"(死亡之Ping)攻擊。“PingofDeath"攻擊的原理是:如果ICMP數(shù)據(jù)包的尺寸超過64KB上限時,主機就會出現(xiàn)內(nèi)存分配錯誤,導(dǎo)致TCP/IP堆棧崩潰,致使主機死機。
此外,向目標(biāo)主機長時間、連續(xù)、大量地發(fā)送ICMP數(shù)據(jù)包,也會最終使系統(tǒng)癱瘓。大量的ICMP數(shù)據(jù)包會形成“ICMP風(fēng)暴",使得目標(biāo)主機耗費大量的CPU資源處理,疲于奔命。
ICMP協(xié)議的校驗和算法
- unsignedshortchksum(addr,len)
- unsignedshort*addr;/*校驗數(shù)據(jù)開始地址(注意是以2字節(jié)為單位)*/
- intlen;/*校驗數(shù)據(jù)的長度大小,以字節(jié)為單位*/
- {
- intsum=0;/*校驗和*/
- intnleft=len;/*未累加的數(shù)據(jù)長度*/
- unsignedshort*p;/*走動的臨時指針,2字節(jié)為單位*/
- unsignedshorttmp=0;/*奇數(shù)字節(jié)長度時用到*/
- while(nleft>1)
- {
- sum+=*p++;/*累加*/
- nleft-=2;
- }
- if(nleft==1)/*奇數(shù)字節(jié)長度*/
- {
- *(unsignedchar*)&tmp=*(&(unsignedchar*)p);/*將最后字節(jié)壓如2字節(jié)的高位*/
- sum+=tmp;
- }
- sum+=(sum>>16)+(sum&0xffff);/*高位低位相加*/
- sum+=sum>>16;/*上一步溢出時,將溢出位也加到sum中*/
- tmp=~sum;/*注意類型轉(zhuǎn)換,現(xiàn)在的校驗和為16位*/
- returntmp;
- }