无连接运输:UDP
一、UDP特性
运输层的最低限度是必须提供一种复用/分解服务,以便在网络层和正确的应用级进程之间传递数据。UDP就是一种非常简单的协议,在[RFC 768]的定义中,UDP除了复用/分解以及少量差错检测之外,几乎没有做别的东西。UDP从应用进程得到数据,附加上用于复用/分解的源和目的端口号字段,以及两个其他的小字段,然后形成报文段交给网络层。UDP做了非常少的工作,差不多应用进程是直接与IP交互。
不过很多应用更适合使用UDP,主要原因有:
(1)关于发送什么数据以及何时发送的应用层控制更为精细。采用UDP时,只要应用进程将数据传递给UDP,UDP就会将该数据打包进UDP报文段并传递给网络层。而TCP提供可靠传输服务,还有拥塞控制机制和超时重传机制,TCP不管可靠交付需要多长时间,一定要保证目的主机接收并确认。而实时应用通常要求最小的发送速率,且能容忍一些数据的丢失,不希望过分延迟传送,因此这些应用可以使用UDP来作为应用的一部分实现。
(2)无须建立连接。UDP不需要任何准备即可进行数据传输,因此UDP不会引入建立连接的时延(这可能是DNS运行在UDP上的主要原因)。
(3)无连接状态。TCP需要在端系统中维护连接状态,该状态包括缓存、拥塞控制参数以及序号确认序号。而UDP不需要维护连接状态,也不跟踪这些参数,因此UDP占用系统资源更少,能支持更多活跃客户。
(4)分组首部开销小。每个TCP报文段都有20个字节的首部开销,而UDP仅有8字节的开销。
UDP不提供可靠数据传输服务,但是使用UDP的应用是可能实现可靠数据传输的。这可以通过在应用进程自身中建立可靠性机制来完成,如谷歌浏览器中的QUIC协议就是在UDP之上的应用层协议实现了可靠性。这样做可以使应用进程进行可靠通信,而无需受制于TCP的拥塞控制机制带来的传输速率限制。
二、UDP报文段结构
如图2.1,UDP首部只有4个字段,每个字段由两个字节组成。源端口号和目的端口号在复用/分解时被使用;长度字段指示了在UDP报文段中的字节数(首部+数据),因为数据字段的长度在一个UDP段中不同于在其他层封装后的段中,所以需要一个明确长度;接收方使用校验和来检查在该报文段是否出现差错。
图2.1 UDP报文段结构
三、UDP校验和
UDP提供了差错检测功能,具体为发送方的UDP对报文段中的所有16比特字段的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段。
用一个例子说明计算过程,有三个16比特:
最后一次加法有溢出,它要被回卷,其结果进行反码运算后得到(1011010100111101)校验和。在接收方,包括校验和的全部的4个16比特加在一起,若没有出现差错,最后结果将是(1111111111111111)。
UDP提供端到端的差错检测,但不能对差错进行恢复,某些实现是将受损报文段丢弃,其他实现是将受损报文段交给应用程序并给出警告。