Checksum算法
前言:
在網(wǎng)絡(luò)中傳輸數(shù)據(jù)包,為了保證傳輸數(shù)據(jù)的正確性,使用了
checksum來校驗數(shù)據(jù)是否正確,ip頭有自己的checksum,tcp、
udp也有自己的checksum,分別校驗不同部分的數(shù)據(jù),ip頭的
checksum用于校驗ip頭的數(shù)據(jù)是否正確,tcp的checksum用于校
驗tcp頭、tcp數(shù)據(jù)部分是否正確,udp的checksum用于校驗udp
頭、udp數(shù)據(jù)是否正確。
一、 checksum的計算方法
1、 先將需要計算checksum數(shù)據(jù)中的checksum設(shè)為0;
2、 計算checksum的數(shù)據(jù)按2byte劃分開來,每2byte組成一個16bit的值,如果最后有單個byte的數(shù)據(jù),補(bǔ)一個byte的0組成2byte;
3、 將所有的16bit值累加到一個32bit的值中;
4、 將32bit值的高16bit與低16bit相加到一個新的32bit值中,若新的32bit值大于0Xffff,
再將新值的高16bit與低16bit相加;
5、 將上一步計算所得的16bit值按位取反,即得到checksum值,存入數(shù)據(jù)的checksum字段即可
計算例子:
如計算下面一段數(shù)據(jù)的checksum,數(shù)據(jù)為16進(jìn)制;
45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11
紅色的6d 36為checksum字段,先把checksum設(shè)0,數(shù)據(jù)分組,補(bǔ)0,整理完后數(shù)據(jù)如下,中間checksum設(shè)置為0,最后補(bǔ)1byte 0;
4500 003c 0000 0000 4011 0000 c0a8 2bc3 0808 0808 1100
計算:4500+003c+0000+0000+4011+0000+c0a8+2bc3+0808+0808+1100 = 192C8
高低16bit相加: 1 + 92C8 = 92C9
取反: ~92C9 = 6D36
最后所得數(shù)據(jù)為:45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11
二、 IP TCP UDP計算checksum包含的數(shù)據(jù)
1、 IP頭的checksum
只使用ip頭數(shù)據(jù)進(jìn)行計算
2、 TCP/udp的checksum
Tcp/udp的Checksum計算的數(shù)據(jù),除了包含tcp/udp頭及tcp數(shù)據(jù)外,還需要增加一個偽tcp/udp頭,偽tcp/udp頭結(jié)構(gòu)如下:
這樣,tcp/udp的checksum計算數(shù)據(jù)如下:
Tcp:偽頭部+tcp頭部+tcp數(shù)據(jù)
Udp:偽頭部+udp頭部+udp數(shù)據(jù)
總結(jié)
以上是生活随笔為你收集整理的Checksum算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: checksum 算法
- 下一篇: siki学院首页仿写