跳到主要内容

TCP 与 UDP:可靠性、实时性、连接语义到底该怎么对比?

面试速答(30 秒版 TL;DR)

  • TCP 和 UDP 都属于传输层协议,但设计目标不同。
  • TCP 强调 面向连接、可靠传输、按序到达、流量控制、拥塞控制,适合对正确性要求高的场景。
  • UDP 强调 无连接、低开销、尽力而为,适合更看重实时性、时延和简单性的场景。
  • 不能简单说“TCP 好、UDP 差”,要看业务目标:文件下载、HTTP 通常选 TCP;音视频、实时游戏、DNS 常选 UDP。
  • 面试官最想听到的是:为什么某场景更适合 UDP,而不是只背 TCP 更可靠

一、先看核心差异

维度TCPUDP
连接语义面向连接无连接
可靠性有确认、重传、按序保证尽力而为,不保证到达
数据形态字节流报文
开销较大较小
时延相对更高相对更低
拥塞/流控协议本身不提供
典型场景HTTP、数据库、文件传输DNS、音视频、实时游戏

二、TCP 的核心特征

1. 面向连接

通信前先三次握手,结束时有序挥手。
它的设计目标是:建立一个可靠、可维护状态的会话。

2. 可靠传输

TCP 通过这些机制保证可靠性:

  • 序列号
  • 确认应答(ACK)
  • 超时重传
  • 按序重组
  • 去重

3. 流量控制

接收方可以告诉发送方:我当前还能接收多少。
这样可以避免把接收方缓冲区打爆。

4. 拥塞控制

TCP 会根据网络状况动态调整发送速率,避免把整个网络打崩。

面试里一句话:

  • TCP 追求的是“可靠 + 有序 + 尽量公平地用网络”,代价是额外状态和时延。

三、UDP 的核心特征

1. 无连接

发送前不需要建连,直接发。

2. 保留报文边界

应用层一次发送一个报文,接收层看到的也是报文语义,而不是像 TCP 那样连续字节流。

3. 协议本身简单

UDP 头部小、状态少,没有强制确认、重传、拥塞控制这些机制。

这意味着:

  • 更轻量
  • 更低延迟
  • 但应用如果需要可靠性,要自己补

四、为什么“实时业务”常选 UDP

因为很多实时场景更怕“迟到”,而不是“丢一个包”。

例如音视频通话:

  • 某一帧晚了 2 秒才到,基本没有价值
  • 适度丢包比整体卡顿更可接受

这时如果强依赖 TCP:

  • 丢包后会重传
  • 后续数据要等前面补齐
  • 实时体验可能反而更差

所以实时业务常选 UDP 或基于 UDP 的协议,再在应用层做针对性的抗丢包设计。


五、TCP 的“粘包半包”和 UDP 的“报文边界”怎么答

TCP

TCP 是字节流,没有应用层消息边界。
所以你发两次:

"hello"
"world"

接收方可能一次读到:

  • helloworld
  • hell
  • oworld

所以应用层要自己设计长度字段、分隔符或协议格式。

UDP

UDP 天然保留报文边界。
一次 sendto 对应一次报文语义,接收方读取时不会自动和下一条报文拼在一起。

但注意:

  • UDP 报文可能丢
  • 可能乱序
  • 可能根本收不到

所以“有边界”不等于“更可靠”。


六、常见协议和场景怎么选

更常见跑在 TCP 上的

  • HTTP/1.1
  • HTTP/2
  • WebSocket(通常基于 TCP)
  • MySQL / PostgreSQL 等数据库协议
  • 文件传输

更常见跑在 UDP 上的

  • DNS
  • RTP/RTCP 音视频
  • 局域网广播/发现
  • 部分游戏实时同步
  • QUIC(进而承载 HTTP/3)

这里有个面试加分点:

  • HTTP/3 虽然最终给你的是“可靠 HTTP 语义”,但底层已经不是 TCP,而是基于 UDP 的 QUIC。

七、什么时候 UDP 不一定更快

很多人会机械地说 UDP 一定比 TCP 快,这不严谨。

更准确的说法:

  • UDP 协议开销更低、建连成本更低
  • 但如果业务层自己要补确认、重传、排序、拥塞控制,复杂度和额外开销也会上来

所以“快不快”要看:

  • 业务需求
  • 网络环境
  • 上层协议实现

高频题标准答法

1. TCP 和 UDP 最大区别是什么?

TCP 面向连接并提供可靠有序传输;UDP 无连接、尽力而为、开销更低。
本质是两者设计目标不同。

2. UDP 不可靠,为什么 DNS 还大量使用 UDP?

因为 DNS 查询通常报文小、追求低延迟、一次问答就结束,用 UDP 成本低;
如果丢了,上层重试也相对容易。超大响应或特殊场景也可能切到 TCP。

3. 视频通话为什么常选 UDP?

因为实时性优先。
少量丢包通常比大面积等待重传更可接受。

4. UDP 能做可靠传输吗?

能,但要在上层协议里自己实现。
QUIC 就是典型例子:它基于 UDP,但提供了可靠传输、多路复用和拥塞控制等能力。


易错点 / 坑

  • 把 UDP 说成“完全不能保证任何事”,忽略上层协议可补能力。
  • 把 TCP 的可靠性理解成“绝不丢数据”;更准确地说是通过机制尽量可靠交付给对端协议栈。
  • 认为 UDP 一定更快、TCP 一定更慢。
  • 混淆“TCP 是字节流”和“UDP 是报文”这两个核心差异。

速记要点(可背诵)

  • TCP:面向连接、可靠、有序、字节流
  • UDP:无连接、低开销、报文、尽力而为
  • 正确性优先常选 TCP,实时性优先常选 UDP。
  • QUIC 是加分点:基于 UDP,但补上了很多 TCP 级能力