UDP 仅仅在网络层的 IP 服务上额外增加了两个功能:
- multiplexing/demultiplexing
- 错误校验
UDP 从应用程序中获取要发送的信息,附加上源 port 和目标 port 以及两个其他的信息,就传递给网络层。网络层将其封装为 IP 数据包,然后尽最大努力发送给目标主机,如果对方收到,UDP 会使用目标端口号将数据发送给对应的应用程序。
DNS 就是一个使用 UDP 作为传输层协议的典型应用。选择使用 UDP 而不是 TCP 的好处是:
-
更好地控制发送什么数据,以及什么时候发送
- TCP 因为有拥塞控制,网络状况不好时会降低发送速率。而 UDP 都是立即发送。
- TCP 在收到确认之前会不断重发数据,无论这个确认需要多久。然而,许多实时应用要求最低发送速度,但是允许一定程度的丢包。因此 UDP 更合适
-
无需建立连接
- TCP 在发送数据前需要进行三次握手建立连接,这引入了延迟。这也是 DNS 服务选择使用 UDP 的首要原因。
- TCP 需要维护连接状态,对服务器引入了额外的负担。
-
额外的数据包头开销
- TCP 的包头是 20 字节,而 UDP 只有 8 字节。
3.3.1 UDP Segment Structure
UDP 数据包的结构如下图所示:
UDP segment structureField | Size (byte) | Meaning |
---|---|---|
Source Port | 2 | 源端口 |
Destination Port | 2 | 目的端口 |
Length | 2 | UDP 数据包大小(以字节为单位,包括头文件) |
Checksum | 2 | 校验和,接收方发现错误后会丢弃这个数据包 |
3.3.2 UDP Checksum
UDP 校验和用于判断 UDP 数据包在传输过程中是否被更改了(例如,因为链路上的噪声)。
虽然许多链路层的协议(包括 Ethernet)提供了错误校验,但是链路层并没有保证所有协议都有错误校验。因此,我们需要传输层实现。这也符合系统设计中的 end-end 原则。即在终端中校验错误。
虽然 UDP 提供错误校验,但是它并不负责从错误中恢复。要么丢掉这个包,要么带着警告传给应用层。
网友评论