跳到主要内容

UDP 网络套接字

在网络编程中,除了常见的 TCP 套接字,还有一种更轻量、更灵活的通信方式——UDP 套接字。本篇文章将从理论的角度,带你了解 UDP 协议的原理、特点、通信机制,并帮助你打下使用 UDP 进行网络编程的基础。

UDP 协议简介

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、面向报文的传输层协议,它和 TCP 一样基于 IP 协议工作,但实现方式截然不同。

你可以这样理解:如果 TCP 是一个可靠、面面俱到的快递公司,负责把包裹完好送达;那么 UDP 更像是一个邮筒,把信投进去就完事了,不管收没收到、顺不顺利、有没有顺序。

UDP 的核心特点

特点说明
无连接UDP 发送数据前无需建立连接,不存在三次握手
不可靠UDP 不确认接收、也不重传丢失数据
面向报文每次发送接收都是完整的一个“报文”
速度快、开销小没有连接状态开销、首部仅 8 字节
支持广播/多播UDP 可以方便地进行一对多通信

适合 UDP 的应用场景包括:

  • 实时通信(如语音通话、视频直播)
  • 局域网广播(如局域网设备发现)
  • 小数据量、丢包容忍的应用(如 DNS 查询)

UDP 通信流程原理

和 TCP 不同,UDP 没有连接过程,双方之间的通信更像是互相“扔纸条”。

  • 发送端:只需要准备好目标地址和端口,直接将数据报发送过去。
  • 接收端:监听某个端口,随时准备接收发来的数据报。
注意

虽然 UDP 不需要连接,但在编程中仍需要创建套接字(socket)并设置地址信息。

UDP 报文结构

UDP 报文的首部非常简单,仅 8 个字节,包含以下 4 项内容:

字段长度(字节)说明
源端口2发起方端口号
目标端口2目的地端口号
长度2包括头部和数据总长度
校验和2用于基本错误检测(可为 0)

UDP 不负责分片和重组,这些由 IP 层处理。

UDP 头部

UDP 套接字编程基本流程

虽然本文以理论为主,但你可以先了解一下 UDP 编程的基本 API 流程:

服务端流程:

  1. 创建 socket(使用 SOCK_DGRAM
  2. 使用 bind() 绑定端口
  3. 使用 recvfrom() 接收数据(无需 accept)
  4. 使用 sendto() 回复数据

客户端流程:

  1. 创建 socket
  2. 使用 sendto() 发送数据(直接指定目标地址)
  3. 使用 recvfrom() 接收回应(可选)

UDP vs TCP 对比总结

属性UDPTCP
连接方式无连接面向连接(三次握手)
可靠性不可靠(不重传、不确认)可靠(重传机制)
数据组织面向报文面向字节流
开销小,报头 8 字节大,报头至少 20 字节
传输效率相对较低
应用示例视频直播、DNS、SNMP 等HTTP、FTP、SSH、邮件等

小结

在本文中,你了解了 UDP 协议的基本原理、特点、工作机制以及与 TCP 的区别。虽然 UDP 没有 TCP 那么可靠,但正因其简洁高效,它在许多实时、广播、多播等场景中发挥着不可替代的作用。