2.9.2 UDP

2.9.2 UDP

1.UDP的概述

UDP向应用层提供无连接、不可靠的数据通信服务。端系统使用UDP协议相互通信时,UDP协议只负责将应用程序传给传输层的数据发送出去,但是并不保证它们能到达。如果传输中数据出错,UDP协议不负责重传,而由更高层负责。当数据正确到达后,接收端不负责确认,交由更高层负责。

2.UDP的特点

UDP具有以下几个特性:

(1)UDP信息包的头标很短,只有8个字节,相对于TCP的最小20个字节的头标而言,传输开销很小。

(2)UDP是一个无连接协议,传输数据前发送端和接收端之间不建立连接,也就不需要维护连接状态,因此,一台服务器可同时向多个客户端传输相同的消息。

(3)UDP不能确保接收方有序地接收数据包,也不会验证接收方是否正确收到数据包。

(4)UDP的吞吐量不受拥塞控制算法的调节。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的处理能力和网络传输带宽的限制。网络出现拥塞不会使源主机的发送速率降低。

虽然UDP的可靠性欠佳,但由于它的通信开销比较小,对于一些对可靠性要求不高的应用还是很划算的。另外,由于一些应用软件对实时性的要求比较高,而对可靠性的要求反而不太高,这时UDP就是理想的通信协议。例如视频点播,如果延时较大,或者图像和声音时缓时快,观众就无法接受;而如果播放时偶尔出现一些马赛克,问题倒是不大。

3.UDP协议结构

UDP建立在IP之上,为应用程序提供了一种无须建立连接的数据传输方法。UDP数据报封装在IP数据报中传输,每个UDP报文被称为一个用户数据报,分为UDP头标和UDP数据两部分。详细的报文结构如图2.15所示。

图2.15 UDP的报文结构

(1)源端口(Source Port)。16位的可选字段,指出发送进程的端口以及应答应当送达的端口。如果发送主机不提供源端口,此字段为0。当目标进程必须将一个应答送回发送进程时,源端口就是必需的。

(2)目标端口(Destination Port)。16位的字段,是接收进程的UDP端口。

(3)UDP长度(Length)。包括UDP头标和UDP数据在内的总长度,UDP长度为8位。

(4)UDP校验和(Checksum)。16位的可选字段,用于检验UDP数据包是否存在错误。如果不计算校验和,此字段应当包含一个0值,这样就大大提高了通信效率。

(5)数据(Data)。发送进程要传输的数据。

4.UDP的校验和与伪头标

UDP报文发送端和接收端在进行校验和计算时均加上伪头标。如果接收端发现校验和正确时就可以说明在一定程度上UDP报文到达了正确主机的正确端口上。

UDP校验和的计算方法与IP标头的校验和相同,但进行校验和计算的内容却不一样。IP校验和仅计算IP标头,而UDP的校验和包括伪头标、UDP头标和UDP数据部分的内容。如果数据部分长度不是16位的倍数,则需要在末尾补0,但这些0不会被作为数据的一部分发出去。由于IP不计算数据报数据部分的校验和(IP校验和只涉及IP头标),因此,UDP校验和是确定数据是否正确到达的唯一手段。

UDP伪头标来源于IP头标,因此,在计算UDP校验和之前,UDP必须先从IP层获取相关信息。加上伪头标的UDP报文的具体结构如图2.16所示。

图2.16 UDP校验和计算过程中使用的各个字段结构

伪头标中各字段的定义如下:

(1)源地址(Source IP Address)。IP报头中的发送端IP地址。

(2)目标地址(Target IP Address)。IP报头中的接收端IP地址。

(3)协议(Protocol)。IP报头中的协议类型码,17代表UDP。

(4)UDP长度。指UDP报文长度,包括UDP头标和UDP数据的总长度,不涉及UDP伪头标的长度。

(5)填充字段的目的是在于使伪头标长度为16位的整数倍,用0填充。

在伪头标计算方面,UDP需要从IP层获取信息,这意味着TCP/IP参考模型中,传输层与网际层之间存在一定程度的交互,违反了分层原则。这种违反分层原则的策略并不值得赞赏,但它毕竟是出于实际需要而不得不做的折中。