UDP 是一个简单的面向数据报的传输层协议: 进程的每个输出操作都正好产生一个UDP 报文,并组装成一份待发送的IP 数据报。UDP 协议不提供可靠性,它把应用程序传给IP 层的数据发送出去,但是并不保证它们能到达目的地。
1.UDP 报文的封装
UDP 报文封装在IP 数据报中,IP 数据报再封装到链路层数据帧中,才可以通过物理线路在网络中进行传送。UDP 报文在IP 数据报中的封装格式如图2-3-23 所示。

图2-3-23 UDP 报文在IP 数据报中的封装格式
2.UDP 报文格式
UDP 报文由UDP 首部和UDP 数据两部分组成,UDP 报文的首部格式如图2-3-24所示。

图2-3-24 UDP 报文的首部格式
UDP 报文的首部有以下结构:
(1)UDP 源端口号: 16 位的源端口号是源计算机的连接号。
(2)UDP 目的端口号: 16 位的目的端口号是目的主机的连接号。
(3)UDP 信息长度: 信息长度域16 位长,指的是UDP 首部和UDP 数据的字节长度。该字段的最小值为8 字节(发送一份0 字节的UDP 报文是可行的)。
(4)UDP 检验和: 检验和是一个16 位的错误检查域,基于报文的内容计算得到。目的计算机执行和源主机上相同的数学计算,若两个计算值不同,则表明报文在传输过程中出现了错误。
3.端口号
UDP 和TCP 采用16 位的端口号来识别应用程序。那么这些端口号是如何选择的呢?
服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP 实现来说,FTP 服务器的TCP 端口号都是21,每个Telnet 服务器的TCP 端口号都是23,每个TFTP (简单文件传送协议)服务器的UDP 端口号都是69,每个DNS 服务器的UDP 端口号都是53。任何TCP/IP 实现所提供的服务都用知名的1 ~1023 的端口号。这些知名端口号由Internet 号分配机构(Internet Assigned Numbers Authority,IANA)来管理。
客户端通常对它所使用的端口号并不关心,只需保证该端口号在本机上是唯一的就可以了。客户端口号又称为临时端口号(即存在时间很短暂)。这是因为它通常只是在用户运行该用户程序时才存在。大多数TCP/IP 实现给临时端口分配1024 ~5000 的端口号。
4.TTCPW 应用软件
为了更好地理解UDP 报文和TCP 报文,可以从网上下载开源软件TTCPW。这个软件可用来发送UDP 数据包和TCP 数据包,可以根据需要发送UDP 报文和TCP 报文。它可以控制发送报文的种类、数量和次数。利用TTCPW 软件,可以根据需要发送不同种类和数量的报文。
接下来,简单介绍TTCPW 软件的用法。首先,在发送端和接收端安装TTCPW;然后,根据发送端和接收端的不同,配置不同的参数,如图2-3-25 所示。

图2-3-25 配置TTCPW 各种参数
其中:
●ttcp-r-s: 进入接收模式。
●ttcp-t-s: 进入发送模式。
●-l ##: 发送或接收数据的大小,缺省是8192。
●-u: 发送UDP 数据,缺省是TCP 数据。
●-p ##: 发送端口号,接收端口是5001。
●-n: 发送数据的次数,缺省是2048。
如果想发送长度为1000 字节的UDP 报文,那么在发送端,就用“ttcp-t-s-u-l1000 192.168.1.170”命令发送,命令中的IP 地址是接收端的IP 地址。在接收端,用“ttcp-r-s-u”命令接收。
在使用ttcpw 应用程序时,应先接收后发送,中间间隔时间2 秒左右。
我们可利用ttcpw 控制发报的类型和大小,以此验证IP 地址分片的情况。在命令行中输入命令“ttcp-t-s-u-l1472 192.168.1.170”,向IP 地址为192.168.1.170 的计算机发送大小为1472 字节的UDP 报文。这时,在IP 地址为192.168.1.170 的计算机上看到的UDP报文如图2-3-26 所示。

图2-3-26 发送大小为1472 字节的UDP 报文
将发报的大小改为1473 字节,即在发送端输入命令“ttcp-t-s-u-l1473 192.168.1.170”,在接收计算机上仍然使用“ttcp-r-s-u”命令接收。这时,在IP 地址为192.168.1.170 的计算机上看到的报文如图2-3-27 所示。

图2-3-27 发送大小为1473 字节的UDP 报文(https://www.xing528.com)
从图2-3-27 中可以看出,UDP 数据包分片了,因为UDP 首部占8 字节,所示UDP报文只要大小超过1472 (即1480-8 =1472)字节就会分片,这也证明IP 数据是在第1480字节开始分片的理论值。利用ttcpw 应用程序,可以验证UDP 和TCP 的一些理论知识。
5.实例分析
图2-3-28 所示是Wireshark 抓取的一条UDP 数据包,接下来分析具体的UDP 报文的封装和数据格式。

图2-3-28 UDP 协议的报文实例
该数据帧共74 字节,前14 字节是以太网数据帧的首部,接着的20 字节是IP 数据报首部。观察IP 数据报首部的第10 字节,即协议字段,其数据值为“11”,对应的十进制数为17,表明IP 数据报里封装的是UDP 报文。
在IP 数据报首部后面紧接的就是8 字节的UDP 首部:
第1、2 字节是源端口号,其数据值为“d6 7f”,转换成十进制数为54911,表明源端口号为54911。
第3、4 字节是目的端口号,其数据值为“00 35”,转换成十进制数为53,表明目的端口号为53。UDP 的53 号端口是众所周知的DNS 服务,因此该UDP 报文里封装的是DNS 报文,是向DNS 服务器请求DNS 服务的。
第5、6 字节是数据长度字段,值为“00 24”,转换成十进制数为36,表明该UDP 报文总的长度为40 字节,其中封装的DNS 数据长度为32 字节。
第7、8 字节是检验和字段,值为“95 8c”,经计算,确认数据正确。
6.UDP 检验和
用Wireshark 抓取的UDP 报文如图2-3-29 所示,由此可知UDP 的检验和是“24 24”。

图2-3-29 用Wireshark 抓取的UDP 报文
UDP 一共只有8 字节,最后2 字节是它的检验和。UDP 检验和的算法如下:
校验和不仅包含整个UDP 报文,还覆盖一个虚头部,即IP 伪首部(12 字节)。它们包括:
源IP 地址(4 字节): c0 a8 0a 06。
目的IP 地址(4 字节): c0 a8 0a 05。
协议(2 字节): 00 11 (UDP 协议)。
UDP 包长(2 字节): 00 0c。
(1)依次累加:
c0a8 +0a06 +c0a8 +0a05 +0011 +000c +f088 +1389 +000c +
0000 (检验和,预置0)+2021 (数据)+2223 (数据)=2dbd9
(2)将溢出的2 和低位数据dbd9 进行相加:
dbd9 +2 =dbdb
(3)用ffff 减法算出的结果:
ffff-dbdb =2424
计算结果和报文中的结果一样,都是2424,说明数据正确地传输到了目的地。
7.UDP 协议探讨
UDP 协议属于传输层协议,在它的下层有IP 协议,在它的上层有各种服务程序。在TCP/IP 协议中,传输层只有两个协议负责传送数据,其中的一个就是UDP 协议,它的主要功能就是传送数据。UDP 协议有以下特点:
(1)UDP 协议是无连接的协议。可能很多人会疑问,既然没有连接,怎么传送数据呢?需要说明的是,这里所说的无连接是指针对UDP 协议不建立专门的连接链路,也就是在UDP 协议中,没有监管连接的参数。
(2)UDP 协议不提供可靠性,它几乎直接把应用层数据传递给IP 层,通过IP 协议将数据传递出去,UDP 协议不保证数据可以到达目的地。
(3)UDP 协议是一个简单的用户传输协议,因为它的协议内容非常简单,只有8 字节。由于简单UDP 协议无须建立连接,无须维持连接状态,更无须断开连接,所以它的分组首部开销小。UDP 协议没有控制网络拥塞的功能。
(4)由于UDP 协议是简单的用户传输协议,所以在UDP 协议上只传送一些小的应用层协议。这些协议如表2-3-2 所示。
表2-3-2 通常在UDP 上传输的协议

UDP 协议非常适合流媒体传输。例如,在听音乐的时,如果有一个音符没听清还可以接受,如果把没听清的音符重复一遍就不可以接受了,因为节奏不对了。同样,在因特网电话里,通话时一个字没听清可以接受,但是重复一句话就会让人难以接受。所以,遇到不同的问题选择不同的协议是解决问题的关键。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
