zshuangyan / blog

我的个人博客
2 stars 0 forks source link

ip头校验算法 #24

Open zshuangyan opened 5 years ago

zshuangyan commented 5 years ago

先上ip报文的格式: image

我们从某个ip数据报中截取了一部分(16进制的表示) 4500 0073 0000 4000 4011 b861 c0a8 0001 c0a8 00c7 0035 e97c 005f 279f 1e4b 8180

可以看到HeaderLength为5,首部为前面的20个字节,一个16进制数字占用4个bit位,那么首部需要40位16进制数表示,即为加粗的部分。checksum的部分为斜体部分。

计算ip头校验和的算法: 把首部每隔16位作为一个数字,除开checksum对应的b861,我们将得到9个数字分别为: 4500,0073,0000,4000,4011,c0a8,0001,c0a8,00c7.

对这些数字执行one's complement sum操作,即先相加,然后把溢出部分的carry-out提取出来再相加。 4500+0073+0000+4000+4011+c0a8+0001+c0a8+00c7=2479C ,我们再执行479C+2得到479E,把479E转换为二进制表示0100 0111 1001 1110

然后对上面得到的数字取反,得到1011 1000 0110 0001,它的16进制表示为B861

当我们接受到数据时,把首部每隔16位作为一个数字,并且包含checksum部分,进行one's complement计算 4500 + 0073 + 0000 + 4000 + 4011 + b861 + c0a8 + 0001 + c0a8 + 00c7 = 2fffd fffd + 2 =ffff ~ffff = 0000 得到结果0000意味着没有错误