目录
一、UDP 协议概述
1.1 UDP 协议简介
UDP(User Datagram Protocol,用户数据报协议)是位于 传输层 的通信协议,是 TCP 的“轻量级”补充方案。UDP 提供了一种无连接、不可靠、面向报文的传输方式,具有结构简单、开销小、效率高的特点。
📌UDP 的核心特性:
无连接:发送数据前不建立连接,数据发送后不关心是否到达。
面向报文:每次发送的是一个完整的数据报(Datagram),是天然的“消息边界”传输方式。
不可靠传输:不提供重传、重排、流量控制等机制。若数据在传输中丢失、重复或乱序,UDP 不负责处理。
无状态:发送方与接收方均不记录任何传输状态,因此服务器资源占用极低,适合高并发。
传输速度快:因为没有握手、重传、拥塞控制等机制,UDP 拥有极低延迟,适用于对实时性要求极高的应用。
📡UDP 的附加能力:
单播:一对一通信,与 TCP 相同。
多播:又称组播,可向一组特定主机发送数据,节省带宽。发送方向一个组播IP地址(224.0.0.0 ~ 239.255.255.255范围内)发送数据报,所有加入该组播组的成员都能接收到该数据。类似于QQ群的聊天消息广播
广播:可向局域网内所有主机发送数据报,与组播不同,广播是发送到一个特殊的广播地址(一般是255.255.255.255),常用于局域网广播消息推送
1.2 无连接通信的定义与特性
1.2.1 什么是无连接?
无连接通信是指在发送数据之前,通信双方不需要建立专门的连接通道。数据以数据报的形式独立发送,每个数据报是独立的实体,彼此之间没有依赖关系,也不保证顺序。
发送方直接将数据报发送到目标地址。
接收方在指定端口等待数据报到达。
无需进行握手或建立会话。
1.2.2 无连接带来的影响
优点 | 缺点 |
---|---|
- 开销小,速度快 | - 不保证数据可靠性 |
- 无需连接建立,延迟低 | - 不保证数据顺序 |
- 适合实时通信场景 | - 数据包可能丢失、重复或损坏 |
1.3 UDP 的典型应用场景
视频/语音流媒体:强调实时性,允许少量丢包。
在线游戏:及时传输玩家动作信息,丢包时通常不重传。
实时传感器数据:传感器周期性发送状态,容忍少量丢失。
二、UDP 报文段结构解析
2.1 UDP 报文格式
UDP协议的报文格式相对简单,整个UDP报文由首部和数据组成,首部固定八字节。
定义 | 解释 |
Source Port(源端口) | 用于标识发送方的端口。 |
Destination Port(目标端口) | 用于标识接收方的端口。 |
Length(长度) | 表示整个 UDP 报文(首部 + 数据)的长度。 |
Checksum(校验和) | 用于检验数据完整性(IPv4 可选,IPv6 必须) |
data octets(数据) | 传输数据(可变) |
2.2 报文结构对比
字段 | TCP 有 | UDP 有 | 区别 |
---|---|---|---|
端口号 | ✅ | ✅ | 相同 |
校验和 | ✅ | ✅ | TCP 校验更严格 |
长度字段 | ❌ | ✅ | TCP 无需长度字段,长度靠序列号控制 |
序列号/ACK | ✅ | ❌ | UDP 无可靠性机制 |
控制标志位 | ✅ | ❌ | UDP 不支持状态管理 |
窗口大小 | ✅ | ❌ | TCP支持流量控制 |
三、UDP 的传输特性与差错控制机制
3.1 UDP 的“尽力而为”服务
✅ 定义:UDP 提供无连接的传输服务,表现为:
不保证数据一定送达(可能丢失)
不保证接收顺序(可能乱序)
✅ 过程描述:
UDP应用层将数据交给传输层(UDP协议)
UDP协议直接将数据封装为UDP报文段,交给IP层
不与目标主机建立连接(无需握手,开销小)
IP层负责将报文传送到目标主机,途中可能丢失、乱序、重复
UDP不会主动监控数据的发送结果
不会自动重传(可能漏包)
3.2 差错检测机制:校验和
尽管UDP不保证可靠传输,但它提供基本的差错检测能力,通过校验和字段(Checksum)。🔸校验和覆盖范围
UDP 校验和不仅覆盖 UDP 报文本身,还包括 伪首部(pseudo-header)。
包含内容 说明 UDP头部 + 数据 正文部分,主要用于校验实际传输数据 伪首部(伪IP头部信息) 源IP地址、目标IP地址、协议号、UDP长度等
⚠️ 伪首部不是实际发送内容,仅用于校验和计算过程中,确保目的地正确。
🔸校验和的作用:
校验整个UDP数据包是否被篡改、损坏,在IPv6中是强制要求的,在IPv4中是可选的。🔸校验和失败会怎样?
如果校验和错误,接收方会直接丢弃该UDP包,不通知发送方
3.3 UDP 与 TCP 差错控制对比
特性 | UDP | TCP |
---|---|---|
校验机制 | 提供校验和,检错但不纠错 | 提供校验和,结合确认/重传机制实现纠错 |
伪首部参与校验 | 是 | 是 |
丢包处理 | 丢弃,不通知发送方 | 自动重传,确保数据可靠到达 |
顺序控制 | 无 | 通过序列号实现严格有序 |
差错后数据恢复机制 | 无(应用层处理) | 有(内建重传和流控) |
四、UDP 的使用注意事项与优化
4.1 粘包/拆包问题
✅ UDP 不存在粘包问题:UDP 是面向报文的协议,天然分隔每个报文段
每次
sendto()
/recvfrom()
调用,对应一个完整的 UDP 报文段;一个
recvfrom()
调用只会收到一个完整的数据报,不会读取多个报文,也不会截断部分报文。
⚠️ 应用层可能会出现“拆包”风险:虽然 UDP 不粘包,但若发送数据过大,超出MTU时,网络层层可能发生分片,带来以下问题:
IP层的分片重组过程
问题 描述 分片传输 IP 层自动将 UDP 报文分成多个 IP 包发送 丢一个分片即丢包 任一分片丢失,整个 UDP 报文都被丢弃 接收方重组负担大 接收方 IP 层需缓存、重组,增加开销 MTU 是数据链路层的属性
定义:MTU 指的是数据链路层协议帧(如以太网帧)中能够承载的最大有效负载(不包括链路层报头)的大小,单位一般为字节(Bytes)。
例如,标准以太网的 MTU 是 1500 字节,这意味着一帧的最大有效载荷不能超过1500字节。
网络层和 MTU
网络层(IP层)负责跨多条链路传输数据包,IP数据包的大小受到沿途每条链路的 MTU 限制。
网络层协议(如 IPv4)必须考虑链路层 MTU,若 IP 数据包大于某条链路的 MTU,就必须分片或进行路径MTU发现。
IP层的最大报文长度(Total Length)理论上最大可达 65535 字节,但在传输时受 MTU 限制必须拆分。
4.2 UDP 的可靠性增强手段
QUIC 是 Google 提出的新一代传输协议,运行在 UDP 之上,但具有类 TCP 的可靠性保障:
带有连接管理
支持重传和拥塞控制
多路复用,避免 TCP 的队头阻塞
被广泛应用于 HTTP/3