一、UDP概述

UDP是工作在OSI(开放系统互连,Open Systems Interconnection)模型中传输层的协议。它使用IP作为底层协议,是为应用程序提供一种以最少的协议机制向其他程序发送消息的协议。其主要特点是无连接,不保证可靠传输和面向报文。

二、UDP数据报

UDP 报文分为头部和数据两个部分。其中,头部只有 4 个字段:

  • 源端口( source port ):发送方的端口号;
  • 目的端口( destination port ):接收方的端口号;
  • 报文长度( length ):即整个 UDP 报文的长度,包括头部和数据,单位为 字节 。
  • 检验和( checksum );

UDP 报文需要借助 IP 协议提供的主机通信能力,作为数据搭载在 IP 包中发往目标主机:

长度

由于报文长度字段为 16 字节,因此 UDP 报文理论上可以达到 2^16 ,也就是 65535 字节。除去头部,UDP 包最多可以承载的数据量是: 2^16−8 ,也就是 65527 字节。

但 UDP 报文需要作为数据,搭载在 IP 包中进行网际通信。因此,UDP 报文大小最多也就是 IP 包的最大长度 65535 字节。换句话讲,UDP 报文长度不可能超过 65535−20−8 ,也就是 65507 字节。其中,20 是 IP 包头部的最小长度。

三、UDP校验和计算
        UDP的校验和需要计算UDP首部加数据荷载部分,但也需要加上UDP伪首部。这个伪首部指,源地址、目的地址、UDP数据长度、协议类型(0x11),协议类型就一个字节,但需要补一个字节的0x0,构成12个字节。伪首部+UDP首部+数据一起计算校验和。

UDP检验和的计算方法是:

        1.把伪首部添加到UDP上;

        2.计算初始时是需要将检验和字段添零的;

        3.把所有位划分为16位(2字节)的字

        4.把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C

        5.将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。

四、校验和计算例子

以上为Wireshark捕获结果

根据RFC768文档校验和=(报文伪首部+UDP报文头+数据段)取反

伪首部 = 源IP + 目标IP  + 0 报文类型)+UDP报文长度 = (192.168.1.108) + (192.168.1.1) + 17 + 39 =0xc0a8 + 0x016c + 0xc0a8 + 0x0101 + 0x0011 + 0x0027

UDP首部 = 源端口 + 目的端口 + UDP报文长度 = 57499 + 53 + 39=0xe09b + 0x0035 + 0x0027

(直接用进制转换器将所有十进制数转换为十六进制数)

数据段 = 1a e9 01 00 00 01 00 00 00 00 00 00 03 61 64 61 05 62 61 69 64 75 03 63 6f 6d 00 00 01 00 01 (1ae9010000010000000000000361646105626169647503636f6d0000010001)

= 0x1ae9 0x0100 0x0001 0x0000 0x0000 0x0000 0x0361 0x6461 0x0562 0x6169 0x6475 0x0363 0x6f6d 0x0000 0x0100 0x0100(每两个一组,最后剩下01,补上00得到0x0100

编写计算UDP Checksum的python代码,并将上面所有的16进制数字填到data中,如下图所示:

###代码注释

#其中 cksum >> 16 将校验和右移16位,即将进位值带到了最低的16位。

#将进位值加到cksum上,确保了所有16位的溢出都被正确地累加到了校验和中。

cksum& 0xffff 确保结果是一个16位的值。如果相加的结果超过了16位(即超过了65535),那么只有最低的16位被保留,这相当于对结果进行了模65536的操作。

最终运行计算得到checksum的结果应为0xd753。

---------------------------------------仅整理复盘用-----------------------------

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐