3. TCP 与 UDP 的区别及适用场景(热度 780 / 352 · 核心必考)
Q: TCP 和 UDP 有什么区别?各自适用什么场景?
A:
本质差异(先说结论)
TCP 面向字节流,UDP 面向数据报。 字节流不保留边界(因此有粘包问题);数据报保留边界(一次收一个完整报文)。其余区别都是这一本质 + 设计目标的延伸。
完整对照
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(握手/挥手) | 无连接 |
| 可靠性 | 可靠(序号、确认、重传、校验) | 不可靠(尽最大努力) |
| 有序性 | 有序(接收端按序交付) | 无序(可能乱序/重复/丢失) |
| 首部 | 20–60 字节(可变选项) | 8 字节(固定) |
| 流量控制 | 有(rwnd 滑动窗口) | 无 |
| 拥塞控制 | 有(cwnd,慢开始等) | 无(发送方想发就发) |
| 传输方式 | 一对一 | 一对一 / 一对多 / 多对多 / 广播 |
| 速度 | 相对慢、开销大 | 快、开销小 |
| 应用标识 | 端口号 | 端口号(与 TCP 端口独立命名空间) |
| 边界 | 字节流,需应用层定界 | 数据报,天然有边界 |
设计动机
- UDP 为何「简单」: 网络层 IP 已是不可靠的;UDP 只做复用/分用 + 可选校验,把控制权交给应用。符合端到端原则:需要什么可靠性由应用定制(或干脆不需要)。
- TCP 为何「复杂」: 大多数应用(文件、网页、邮件)需要可靠有序字节流;由操作系统统一实现,应用不必各自造轮子。
- TCP 无 UDP 端口冲突: 内核用「协议号 + 端口」区分,TCP 53 与 UDP 53 可并存。
适用场景
- TCP: HTTP/HTTPS、FTP、SMTP/POP3/IMAP、数据库连接、SSH、Redis/MySQL 客户端等——要求可靠、有序、字节流语义。
- UDP: DNS(查询小、一问一答)、DHCP(广播)、SNMP、音视频/直播、实时游戏、QUIC(HTTP/3)、NTP 等——低延迟优先,或可自行实现可靠性。
- 选型规律: ① 请求-响应、报文小 → UDP(DNS);② 能容忍丢失、重传反而更糟 → UDP(实时音视频);③ 需要广播/多播 → UDP(DHCP Discover);④ 数据完整有序不可缺 → TCP。
加分点
- 弱网下 UDP 更优:无队头阻塞,重传策略可由应用层定制(只重传关键帧/关键包)。
- HTTP/3(QUIC)选 UDP 正是为了绕开 TCP 层队头阻塞,并在用户态实现可靠传输、流控、加密、连接迁移。
- 「UDP 不可靠」≠「UDP 应用都不可靠」:QUIC/RTCP/WebRTC 自建选择重传与 FEC。
常见追问
追问 1:UDP 没有拥塞控制会怎样?
- 答题要点: 发送方可打满链路,挤垮同路径其他流(公平性差)。所以现代 UDP 应用(QUIC、WebRTC、BBR over UDP)都自带拥塞控制,只是实现位置在用户态/应用层。
追问 2:UDP 校验和与伪首部是什么?
- 答题要点: UDP 校验和覆盖「伪首部(源/目的 IP、协议号、UDP 长度)+ UDP 首部 + 数据」。伪首部不是 UDP 真正首部,仅用于校验,防止 IP 层把报文送错主机/送错协议。IPv6 中 UDP 校验和必选(因 IPv6 首部无校验和)。
追问 3:TCP 和 UDP 端口号会不会冲突?
- 答题要点: 不会。五元组/内核 socket 以「协议 + 本地地址 + 本地端口 + 对端」区分。DNS 同时使用 TCP 53 与 UDP 53,互不干扰。
易错点
| 易错说法 | 纠正 |
|---|---|
| 「UDP 不可靠所以不能传文件」 | 可以,只要应用层自建可靠性(TFTP、QUIC);代价是重复造轮子 |
| 「TCP 面向连接=有一条专线」 | 连接是逻辑的端状态与资源分配,底层仍是 IP 分组转发 |
| 「UDP 首部有确认号」 | UDP 首部仅:源端口、目的端口、长度、校验和,共 8 字节 |
| 「HTTP/3 仍基于 TCP」 | HTTP/3 基于 QUIC,传输在 UDP 之上 |
| 「TCP 一定比 UDP 慢」 | 在可靠传输需求下 TCP 往往更合适;「慢」指控制开销与队头阻塞等,不是绝对延迟排序 |
与选择题对照
- 主库 150: 第 121 题(TCP/UDP 对比正确项)、第 64 题(UDP 特点)、第 65 题(哪些应用用 UDP)、第 72 题(端口号关系)、第 59 题(端到端可靠传输层)、第 40 题(IP 尽最大努力)、第 12 题(分组交换)。
- 补题 16: 补-13(UDP 叙述错误项,考伪首部与校验;该题未涉及多播)、补-14(邮件协议用 TCP,与 UDP 场景对照)。
- 口述联动: 选择题常考「哪个协议用 UDP」;面试要补上为什么选 UDP(延迟/广播/可定制可靠性)。
工程 / 抓包背景
- Wireshark:
udp、dns;对比tcp.stream看字节流,UDP 每包独立。 - ss:
ss -uanp看 UDP socket;ss -tanp看 TCP。 - curl:
curl --http3 https://example.com(需编译支持)可观察 UDP 443 上的 QUIC。 - Nginx: HTTP/3 需
listen 443 quic reuseport;与add_header Alt-Svc;DNS 服务器常用 UDP 53,区域传送 zone transfer 用 TCP 53。