UDP 协议分析

UDP 全称 User Datagram Protocol,即用户数据报协议,它为调用它的应用程序提供了一种不可靠、无连接的服务。

UDP 无非就是对网络层协议增加了一点(多路)复用/(多路)分解服务而已。

使用 UDP 的上层协议有:

选择使用 UDP 的原因:

  • 关于发送什么数据以及何时发送的应用层控制更为精细。
  • 无须连接建立。
  • 无连接状态。
  • 分组首部开销小。每个 TCP 报文段都有 20 字节的首部开销,而 UDP 仅有 8 字节的开销。

使用 UDP 的应用是可能实现可靠数据传输的,这可通过在应用程序自身中建立可靠性机制来完成。
可参考 KCPQUIC

UDP 报文段结构

UDP 报文段结构如图所示:

UDP 报文段结构

通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程(即执行分解功能)。
长度字段指示了在 UDP 报文段中的字节数(首部加数据)。
接收方使用检验和来检查在该报文段中是否出现了差错。

UDP 检验和

发送方的 UDP 对报文段中的所有 16 比特字的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在 UDP 报文段中的检验和字段。

在接收方,全部的 16 比特字(包括检验和)加在一起。如果和为 1111111111111111,则未引入差错,反之,则已经出现了差错。

在既无法确保逐链路的可靠性,又无法确保内存中的差错检测的情况下,如果端到端数据传输服务要提供差错检测,UDP就必须在端到端基础上在运输层提供差错检测。这是一个在系统设计中被称颂的端到端原则(end-end principle)的例子,该原则表述为因为某种功能(在此时为差错检测)必须基于端到端实现:“在与较高级别提供这些功能的代价相比,在较低级别上设置的功能可能是冗余的或几乎没有价值的。”

虽然 UDP 提供差错检测,但它对差错恢复无能为力。UDP 的某种实现只是丢弃受损的报文段;其他实现是将受损的报文段交给应用程序并给出警告。