引言:在數據校驗中經常提到校驗和的概念,什么是校驗和?校驗和是如何計算的?本文將結合數據包分析軟件,詳細說明校驗和的計算過程,使校驗和更容易理解。
校驗和也叫檢查和,它(Checksum)是Internet協議常用的檢驗方式。如 TCP、UDP、IP、ICMP等協議都使用校驗和進行差錯檢測。
校驗和的計算機方法是:發送方將要發送的數據信息看成一個k比特的二進制數序列,然后對k比特的二進制數進行1的補碼和,累加的結果再取反就得到校驗和,再將數據信息和校驗和一起發送到接收方。
同樣,接收方對收到的所有k比特的二進制(包括校驗和)進行1的補碼和運算。如果累加結果中有任何比特是0,表明傳輸有差錯。
以上對校驗和的解釋理解起來較困難,其他資料也沒有更詳盡的解釋,因此對校驗和的認識一直比較模糊。但是在分析數據包的過程中,發現結合數據包分析實例再加以驗算,校驗和的計算就不難理解了,下面就結合數據包分析來進行校驗和的計算。

圖 1 校驗和
首先從圖1的數據包,可以看出IP協議、UDP協議都有校驗和,這里IP數據包的校驗和為0x9EDE,其中0x表示是16進制,9EDE是IP報頭的校驗和。
IP報頭數據是多少呢?選中“IP-因特網協議”,則在16進制視圖中就顯示出IP報頭部分數據,其中校驗和9EDE也在其中,計算校驗和過程如下:
在上面校驗和計算方法中提到的“k比特的二進制數序列”就是圖1中45 00 01 72 64 F9 00 00 04 11 9E DE C0 A8 01 01 EF FF FF FA,只不過這里采用十六進制的表示。
接著對k比特的二進制數進行1的補碼和?!?的補碼和”運算就是帶循環進位的加法,最高位如進位,則進到最低位。當然可以將這些數據轉成二進制進行計算,但比較麻煩,在這里直接用16進制進行計算。
注意:發送方不僅僅發送報頭數據,而且連同校驗和一起發送,所以在計算校驗和時要先把校驗和去掉,即把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位,這時就需要“進行1的補碼和”,即將高位0x3 與低位 0x611e相加 ),Sum=0x3+611e=0x6121。
接下來我們對計算的和取反,即得校驗和,取反時需要轉成二進制計算:
0x6121=b0110 0001 0010 0001
取反得b1001 1110 1101 1110=0x9EDE
即IP協議報頭的校驗和為0x9EDE, 再將數據信息和校驗和一起發送到接收方。
接收方接收到45 00 01 72 64 F9 00 00 04 11 9E DE C0 A8 01 01 EF FF FF FA同樣進行1的補碼和計算:
Sum=0x4500+0x0172+0x64f9+0x0000+0x0411+0x9eed+0xc0a8+0x0101+0xefff+0xfffa=0x4000b,Sum=0x4+0xb=0xf=b1111
累加結果每一位都為1,沒有任何比特的“0”出現,表明傳輸沒有錯誤。
結合數據包分析,根據分析軟件中顯示的報頭數據、校驗和結果,動手驗算后校驗和就較容易理解了。