【Linux】传输层协议UDP

本文主题内容

  • 理解传输层与端口号
  • 掌握 UDP 报头格式
  • 理解 UDP 的封装与分用
  • 理解 UDP 校验和
  • 理解 UDP 缓冲区和数据报边界
  • 分析 UDP 的特点与适用场景
  • 理解 UDP 与 MTU 的关系

引言:UDP 报头只有 8 字节,协议机制简单,但它依然完成了传输层最核心的任务:通过端口号把数据从一台主机中的进程交付给另一台主机中的进程。

一、传输层与端口号

1.1 传输层的作用

网络层负责把 IP 数据报送到目标主机,传输层继续解决进程到进程的交付问题。

接收端根据 IP 报头中的协议字段选择 TCP 或 UDP,再根据传输层目的端口把数据交给对应 Socket。

1.2 端口号范围

端口号是 16 位无符号整数,范围为 0 到 65535。

常见划分:

  • 0 到 1023:系统端口或知名端口
  • 1024 到 49151:注册端口
  • 49152 到 65535:常用动态或临时端口范围

具体临时端口范围由操作系统配置决定,不能简单假设所有系统都完全相同。

一条 UDP 通信关系可以用五元组描述:

text 复制代码
源IP、源端口、目的IP、目的端口、UDP

二、UDP 报头

UDP 报头固定为 8 字节,包含四个 16 位字段:

字段 作用
源端口 标识发送进程,可以为 0
目的端口 标识接收进程
UDP 长度 UDP 报头与数据总长度
校验和 检查报文在传输中是否损坏

2.1 UDP 长度

UDP 长度字段只有 16 位,理论上 UDP 报文总长度最大为 65535 字节。但实际网络还受到 IP 报头、链路 MTU、系统缓冲区和应用协议限制。

工程中通常不发送接近理论上限的数据报。

2.2 校验和

UDP 校验和计算时不仅包含 UDP 报头和数据,还包含由源 IP、目的 IP、协议号和 UDP 长度组成的伪首部。

伪首部不会真正发送,它用于发现数据报是否被错误地交付到其他主机或协议。

IPv4 中 UDP 校验和可以为 0,表示不使用;IPv6 中 UDP 校验和通常是必须的。

UDP 报头虽然简单,但端口号负责进程分用,长度负责报文边界,校验和负责基本差错检测。

三、UDP 的封装与分用

3.1 发送过程

应用调用 sendto 后:

  1. 内核根据 Socket 确定源端口
  2. 根据目标地址填写目的端口
  3. 添加 UDP 报头
  4. 把完整 UDP 数据报交给 IP 层
  5. IP 层继续添加 IP 报头并路由

3.2 接收过程

接收端 IP 层根据协议号 17 把有效载荷交给 UDP。UDP 校验报文后,根据目的端口查找对应 Socket,并把完整数据报放入接收队列。

如果没有进程监听该端口,主机可能返回 ICMP Port Unreachable,但应用是否立即感知取决于 Socket 使用方式和系统实现。

四、UDP 缓冲区

4.1 接收缓冲区

UDP Socket 具有接收缓冲区,用于保存到达的数据报。

它具有以下特点:

  • 保留数据报边界
  • 缓冲区满后,新到达的数据报可能被丢弃
  • UDP 本身不会通过重传恢复丢失数据
  • 网络到达顺序不一定等于发送顺序

4.2 发送路径

常说 UDP 没有像 TCP 那样用于可靠重传的发送缓冲区。调用 sendto 时,内核会接收一份完整数据报并交给下层发送;成功返回只表示数据已经被本机协议栈接受,不表示对端已收到。

如果本机发送资源暂时不足,阻塞 Socket 可能等待,非阻塞 Socket 可能返回 EAGAIN

五、UDP 的数据报特性

5.1 保留消息边界

一次应用发送对应一个 UDP 数据报。接收端不会得到半个数据报再等待下一次拼接:

  • 缓冲区足够大,读取完整数据报
  • 缓冲区太小,超出部分被截断

可以使用 recvmsg 配合 MSG_TRUNC 观察实际数据报长度。

5.2 无连接

UDP 不需要三次握手,发送前不维护 TCP 那样的连接状态。但应用仍然可以对 UDP Socket 调用 connect

  • 固定默认对端
  • 后续可以使用 sendrecv
  • 内核可以过滤非该对端的数据报
  • 异步网络错误更容易反馈给 Socket

这不会把 UDP 变成可靠协议。

5.3 全双工

同一个 UDP Socket 可以同时发送和接收数据。无连接只表示协议不建立 TCP 式连接,不表示只能单向通信。

六、UDP 与 IP 分片

以太网常见 MTU 为 1500 字节。IPv4 不带选项时:

text 复制代码
1500 - 20字节IP报头 - 8字节UDP报头 = 1472字节UDP数据

超过路径 MTU 的 IPv4 数据报可能被分片。任意一个分片丢失,接收端就无法重组整个数据报。

因此大 UDP 数据报的问题包括:

  • 分片数量增加,整体丢失概率上升
  • 路由器和接收端重组开销增加
  • 部分网络设备会丢弃分片
  • IPv6 路由器不会替发送方进行分片

注意:1472 只是在常见以太网、IPv4 无选项条件下的结果,不是所有网络中的固定安全值。应用应考虑路径 MTU,并给协议预留额外空间。

七、UDP 的优点与缺点

7.1 优点

  • 报头小
  • 无握手,启动延迟低
  • 保留消息边界
  • 支持广播和组播
  • 应用可以自行设计可靠性和时延策略

7.2 缺点

  • 不保证到达
  • 不保证顺序
  • 不自动去重
  • 不提供 TCP 式流量控制和拥塞控制
  • 过大数据报容易触发 IP 分片

八、适用场景

常见 UDP 应用包括:

  • DNS 查询
  • 实时音视频
  • 在线游戏状态同步
  • 局域网发现
  • 监控和日志上报
  • QUIC 的底层承载

实时业务经常宁可丢弃过期数据,也不愿等待重传;可靠业务也可以在 UDP 上实现序号、确认、重传和拥塞控制,但实现成本很高。

九、总结

UDP 通过源端口和目的端口完成进程到进程交付,固定 8 字节报头包含长度和校验和。协议保留数据报边界,不建立连接,也不保证可靠性、顺序和去重。

UDP 接收缓冲区按数据报排队,缓冲区溢出时可能直接丢包。应用应控制单个数据报大小,避免不必要的 IP 分片,并根据业务需要自行设计超时、序号和重传机制。

UDP 的价值不只是简单和快,而是把可靠性、实时性与重传策略的选择权交给应用层。

相关推荐
Csxyzj21 分钟前
基于Linux+Docker NAT的Ollama多实例负载均衡部署
运维·docker·容器
流光D26 分钟前
AI时代,搭建 web 站点并配置 nginx 反向代理流程
运维·服务器·前端·人工智能·nginx·ai·ai编程
GreatVicent29 分钟前
AI Agent互操作标准化加速:A2A协议正式加入Linux基金会
linux·运维·人工智能·agent·aws·a2a
奇树谦1 小时前
Seaweed中filer.sync原理
linux·服务器·网络
Huangjin007_1 小时前
【Linux 系统篇(十六)】进程(四) : 僵尸进程、孤儿进程、进程优先级
linux·运维·服务器
cui_hao_nan1 小时前
Git常用命令1
运维·git
瞬间&永恒~1 小时前
【Kubernetes】(十五)维护与升级、ETCD 备份和恢复
linux·运维·docker·云原生·kubernetes
SKH.1 小时前
网络(2)UDP通信
网络·单片机·udp
susplus1 小时前
【linux应用软件编程】进程间的通信方式2【网络通信从入门到UDP编程】
linux·udp·ip