UDP 只是做了传输协议能够做的最少工作。除了多路复用/多路分解功能及少量的差错 检测外,它几乎没有对 IP 增加别的东西。
UDP 从应用进程得到数据,附加上多路复用/多路分解服务所需的源端口号和目的端口 号字段,及两个其他的小字段,然后将形成的报文段交给网络层。
网络层将该传输层报文段封装到一个 IP 数据报中,然后尽力而为地将此数据报交付给 接收主机。
如果该报文段到达接收主机,则 UDP 使用目的端口号来将报文段中的数据交付给正确 的应用进程。
使用 UDP时,在发送报文段之前,发送方和接收方的传输层实体之间没有进行握手。 因此,UDP被称为无连接的。
DNS是一个通常使用 UDP 的应用层协议的例子。
当主机中的 DNS 客户端要进行一次查询时,它构造了一个 DNS 查询消息并将其交给 UDP。 无须与目的端系统握手,主机端的 UDP 为此报文添加首部字段,然后将形成的报文段交给网络层。网络层将此 UDP 报文段封装进一个 IP 数据报中,然后将其发送给一个 DNS 服务器。 查询主机中的 DNS 客户端便等待对该查询的响应。如果它没有收到响应,则要么试着向另一个名字服务器发送该查询,要么通知调用的应用程序它不能获得响应。
使用 UDP 主要有以下原因:
.应用层能更好地技制要发送的数据和发送时间。实时应用通常要求最快的发送速率, 不想过分地延迟报文段的传送,且能容忍一些数据丢失,而 TCP 服务模型并不是特别适合这 些应用的需求。
.无需连接建立。TCP 在开始数据传输之前要经过三次握手。UDP 却不需要任何淮备即 可进行数据传输。因此 UDP 不会引入建立连接的时延。
.无连接状态。TCP 需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、 拥塞控制参数、序号与确认号的参数。UDP 不维护连接状态,也不跟踪这些参数。
.分组首部开梢小。每个 TCP 报文段都有 20 字节的首部开销,而 UDP 仅有 8 字节的开 销。
因此电子邮件、远程终端访问、Web 及文件传输都是运行在 TCP 之上。因为所有这些 应用都需要 TCP 的可靠数据传输服务。然而,有很多重要的应用是运行在 UDP 上而不是 TCP 上。UDP 被用于 RIP 选路表的更新,因为 RIP 更新被周期性地发送(通常每 5 分钟一次),以 便丢失的更新能被最近的更新所替代,因此更新丢失或过时的 RIP 是毫无意义的。UDP 也用 于承载网络管理数据(SNMP)。DNS 运行在 UDP 之上,避免了TCP 的连接创建时延。
但是可通过在应用程序自身中建立可靠性机制来完成 UDP 的可靠数据传输,例如一些 音视频客户端程序。
1 UDP 报文段结构
UDP 首部只有 4 个字段,源和目的端口号、长度和校验和,每个字段由两个字节组成。 通过目的端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程(即执 行多路分解功能)。而在返回消息时使用源端口号。 接收主机使用校验和来检查报文段中是否存在差错。 长度字段指明了包括首部在内的 UDP 报文段长度(以字节为单位)。
2 校验和
校验和提供了差错检测功能,即当 UDP 报文段从源到达目的时,校验和用于确定其中 的比特是否发生了改变(例如,由千链路中或者路由器中存储数据时的噪声干扰)。
校验和的计算:发送方的 UDP 对报文段中的所有 16 比特字的和进行反码运算,求和时 遇到的任何溢出都被回卷。得到的结果放在 UDP 报文段中的校验和字段。
在接收方,全部的 3 个 16 比特字(包括校验和)一起相加。如果分组中无差错,则显然 在接收方这个和将是 1111 1111 1111 1111。如果有 1 个比特是 0,那么我们就知道分组中出现了差错。