UDP协议

UDP(User Datagram Protocol,用户数据报协议)是一个无连接的传输层协议,提供简单的报文传输服务。它不保证数据包的可靠性、顺序或完整性,因此适用于对速度要求高而对可靠性要求低的应用场景,如视频流、在线游戏等。具有以下特定:

  • 无连接:不存在建立连接需要的时延和开销。
  • 不可靠:数据包可能丢失、重复或乱序,不提供重传机制,无拥塞控制,需要由应用层处理。
  • 面向报文:对应用层交下来的数据,既不合并,也不拆分,保留数据的边界,添加UDP头部后直接交给IP层;对IP层给上来的数据,去除UDP头部后,也原封不动的交给应用层。所以UDP报文不能控制读写数据的次数和长度。
  • 轻量:UDP头部开销只有8字节。
  • 支持一对一、一对多、多对一、多对多通信。

    UDP Header

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     Source      |   Destination   |
|      Port       |      Port       |
+--------+--------+--------+--------+
|                 |                 |
|     Length      |    Checksum     |
+--------+--------+--------+--------+
|
|          data octets ...
+---------------- ...

字段说明

  • 源端口号:2字节,需要对方回复时使用,不需要时可用全0填充。
  • 目的端口号:2字节,必填。
  • 长度:2字节,UDP头部和数据的总长度,最小为8字节(仅有UDP头,无payload)。
  • 校验和:2字节,校验UDP头和数据的完整性,如果不需要校验则可用全0填充。

checksum计算

在计算checksum时,引入伪首部(pseudo header),伪首部不是UDP真正的首部,既不向下传送也不向上递交,只用于计算checksum。伪首部共12字节,格式如下:

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|         source IP address         |
+--------+--------+--------+--------+
|       destination IP address      |
+--------+--------+--------+--------+
|  zero  |protocol|   UDP length    |
+--------+--------+--------+--------+
  • source IP address:源IP地址,4字节。
  • destination IP address:目的IP地址,4字节。
  • zero:1字节,固定为全0。
  • protocol:1字节,固定为17(UDP协议号)。
  • UDP length: 2字节,UDP头部和数据的总长度。

UDP checksum计算步骤:

  1. 将伪首部、UDP头部和数据拼接成一个大的数据块。
    • 如果UDP数据部分长度不是偶数个字节,则需则数据末尾填入1个全0字节(该字节不发送,只用于计算checksum)。
    • 将checksum字段置为0。
  2. 将数据块按16 bit分组,进行求和。
  3. 如果出现溢出,产生了进位,则需将高16 bit加到低16 bit上。
  4. 如果求和结果为全0,则将其置为全1(全0代表不计算校验和)。
  5. 对求和结果按二进制取反码,将这个值,写入checksum字段。

接收端校验时,把收到的UDP数据报加上伪首部(如果不为偶数个字节,那么还需要补上全零字节)后,按二进制反码计算出这些16 bit的和。当无差错时其结果应全为1。