引言:在數(shù)據(jù)校驗(yàn)中經(jīng)常提到校驗(yàn)和的概念,什么是校驗(yàn)和?校驗(yàn)和是如何計(jì)算的?本文將結(jié)合數(shù)據(jù)包分析軟件,詳細(xì)說(shuō)明校驗(yàn)和的計(jì)算過(guò)程,使校驗(yàn)和更容易理解。
校驗(yàn)和也叫檢查和,它(Checksum)是Internet協(xié)議常用的檢驗(yàn)方式。如 TCP、UDP、IP、ICMP等協(xié)議都使用校驗(yàn)和進(jìn)行差錯(cuò)檢測(cè)。
校驗(yàn)和的計(jì)算機(jī)方法是:發(fā)送方將要發(fā)送的數(shù)據(jù)信息看成一個(gè)k比特的二進(jìn)制數(shù)序列,然后對(duì)k比特的二進(jìn)制數(shù)進(jìn)行1的補(bǔ)碼和,累加的結(jié)果再取反就得到校驗(yàn)和,再將數(shù)據(jù)信息和校驗(yàn)和一起發(fā)送到接收方。
同樣,接收方對(duì)收到的所有k比特的二進(jìn)制(包括校驗(yàn)和)進(jìn)行1的補(bǔ)碼和運(yùn)算。如果累加結(jié)果中有任何比特是0,表明傳輸有差錯(cuò)。
以上對(duì)校驗(yàn)和的解釋理解起來(lái)較困難,其他資料也沒(méi)有更詳盡的解釋,因此對(duì)校驗(yàn)和的認(rèn)識(shí)一直比較模糊。但是在分析數(shù)據(jù)包的過(guò)程中,發(fā)現(xiàn)結(jié)合數(shù)據(jù)包分析實(shí)例再加以驗(yàn)算,校驗(yàn)和的計(jì)算就不難理解了,下面就結(jié)合數(shù)據(jù)包分析來(lái)進(jìn)行校驗(yàn)和的計(jì)算。
圖 1 校驗(yàn)和
首先從圖1的數(shù)據(jù)包,可以看出IP協(xié)議、UDP協(xié)議都有校驗(yàn)和,這里IP數(shù)據(jù)包的校驗(yàn)和為0x9EDE,其中0x表示是16進(jìn)制,9EDE是IP報(bào)頭的校驗(yàn)和。
IP報(bào)頭數(shù)據(jù)是多少呢?選中“IP-因特網(wǎng)協(xié)議”,則在16進(jìn)制視圖中就顯示出IP報(bào)頭部分?jǐn)?shù)據(jù),其中校驗(yàn)和9EDE也在其中,計(jì)算校驗(yàn)和過(guò)程如下:
在上面校驗(yàn)和計(jì)算方法中提到的“k比特的二進(jìn)制數(shù)序列”就是圖1中45 00 01 72 64 F9 00 00 04 11 9E DE C0 A8 01 01 EF FF FF FA,只不過(guò)這里采用十六進(jìn)制的表示。
接著對(duì)k比特的二進(jìn)制數(shù)進(jìn)行1的補(bǔ)碼和。“1的補(bǔ)碼和”運(yùn)算就是帶循環(huán)進(jìn)位的加法,最高位如進(jìn)位,則進(jìn)到最低位。當(dāng)然可以將這些數(shù)據(jù)轉(zhuǎn)成二進(jìn)制進(jìn)行計(jì)算,但比較麻煩,在這里直接用16進(jìn)制進(jìn)行計(jì)算。
注意:發(fā)送方不僅僅發(fā)送報(bào)頭數(shù)據(jù),而且連同校驗(yàn)和一起發(fā)送,所以在計(jì)算校驗(yàn)和時(shí)要先把校驗(yàn)和去掉,即把9E DE置0,這樣就成為了求 45 00 01 72 64 F9 00 00 04 11 00 00 C0 A8 01 01 EF FF FF FA的和。
Sum=0x4500+0x0172+0x64f9+0x0000+0x0411+0x0000+0xc0a8+0x0101+0xefff+0xfffa=0x3611e(超出16位,這時(shí)就需要“進(jìn)行1的補(bǔ)碼和”,即將高位0x3 與低位 0x611e相加 ),Sum=0x3+611e=0x6121。
接下來(lái)我們對(duì)計(jì)算的和取反,即得校驗(yàn)和,取反時(shí)需要轉(zhuǎn)成二進(jìn)制計(jì)算:
0x6121=b0110 0001 0010 0001
取反得b1001 1110 1101 1110=0x9EDE
即IP協(xié)議報(bào)頭的校驗(yàn)和為0x9EDE, 再將數(shù)據(jù)信息和校驗(yàn)和一起發(fā)送到接收方。
接收方接收到45 00 01 72 64 F9 00 00 04 11 9E DE C0 A8 01 01 EF FF FF FA同樣進(jìn)行1的補(bǔ)碼和計(jì)算:
Sum=0x4500+0x0172+0x64f9+0x0000+0x0411+0x9eed+0xc0a8+0x0101+0xefff+0xfffa=0x4000b,Sum=0x4+0xb=0xf=b1111
累加結(jié)果每一位都為1,沒(méi)有任何比特的“0”出現(xiàn),表明傳輸沒(méi)有錯(cuò)誤。
結(jié)合數(shù)據(jù)包分析,根據(jù)分析軟件中顯示的報(bào)頭數(shù)據(jù)、校驗(yàn)和結(jié)果,動(dòng)手驗(yàn)算后校驗(yàn)和就較容易理解了。