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给它加上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在网络上到底是怎么跑的。