1. UDP协议基础:无连接的数据报传输

UDP,全称User Datagram Protocol,中文叫用户数据报协议。说白了,它就是TCP的“轻量级兄弟”。

我第一次接触UDP时,总觉得它“不靠谱”。没有握手,没有确认,发了就发了,对方收没收到完全不管。但后来我明白了——UDP的“不靠谱”,恰恰是它的核心优势。

1.1 UDP协议概述

UDP工作在传输层,位于IP协议之上。它做的事情很简单:把应用程序的数据打包成数据报,然后扔给IP层去发送。

来看一个UDP数据报的头部结构,只有8个字节:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         源端口号            |          目的端口号             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           长度              |           校验和                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

就四个字段:源端口、目的端口、长度、校验和。没有序列号,没有确认号,没有窗口大小。简洁到极致。

我在项目中遇到过不少刚入行的同事,看到UDP头部只有8字节,觉得“这么简单,肯定没什么用”。嗯,这种想法可不对。简单不等于没用,恰恰是因为简单,它才能跑得飞快。

UDP的核心特性:

  • 无连接:发送数据前不需要建立连接,直接发
  • 不可靠:不保证数据送达,不保证顺序,不保证不重复
  • 无状态:不维护发送和接收状态,不记录任何会话信息
  • 低开销:头部仅8字节,没有TCP那20-60字节的负担

1.2 UDP与TCP的区别

很多人问我:“UDP和TCP到底怎么选?”我的回答是:看你的应用场景需要什么。

TCP像快递——要签收、要确认、丢了重发、顺序不能乱。UDP像明信片——写了就投,丢了就丢了,你也不知道对方什么时候收到。

下面这张表,是我这些年做网络分析时总结的对比:

对比维度 UDP TCP
连接建立 不需要 三次握手
可靠性 不可靠,无确认重传 可靠,有确认和重传
数据顺序 不保证顺序 保证顺序
流量控制 无 有滑动窗口
拥塞控制 无 有慢启动、拥塞避免
头部开销 8字节 20-60字节
传输模式 数据报模式 字节流模式
应用场景 实时性要求高 可靠性要求高

你想想看,TCP为了保证可靠性,做了多少事?序列号、确认号、重传计时器、拥塞窗口……这些机制在保证数据完整的同时,也带来了延迟和吞吐量的代价。

UDP呢?什么都不做。数据来了就发,发了就不管。所以它的延迟极低,吞吐量只受限于网络带宽。

我的经验之谈:

我曾经在一个视频直播项目中,团队一开始用了TCP。结果呢?网络一抖动,TCP就开始重传,导致画面卡顿、延迟飙升。后来换成UDP + 应用层简单的丢包补偿,效果立竿见影。所以,不要迷信“可靠”,有时候“不可靠”才是正确的选择。

1.3 UDP的应用场景

UDP到底用在哪些地方?我列几个最常见的:

  • DNS查询:域名解析,一个请求一个响应,用UDP就够了。如果丢了,客户端会重试。
  • DHCP:动态主机配置协议,客户端连网络都没有,怎么建立TCP连接?只能用UDP广播。
  • 视频/音频流:直播、视频会议、VoIP。少一帧画面没关系,但延迟高了体验就差了。
  • 在线游戏:玩家的位置、动作信息需要实时同步。丢一个包无所谓,但延迟高了游戏就没法玩了。
  • SNMP:简单网络管理协议,监控网络设备状态,轻量级查询。
  • TFTP:简单文件传输协议,用于网络设备固件升级等场景。

这些场景有一个共同点:实时性比可靠性更重要。你想想看,看直播时偶尔花屏一下,和卡住等缓冲,哪个更让人抓狂?

注意:

UDP虽然快,但它没有拥塞控制。如果大量发送UDP数据报,可能会把网络链路填满,导致TCP流量被“饿死”。我在一次网络故障排查中就遇到过这种情况——某个P2P应用疯狂发UDP包,把公司出口带宽占满了,导致正常业务完全无法访问。所以,使用UDP时,应用层最好自己做流量控制和拥塞控制。

1.4 UDP协议栈位置与数据流

为了让你更直观地理解UDP在整个网络协议栈中的位置,我画了一张图:

UDP协议栈位置与数据流 UDP在协议栈中的位置与数据流 应用层(Application Layer) HTTP / DNS / DHCP / RTP / 游戏协议 传输层(Transport Layer) UDP(用户数据报协议) 网络层(Network Layer) IP(互联网协议) 数据链路层(Data Link Layer) 以太网 / WiFi / PPP 数据从应用层向下逐层封装,最终通过物理介质发送

数据从应用层产生,向下传递到传输层,UDP给它加上8字节的头部,然后交给网络层封装成IP包,再经过数据链路层加上帧头帧尾,最后通过物理介质发送出去。

接收端的过程正好相反——从物理层一路向上解封装,最终把数据交给应用层。

整个过程,UDP只做了一件事:把应用层的数据包上端口号,然后扔给IP层。没有握手,没有确认,没有重传。就是这么简单粗暴。

1.5 什么时候该用UDP?

我个人的判断标准很简单:

  • 如果你的应用能容忍偶尔丢包,用UDP
  • 如果你的应用对延迟敏感,用UDP
  • 如果你的应用是请求-响应模式,且每次交互独立,用UDP
  • 如果你需要广播或多播,只能用UDP

反过来,如果你的应用要求数据必须完整、顺序必须正确、不能丢任何一个字节——那就老老实实用TCP。

一个小技巧:

用Wireshark抓包时,你可以通过过滤表达式 udp 快速筛选出所有UDP流量。然后观察端口号,就能判断出是什么应用。比如53是DNS,67/68是DHCP,123是NTP。这个习惯我保持了很多年,排查问题非常高效。

好了,UDP的基础概念就讲到这里。记住一句话:UDP用“不可靠”换来了“低延迟”和“高效率”。在后面的章节中,我们会用Wireshark实际抓包,看看UDP在网络上到底是怎么跑的。