📚 第六章 TCP与UDP
📄 一句话概括

判断标准只有一条:怕丢还是怕慢。怕丢选 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 秒实验

  1. 想一下:视频点播和视频直播,为什么可能选不同的协议?
  2. 算一下:本机 TCP 条数是 UDP 的几倍?
  3. 想一下:QUIC 为什么建在 UDP 上而不是改 TCP?

常见误区

  1. 以为「实时业务必须用 UDP」。 看「晚了有没有用」,有些实时业务也能容忍一点延迟。
  2. 以为「DNS 只用 UDP」。 大响应和区域传送走 TCP,两种都用。
  3. 以为「QUIC 是新的传输层协议」。 它是建在 UDP 之上的用户态实现,本质是「绕过操作系统」。
自测三问(点开对答案) 1. 选协议的一句话标准是什么? —— **「晚到的数据还有没有价值」**:有就 TCP,没有就考虑 UDP。 2. 视频点播和直播为什么可能选不同协议? —— **点播可以缓冲,晚一点没关系,所以常用 TCP**;**直播不能等,多用 UDP。** 3. QUIC 为什么要建在 UDP 上? —— **改传输层要动操作系统**,部署极慢;**在 UDP 上自己实现可靠和拥塞控制,只改应用和库**。

下一节进入端口号:它是怎么分段、怎么分配的。

相关笔记