判断标准只有一条:怕丢还是怕慢。怕丢选 TCP,怕慢选 UDP。 但真实系统里经常两个都用:DNS 就这样,小查询走 UDP,大响应走 TCP。
6.1.3 讲了两个协议的性格,这一节讲「落到应用上怎么归」。 5.8.1 的多播只能用 UDP,因为 TCP 天生一对一。
一、判断标准一句话
先问一个问题:如果一个包晚到了 200 毫秒,它还有用吗? 有用,就选 TCP——晚到总比丢了强。 没用,就该考虑 UDP——重传回来也是废数据。 这句话能覆盖绝大多数场景, 而且比「可靠不可靠」这种说法更好用——因为「可靠」这个词太抽象,容易变成「越多越好」的直觉。
二、典型应用怎么归
| 应用 | 选谁 | 一句话理由 |
|---|---|---|
| 网页 | TCP | 少一个字节页面就坏 |
| 文件传输 | TCP | 文件要完整 |
| 邮件 | TCP | 不能丢字 |
| 语音通话 | UDP | 晚了就没用 |
| 视频直播 | UDP | 宁可糊一下 |
| 在线游戏 | UDP | 位置要最新,不要最全 |
前三行和后三行是一道清晰的分界:「内容型」的业务怕丢,「实时型」的业务怕慢。 注意「视频直播」和「视频点播」不一样: 直播是实时的,点播可以缓冲,所以点播反而常用 TCP(HTTP)。 同一个「视频」,因为「要不要等」不同,协议就不同。 第六行那句话值得多说一句:游戏里「我刚才在哪」这个消息,旧的那个已经没意义了, 所以游戏协议普遍是「只发最新状态、丢了就算了」——这正是 UDP 的用法。
三、混用的场景
真实系统很少「纯用一种」,最常见的混用是 DNS: 小查询走 UDP(一个包一问一答,不值得建连接),响应太大或者做区域传送时走 TCP。 另一个是新趋势:QUIC。 它在 UDP 之上自己实现了「可靠、按序、拥塞控制」, 因为「改传输层」要动操作系统,而「在 UDP 上重新做一遍」只改应用和库就行。 所以现在的分界不再是「TCP 还是 UDP」,而是「可靠性放在哪儿实现」。
四、本机实测
看看这台机器上两个协议各占多少:这个比例能反映「日常用机的真实构成」。 结果一定是 TCP 压倒性地多——因为「怕丢」的业务在数量上占绝对优势: 网页、更新、消息、云同步,全是 TCP。 而 UDP 的条目少,但它承担的是「不能等」的那一小部分,少了它,视频和语音就没法用。
五、动手 Demo:TCP 与 UDP 该怎么选
先摆判断标准,再数一下本机两种协议各有多少条。 这个比例很能说明问题。
import psutil, socket
from collections import Counter
k = Counter('TCP' if c.type == socket.SOCK_STREAM else 'UDP'
for c in psutil.net_connections(kind='inet'))
print(k)
实跑输出:
--------------------------------------------------------------------
TCP 与 UDP 该怎么选
--------------------------------------------------------------------
**选型的标准不是「哪个高级」,而是「丢了要不要重发」。**
需求 选谁 理由
---------------------------------------------------------------
**不能丢** **TCP** **重传、排序、去重全都有**
**不能等** **UDP** **重传的代价比丢一帧还大**
**一问一答** **UDP 也行** **应用自己重问一次更简单**
**要广播多播** **只能 UDP** **TCP 是一对一的**
**本机实测:TCP 128 条、UDP 59 条**。
**TCP 压倒性地多,因为绝大多数应用「怕丢不怕慢」**:**网页、文件、消息,丢一个字节就得重来。**
**UDP 少,但它承担的是「慢了就没用」的那部分**——**语音、视频、游戏、DNS 查询。**
**第四行容易被忽略**:**TCP 天生一对一,做不了广播和多播。**
**所以 5.8.1 讲的多播应用,传输层几乎必然是 UDP。**
TCP 条数是 UDP 的好几倍:这不是「TCP 更流行」,是「怕丢的业务更多」。 如果这台机器在跑视频会议,UDP 的条数会明显上来,但总量上还是比不过 TCP。 「条数」这个口径要注意:TCP 一条连接占一条,UDP 一个绑定端口占一条, 所以这个数字不能直接当「流量占比」用。 要看流量,得看字节数,那是另一个统计口径。 最后一个观察: 两种协议长期共存,说明「取舍」是真的存在—— 如果哪天真有一个「又可靠又快」的协议, 那它一定要在某个维度上付出别的代价(比如内存、CPU、部署成本)。
30 秒实验
- 想一下:视频点播和视频直播,为什么可能选不同的协议?
- 算一下:本机 TCP 条数是 UDP 的几倍?
- 想一下:QUIC 为什么建在 UDP 上而不是改 TCP?
常见误区
- 以为「实时业务必须用 UDP」。 看「晚了有没有用」,有些实时业务也能容忍一点延迟。
- 以为「DNS 只用 UDP」。 大响应和区域传送走 TCP,两种都用。
- 以为「QUIC 是新的传输层协议」。 它是建在 UDP 之上的用户态实现,本质是「绕过操作系统」。
自测三问(点开对答案)
1. 选协议的一句话标准是什么? —— **「晚到的数据还有没有价值」**:有就 TCP,没有就考虑 UDP。 2. 视频点播和直播为什么可能选不同协议? —— **点播可以缓冲,晚一点没关系,所以常用 TCP**;**直播不能等,多用 UDP。** 3. QUIC 为什么要建在 UDP 上? —— **改传输层要动操作系统**,部署极慢;**在 UDP 上自己实现可靠和拥塞控制,只改应用和库**。下一节进入端口号:它是怎么分段、怎么分配的。
- ☐ (本节完,下一节 6.2.1 端口号定义)