IP首部校验和的计算
ip抓包结果:
0000: 00 e0 0f 7d 1e ba 00 13 8f 54 3b 70 08 00 45 00
0010: 00 2e be 55 00 00 7a 11 51 ac de b7 7e e3 c0 a8
0020: 12 7a
45 00 00 2e----4表示ip版本号为ip第4版;5表示首部长度为5个32 bit字长,即为20字节;00 2e表示ip总长度为46字节,其中ip数据部分为
26字节。
be 55 00 00----be 55表示标识符;00 00表示3 bit标志及13 bit片偏移量;
7a 11 51 ac----7a表示ttl值为122;11表示协议号为17的udp协议;51 ac表示16 bit首部检验和值;
de b7 7e e3----表示32 bit 源ip地址为222.183.126.227
c0 a8 12 7a----表示32 bit 目的ip地址为192.168.18.122
校验和计算:
发送前
1、先将校验和字段置为零
2、对首部以16bit为单位求和
0x4500 + 0x002e + 0xbe55 +0x0000 +…+0x127a = 0x3ae50
对应的二进制: 11 1010 1110 0101 0000
3、将产生的进位加到低四位,即checksum += (checksum >> 32)
得到:1010 1110 0101 0011 即:0xae53
将各位取反,得0101 0001 1010 1100
校验和:0x51ac
接收数据时:
1、对首部以16bit为单位求和
0x4500 + 0x002e +…+0x51ac +…+0x127a = 0x3fffc
(0x3 + 0xfffc) = 0xffff
再取反,即得最终校验和:0x0000,结果为0说明IP首部合法。
上面转载自博客:
https://www.cnblogs.com/cgc0415/p/6097282.html
一直都没太搞明白UDP/TCP检验和的计算方法,这两天终于琢磨明白了,原来是酱紫滴!
不过计算过程还是非常繁琐的,如果不使用代码实现光靠人工计算估计会让人有点想崩溃滴感觉!(这两天差点没吐血- -!)估计没有几个人能完整的将它计算出来%……¥&……¥
追求真理的道路永远都是曲折的,在这个过程中吐血身亡的人已经不计其数,俺还是顽强的挺过来了,哈哈哈~~
不论如何算是有点小小的收获吧,以下是详细的计算过程:
一、下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分:
1.UDP伪首部
2.UDP首部
首先解释下伪首部的概念,伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。
还有一个概念十分重要,那就是16位UDP总长度,请注意该长度不是报文的总长度,而只是UDP(包括UDP头和数据部分)的总长度(之前就是因为这个概念没弄清楚,走了不少弯路,吐血~~)。
二、计算检验和(checksum)的过程很关键,主要分为以下几个步骤:
1.把伪首部添加到UDP上;
2.计算初始时是需要将检验和字段添零的;
3.把所有位划分为16位(2字节)的字
4.把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
5.将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。
三、狮屎胜于雄辩,还是举个例子来分析一下吧,本人举UDP校验和的例子。
TCP校验和的例子请到一下链接。
https://blog.csdn.net/mariofei/article/details/24919401
下面是wireshark截图
0000 6c 4b 90 a6 b2 bc 00 0a 35 01 fe c0 08 00 45 00 lK......5.....E.
0010 00 24 00 01 40 00 80 11 79 72 c0 a8 00 02 c0 a8 .$..@...yr......
0020 00 03 1f 90 1f 90 00 10 39 06 ff 55 05 fe 00 00 ........9..U....
0030 00 fe 00 00 00 00 00 00 00 00 00 00 ............
ip源地址 C0A8 0002
ip目的地址 C0A8 0003
00 11
UDP长度 0010
源端口 1F90
目的端口 1F90
UDP长度0010
UDP校验 0000
UDP校验值(待验证):3906
UDP校验计算:
C0A8 0002 C0A8 0003 0011 0010 1F90 1F90 0010 0000 ff55 05fe 0000 00fe 0000 0000 0000 0000 0000
得到UDP校验值为:0x3906 与上面待验证值相同。
下面我们要用到一个新的工具,小兵以太网测试仪。
操作步骤:
1,独立抓包
2,点击抓包
3,网络调试助手发数据
4,查看结果。
结果如下图。
可以看到wireshark可以收到,网络调试助手不能收到的原因是UDP校验错误。使用前面的第二讲内容可以验证,确实是UDP校验错误。
如果觉得文章总结的不错的话,点个关注收藏赞吧。
文章引用如下:
【1】:IP首部校验和的计算。https://www.cnblogs.com/cgc0415/p/6097282.html
【2】:udp检验和计算方法。https://blog.csdn.net/mariofei/article/details/24919401