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