上一次谈到了我对ip首部检验和的理解,这一次再介绍一下对udp检验和的理解。
upd检验和的计算类似于ip首部检验和,udp检验和是一个端到端的检验和,由发送端计算,然后由接收端验证。如果接收端检测到检验和有差 错,udp数据报就要被丢弃。
下面我以本机接收到的一个udp数据包为例,来分析一下udp检验和的计算。
0000: 00 e0 4c a9 28 92 00 e0 0f 7d 1e ba 08 00 45 00
0010: 00 54 00 00 40 00 37 11 6c ea db 85 28 25 c0 a8
0020: 12 5c 1f 40 0f a0 00 40 71 2a 02 0f 19 00 02 2e
0030: eb 3f 34 21 51 c4 b6 cb 12 05 a3 24 b4 11 a8 d3
0040: 93 d2 cf ac 48 b7 98 d4 83 03 1a ae 14 11 ed 24
0050: bf c8 6f db 9a fa d8 c6 2a ca 21 08 a2 bd 25 8b
0060: 96 03
00 e0 4c a9 28 92 00 e0 0f 7d 1e ba 08 00----以太网帧首部(14字节)
45 00 00 54 00 00 40 00 37 11 6c ea db 85 28 25 c0 a8 12 5c----ip首部(20字节)
1f 40 0f a0 00 40 71 2a----udp首部(8字节);其中1f 40表示16位源端口号8000;0f a0表示16位目的端口号4000;00 40表示upd长度为64 字节;71 2a表示udp检验和(这是发送端计算出来的,一会儿在后面计算时还要使用到)。
02 0f ………………96 03-----其余部分为udp数据部分。
下面让我们一起来计算一下检验和。
下图是udp检验和计算过程中使用的各个字段:
udp数据报和tcp报文段在为了计算检验和而设置了一个12字节长的伪首部。由于udp数据报的长度可以为奇数字节,但是检验和算法是把若 干个16 bit字相加,因此可在填充字节字段填入0,可能增加的填充字节不被传送。
因此必须构造12字节的伪首部:db 85 28 25 c0 a8 12 5c 00 11 00 40
构造完毕之后,把udp检验和部分置0,然后对udp每个16 bit进行二进制反码求和,db85+2825+c0a8+125c+0011+0040 + 1f40+0fa0+0040+0000 +……+258b+9603=e8ec7
(0xe8ec7 >> 16) + (0xe8ec7 & 0xffff)=0x8ed5
最后,0x8ed5+0x712a=0xffff
由此可以判断上述udp数据报在传输过程中没有发生差错。
本文出自 51CTO.COM技术博客 |