FPGA工程师必备技能_以太帧IP校验和和UDP校验计算_相关问题总结

以太帧IP校验和和UDP校验和计算及相关问题总结

  • FPGA工程师必备技能_以太帧IP校验和和UDP校验计算_相关问题总结
    • 一 以太帧IP校验和计算
    • 二 以太帧IP校验和计算
    • 三 wireshark抓包可以抓到,但是网络调试助手netassist没有返回是什么原因

FPGA工程师必备技能_以太帧IP校验和和UDP校验计算_相关问题总结

一 以太帧IP校验和计算

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

二 以太帧IP校验和计算

一直都没太搞明白UDP/TCP检验和的计算方法,这两天终于琢磨明白了,原来是酱紫滴!

不过计算过程还是非常繁琐的,如果不使用代码实现光靠人工计算估计会让人有点想崩溃滴感觉!(这两天差点没吐血- -!)估计没有几个人能完整的将它计算出来%……¥&……¥

追求真理的道路永远都是曲折的,在这个过程中吐血身亡的人已经不计其数,俺还是顽强的挺过来了,哈哈哈~~

不论如何算是有点小小的收获吧,以下是详细的计算过程:

一、下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分:

1.UDP伪首部

2.UDP首部

3.UDP的数据部分(切记不要遗漏该部分,否则就吐血了
FPGA工程师必备技能_以太帧IP校验和和UDP校验计算_相关问题总结_第1张图片

首先解释下伪首部的概念,伪首部包含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截图
FPGA工程师必备技能_以太帧IP校验和和UDP校验计算_相关问题总结_第2张图片

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 与上面待验证值相同。

三 wireshark抓包可以抓到,但是网络调试助手netassist没有返回是什么原因

下面我们要用到一个新的工具,小兵以太网测试仪。
操作步骤:
1,独立抓包
2,点击抓包
3,网络调试助手发数据
4,查看结果。
结果如下图。
FPGA工程师必备技能_以太帧IP校验和和UDP校验计算_相关问题总结_第3张图片可以看到wireshark可以收到,网络调试助手不能收到的原因是UDP校验错误。使用前面的第二讲内容可以验证,确实是UDP校验错误。
如果觉得文章总结的不错的话,点个关注收藏赞吧。

文章引用如下:
【1】:IP首部校验和的计算。https://www.cnblogs.com/cgc0415/p/6097282.html
【2】:udp检验和计算方法。https://blog.csdn.net/mariofei/article/details/24919401

你可能感兴趣的:(FPGA工程师必备技能,网络,wireshark,udp,fpga开发,tcp/ip)