UDP 与应用层协议 — 简单高效的另一种选择
TCP 像挂号信——可靠但繁琐;UDP 像明信片——简单快速但不保证送达。在网络世界中,并非所有场景都需要 TCP 的可靠性,有时速度和简洁才是王道。
📋 开篇自测:你已经知道多少?
- UDP 头部有多少字节?它和 TCP 最大的区别是什么?
- DNS 解析的完整流程是怎样的?递归查询和迭代查询有什么区别?
- DHCP 的四步交互过程(DORA)分别代表什么?
一、UDP 协议:轻装上阵的传输层
1.1 UDP 头部结构
UDP 的头部极其简洁,只有 8 个字节:
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| 源端口 (16位) | 目的端口 (16位) |
+--------+--------+--------+--------+
| 长度 (16位) | 校验和 (16位) |
+--------+--------+--------+--------+
| |
| 数据(载荷) |
| |
+------------------------------------+
对比:
TCP 头部: 最少 20 字节,最多 60 字节
UDP 头部: 固定 8 字节
1.2 UDP 的特点
无连接:不需要建立和断开连接,省去了三次握手和四次挥手的开销。
不可靠:不保证数据到达、不保证顺序、不保证不重复。发出去就不管了。
无拥塞控制:不会因为网络拥堵而降低发送速率。这把双刃剑——速度快但可能加剧拥堵。
支持一对多:天然支持广播和组播,TCP 只能点对点。
头部开销小:8 字节 vs TCP 的 20-60 字节,数据传输效率更高。
1.3 UDP vs TCP 对比
+------------------+-------------------+------------------+
| 特性 | TCP | UDP |
+------------------+-------------------+------------------+
| 连接方式 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 尽力而为 |
| 顺序保证 | 有序 | 无序 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有 | 无 |
| 头部大小 | 20-60 字节 | 8 字节 |
| 传输模式 | 字节流 | 数据报 |
| 通信模式 | 一对一 | 一对一/一对多/多对多|
| 典型应用 | HTTP, SSH, FTP | DNS, DHCP, 视频流 |
+------------------+-------------------+------------------+
1.4 UDP 的典型应用场景
适合 UDP 的场景:
1. 实时性要求高,允许少量丢包
├── 视频直播/会议(WebRTC)
├── 在线游戏(状态同步)
└── VoIP 语音通话
2. 简单的请求-响应模式
├── DNS 域名查询
└── SNMP 网络管理
3. 广播/组播
├── DHCP 地址分配
└── 局域网服务发现
4. 需要自定义可靠性的场景
├── QUIC 协议(HTTP/3 的基础)
└── KCP 协议(游戏加速)
值得注意的是,QUIC(HTTP/3 的传输层协议)选择在 UDP 之上自行实现可靠传输。这是因为 TCP 的拥塞控制和重传机制已经固化在操作系统内核中,难以优化;而 UDP 的”白板”特性给了应用层更大的自由度。
🤔 想一想 为什么视频通话使用 UDP 而不是 TCP?如果一个视频帧丢了一部分数据,用 TCP 重传和用 UDP 丢弃,哪个用户体验更好?
二、DNS:互联网的电话簿
2.1 DNS 解决什么问题
人类习惯记名字,计算机习惯记数字。DNS(Domain Name System)就是把人类友好的域名翻译成机器友好的 IP 地址的系统。
www.example.com --(DNS解析)--> 93.184.216.34
2.2 域名的层次结构
域名是有层次的,从右到左依次是:根域 → 顶级域 → 二级域 → 子域。
www.mail.example.com
| | | |
| | | +-- 根域 (隐含的 ".")
| | +-- 顶级域 (TLD): com, org, cn, io...
| +-- 二级域: example (你注册的)
+-- 子域/主机名: www, mail, api...
域名树结构:
. (根)
/|\
/ | \
com org cn
/ | |
example google baidu
/ \ |
www mail www
2.3 DNS 查询的完整流程
用户在浏览器输入 www.example.com
步骤1: 浏览器缓存
浏览器检查自己的 DNS 缓存 --> 没有
步骤2: 操作系统缓存
查询 /etc/hosts 文件和系统 DNS 缓存 --> 没有
步骤3: 本地 DNS 服务器(递归解析器)
发送查询给配置的 DNS 服务器(如 8.8.8.8)
步骤4: 递归解析器开始迭代查询
递归解析器 根DNS服务器 .com DNS服务器 example.com DNS
| "www.example.com?" | | |
| -------------------> | | |
| "去问 .com 服务器" | | |
| <------------------- | | |
| | | |
| "www.example.com?" | |
| ---------------------------------------->| |
| "去问 example.com 的权威服务器" | |
| <----------------------------------------| |
| | |
| "www.example.com?" |
| ------------------------------------------------------------->|
| "93.184.216.34" |
| <-------------------------------------------------------------|
|
| 缓存结果(按TTL时间)
| 返回给客户端: 93.184.216.34
2.4 递归查询 vs 迭代查询
递归查询(客户端 -> 本地DNS):
客户端: "帮我查 www.example.com"
本地DNS: "好的,我帮你查到底,最终结果告诉你"
--> 本地 DNS 负责全部后续查询
迭代查询(本地DNS -> 各级DNS服务器):
本地DNS: "www.example.com 在哪?"
根DNS: "我不知道,但 .com 的服务器在这里"
本地DNS: "www.example.com 在哪?"
.com DNS: "我不知道,但 example.com 的服务器在这里"
--> 本地 DNS 自己一步步追查
2.5 DNS 记录类型
| 记录类型 | 说明 | 示例 |
|---|---|---|
| A | 域名 → IPv4 地址 | example.com → 93.184.216.34 |
| AAAA | 域名 → IPv6 地址 | example.com → 2606:2800:220:1:... |
| CNAME | 别名指向另一个域名 | www.example.com → example.com |
| MX | 邮件交换服务器 | example.com → mail.example.com |
| NS | 域名服务器 | example.com → ns1.example.com |
| TXT | 文本记录(验证、SPF等) | example.com → "v=spf1 ..." |
| SOA | 授权起始记录 | 区域的管理信息 |
2.6 DNS 使用 UDP 还是 TCP?
通常使用 UDP(端口 53):DNS 查询和响应通常很小(几百字节),一个 UDP 数据报就能搞定,无需建立连接的开销。
特殊情况使用 TCP:
- 响应数据超过 512 字节(传统限制)或超过 EDNS0 协商的 UDP 载荷大小(常见配置为 4096 字节,协议最大允许 65535 字节)
- 区域传送(Zone Transfer),即 DNS 服务器之间同步完整的区域数据
- DNS over TLS(DoT)和 DNS over HTTPS(DoH)用于加密 DNS 查询
🤔 想一想 你知道 DNS 劫持和 DNS 污染是什么吗?为什么会出现”输入正确网址却打开了广告页面”的情况?
三、DHCP:自动分配 IP 的管家
3.1 为什么需要 DHCP
如果每台设备都要手动配置 IP 地址、子网掩码、网关和 DNS 服务器,管理成本会非常高。DHCP(Dynamic Host Configuration Protocol)实现了自动化的网络配置。
3.2 DHCP 四步交互(DORA)
客户端(无IP) DHCP 服务器(192.168.1.1)
| |
| 1. DHCP Discover (广播) |
| "有DHCP服务器吗?我需要IP!" |
| src: 0.0.0.0 |
| dst: 255.255.255.255 |
| --------------------------------> |
| |
| 2. DHCP Offer (广播/单播) |
| "我这里有IP可以分配给你" |
| 提供: IP=192.168.1.100 |
| 子网掩码=255.255.255.0 |
| 网关=192.168.1.1 |
| DNS=8.8.8.8 |
| 租期=86400秒 |
| <-------------------------------- |
| |
| 3. DHCP Request (广播) |
| "我接受你提供的配置" |
| (如果有多个DHCP服务器,选一个) |
| --------------------------------> |
| |
| 4. DHCP Ack (广播/单播) |
| "确认,这个IP归你用了" |
| <-------------------------------- |
| |
| 客户端配置网络并开始使用 |
D = Discover, O = Offer, R = Request, A = Ack --> DORA
3.3 DHCP 的租期与续约
DHCP 分配的 IP 地址不是永久的,而是有租期(Lease Time):
租期时间线:
|<--------------------- 租期 (如24小时) --------------------->|
| | | |
0 T1(50%) T2(87.5%) 到期
| |
单播续约请求 广播续约请求
(发给原DHCP服务器) (发给任意DHCP服务器)
T1 时刻(50%): 客户端尝试向原服务器续租(单播)
- 成功: 租期重新开始
- 失败: 等到 T2
T2 时刻(87.5%): 客户端广播续租请求(任意服务器都可响应)
- 成功: 租期重新开始
- 失败: 到期后释放 IP,重新走 DORA 流程
3.4 DHCP 中继
DHCP 使用广播通信,而广播不能跨越路由器。如果 DHCP 服务器和客户端不在同一子网,就需要 DHCP 中继(Relay Agent):
子网A 路由器(DHCP中继) 子网B
客户端 | DHCP服务器
| 广播 Discover | |
| -------> | |
| 中继转换为单播 | |
| 转发给DHCP服务器 | -------- 单播 -------> |
| | |
| | <------ 单播回复 ------ |
| 中继转为广播/单播 | |
| <-------- | |
四、其他常见的应用层协议
4.1 FTP:文件传输协议
FTP 是最早的文件传输协议之一,使用两个端口:
控制连接 (端口 21): 发送命令和接收响应
客户端: "USER admin"
服务器: "331 Password required"
客户端: "PASS secret"
服务器: "230 Login OK"
客户端: "LIST"
数据连接 (端口 20 或随机端口): 传输实际文件数据
- 主动模式 (PORT): 服务器主动连接客户端的端口
- 被动模式 (PASV): 客户端主动连接服务器的端口(NAT 友好)
4.2 SMTP / POP3 / IMAP:电子邮件协议簇
发送邮件 接收邮件
用户A 用户B
| |
| SMTP (端口25/587) | POP3 (端口110) 或
| -------> 发件服务器 | IMAP (端口143)
| | | <------- 收件服务器
| | SMTP | |
| | -------> 收件服务器 ---+ |
| | |
POP3: 下载邮件到本地,服务器可删除(离线阅读)
IMAP: 邮件保留在服务器,多设备同步(在线管理)
4.3 SSH:安全远程登录
SSH(Secure Shell)是 Telnet 的安全替代品,在端口 22 上提供加密的远程终端访问和文件传输(SCP/SFTP)功能。
五、端口号:进程的”门牌号”
5.1 端口号的分类
传输层使用端口号来区分同一台机器上的不同应用程序:
端口号范围 (0-65535):
0 - 1023: 知名端口(Well-Known Ports)
由 IANA 分配,需要管理员权限绑定
HTTP=80, HTTPS=443, SSH=22, DNS=53, SMTP=25
1024 - 49151: 注册端口(Registered Ports)
由软件供应商注册
MySQL=3306, PostgreSQL=5432, Redis=6379
49152 - 65535: 动态/临时端口(Ephemeral Ports)
操作系统自动分配给客户端程序
5.2 Socket 五元组
一个网络连接由五个要素唯一标识,称为 Socket 五元组:
(协议, 源IP, 源端口, 目的IP, 目的端口)
示例:
(TCP, 192.168.1.10, 52341, 93.184.216.34, 80)
这意味着:
- 同一台客户端可以与同一个服务器建立多个 TCP 连接(源端口不同)
- 一台服务器的 80 端口可以同时服务成千上万个客户端
六、章节小结
- UDP 是轻量级的传输层协议,无连接、不可靠、无拥塞控制,但开销小、速度快,适用于实时性要求高的场景。
- DNS 是互联网的域名解析系统,采用层次化的分布式架构,通常使用 UDP 进行快速查询。
- DHCP 通过 DORA 四步交互自动为设备分配 IP 地址和网络配置,大大简化了网络管理。
- 端口号在传输层区分不同的应用进程,与 IP 地址配合构成 Socket 五元组来唯一标识一个连接。
- 应用层协议(FTP、SMTP、SSH 等)各司其职,构建了丰富多彩的互联网服务生态。
📝 结尾自测:检验你的收获
- UDP 和 TCP 各自适合什么场景?请各举出 3 个使用 UDP 和 TCP 的应用层协议。
- 完整描述 DNS 解析 www.example.com 的过程,包括浏览器缓存、操作系统缓存和递归/迭代查询。
- DHCP 的 DORA 四步分别代表什么?每一步使用的是广播还是单播?
- 为什么 QUIC(HTTP/3)选择在 UDP 而非 TCP 之上构建?UDP 的哪些特性使这成为可能?
- 一台 Web 服务器的 80 端口能同时处理多少个客户端连接?为什么?(提示:五元组)
下一章预告:了解了传输层和基础应用层协议之后,下一章我们将聚焦互联网上最广泛使用的应用层协议——HTTP。从 HTTP/1.1 的 Keep-Alive 到 HTTP/2 的多路复用,再到 HTTP/3 的 QUIC 革命,系统拆解请求/响应格式、状态码、缓存机制和 Cookie 的工作原理。
购买课程解锁全部内容
网络通信第一课:10 章掌握计算机网络
¥29.90