用户数据报协议(UDP)

概述

用户数据报协议UDP只在网际协议IP的基础上增加了复用/分用功能和差错检测功能,为网络用户提供高效率的数据传输服务。

UDP具有以下主要特点:

UDP是无连接的,没有建立连接和释放连接的过程。

UDP只能尽最大努力交付,提供不可靠的传输服务。对于出现差错的报文进行丢弃处理。

UDP是面向报文的,与应用层交付的是完整的报文,既不合并,也不拆分,保留原始报文的边界。因此,应用层必须选择合适的报文长度,以免在IP层进行分片工作,从而降低IP层的效率。

UDP没有拥塞控制的功能。即使网络出现拥塞也不会使源主机降低发送速率,宁愿丢失数据,也不允许传送的数据存在较大的时延,这正适合实时应用(如IP电话、实时视频会议)的需要。

UDP首部简短,只有8字节,减少了通信开销。

虽然某些应用需要使用没有拥塞控制的UDP,但对于某些实时应用(如高速实时视频流),因使用无拥塞功能的UDP可能会引起网络的严重拥塞,而使用户无法正常接收。另外,还有一些实时应用要求减少数据的丢失,这就需要对UDP的不可靠的传输进行适当的改进,如采用前向纠错或重传等措施。

UDP协议适用于发送短报文又不关心可靠性的场合。例如,在客户/服务器情况下,客户向服务器发送一个短的请求,并期望得到一个短的应答。如请求或应答丢失的话,客户会因超时而重传,其开销就比建立和释放连接的开销要小得多。应用层的DNSRIPSNMP等协议都使用UDPUDP也适用于具有流量控制和差错控制机制的应用层协议,如简单文件传送协议TFTP

报文的格式

UDP报文又称用户数据报,由首部和数据字段两部分组成。其格式如下图所示。

image

首部字段由4个字段组成,共8字节。各字段的含义如下:

  • (1)源端口(16位)。这是源主机上运行的进程使用的端口号。在多数情况下,若源主机是客户端(即客户进程发送请求时),这个端口就是临时端口号;若源主机是服务器(当服务器进程发送响应时),这个端口号就是熟知端口号。
  • (2)目的端口(16位)。这是目的主机上运行的进程使用的端口号。在多数情况下,若目的主机是服务器端(当客户进程发送请求时),这个端口号是熟知端口号;若目的主机是客户端(当服务器进程发送响应时),这个端口号是临时端口号。
  • (3)长度(16位)。指明包括首部在内的UDP报文的总长度(包括首部和数据,以字节为单位),其最小值为8。该字段的作用只是便于目的端的UDP从用户数据报提供的信息中计算出数据长度。
  • (4)检验和(16位)。用于检验UDP报文在传输中是否存在差错。检验和的检验范围是整个UDP报文(包括首部和数据)。必须指出,UDP检验和的计算与IP和ICMP检验和的计算不同。这里的检验和包括3部分:伪首部、UDP首部以及来自应用层的数据。在计算检验和时,在UDP报文之前要增加一个伪首部(12字节),它作为IP分组首部的一部分。伪首部有5个字段:前两个字段分别为源IP地址(4字节)和目的IP地址(4字节),第3字段(1字节)为全零,第4字段(1字节)为协议值(UDP=17),第5字段(2字节)是UDP报文长度。所谓“伪首部”是因为它并不是UDP报文的真正首部,它只是在计算检验和时,临时性地与UDP报文拼接在一起,构成一个临时性的UDP报文。

UDP检验和的具体计算方法与计算IP数据报首部检验和的方法相似。所不同的是UDP的检验和是把首部和数据部分一起检验的。检验和的具体计算过程是:

在发送端,

①把伪首部添加到UDP用户数据报上;

②把检验和字段置为全零;

③把伪首部以及UDP用户数据报的所有位划分为16位(2字节)的字,若字节总数不是偶数,则要填充一个全零字节(此填充字节只是用于计算检验和);

④把所有16位的字,按二进制反码算术运算求和;

⑤将得到的结果取反码写入检验和字段;

⑥把伪首部和填充字节丢弃;

⑦最后把UDP数据报交付给IP软件进行封装。

在接收端,①把伪首部加到接收到的UDP用户数据报上;②若需要,应添加全零的填充字节;③把所有位划分为16位(2字节)的字;④把所有16位的字按二进制反码算术运算求和,并取其反码;⑤若得到的结果是全1,表示无传输差错,则丢弃伪首部和填充字节(如有的话),接收此用户数据报。否则就表明有差错存在,应丢弃此用户数据报(也可上交应用层,并附上出现差错的警告)。

下图表示UDP用户数据报检验和的计算举例。

image