5.7.3 UDP协议格式(二)使用Wireshark分析UDP用户数据报
我们通过对Wireshark采集的UDP用户数据报进行分析,判定一下UDP用户数据报报文接收的是否正确,这里我们首先要对Wireshark采集到的UDP数据的含义。
如图
其中分组详情面板中显示的是采集到数据的基本信息,包括数据报采集的时间、报文长度等,采集到的数据以十六进制数据在分组字节流面板中显示。
-
以太帧格式的信息:
如图
分组字节流面板中前14个字节的信息是以太帧的信息,其中前六个字节是目的MAC地址,紧接着的六个字节是源MAC地址,再接着的两个字节0800表示的是网络层携带的数据类型是IP数据报,这里我们需要注意的是帧尾的4字节的CRC校验和Wireshark软件是没有采集的,因为网卡没有提供CRC的信息给软件的捕获引擎,所以帧的总长应该是110+4字节114字节,符合最短的以太网有效帧长。
-
IP数据报首部
Wireshark中捕获的IP数据报的详细信息参看(5.2.4 IP数据报(二)分析Wireshark捕获的数据帧)
从第十五个字节开始是IP数据报的首部信息,因为UDP是封装在网络层IP数据报中的,IP数据报的内容可以从分组详情面板中解析的内容看到,在分组字节流面板中第15个字节开始45表示的是使用的是IPv4协议,首部是固定的20个字节,IP数据报首部的其他信息参看(5.2.3 IP数据报(一)IP数据报的格式)
-
UDP首部8个字节
如图
我们知道UDP的首部一共是4个字段,每个字段是两个字节,所以我们可以把这8个字节进行拆分拆分结果如下
源端口是53699是一个一般的端口,目的端口32761,UDP用户数据报长度76字节,校验和2c9e,剩余的就是UDP的数据部分,一共是76字节减去UDP首部的8个字节,所以数据部分一共是68字节。
基于以上基础知识我们来看一下校验和是否正确。
计算UDP首部校验和
-
UDP首部校验和字段设置为全零。
d1c3 7ff9 004c 0000 -
我们将UDP用户数据报中的首部和UDP的数据部分分别以16比特为单位进行划分,也就是两个字节两个字节进行划分。
这里我们需要说明的是**如果UDP的数据字段长度为奇数个字节的话,责令填充一个字节的全零,因为我们知道对于UDP的校验和是按照每16比特位进行划分(5.7.2 UDP协议格式(一)——UDP差错控制),也就是说按照两字节作为一组。**所以如果长度是奇数个字节的话应该填充一个字节的零。对于示例是68个字节是偶数就不用进行填充了。当然作为填充的字节不会被当做接收的数据,因为在UDP首部的长度字段已经指示了报文的长度。
-
伪首部部分参与校验和的计算我们知道伪首部包括源IP地址、目的IP地址、IP首部的协议字段、UDP的长度字段
-
反码求和运算,反码求和运算的规则如下
从低位到高位逐位进行计算,这里0+0等于0,0+1=1,1+1=10,所以这里需要向高位产生一个进位,如果最后在超过16为还有进位的话,最后加到尾巴中。
-
对累加结果取反码就得到UDP的校验和。
UDP首部+UDP数据+伪首部————>结果取反