它们是什么(在哪一层)
-
TCP(Transmission Control Protocol) :传输层的面向连接、可靠、按序的字节流协议。适合“必须一字不差”的场景(网页、文件、数据库…)。
-
UDP(User Datagram Protocol) :传输层的无连接、尽力而为的数据报协议。适合“低时延、轻量、不必严格可靠”的场景(实时音视频、游戏状态、DNS…)。
二者都位于传输层(OSI 第4层),都用端口号在同一台主机上复用/区分不同的应用进程,下面都跑在 IP 之上(常见 IPv4/IPv6)。
它们的关系
- 同层兄弟:都把“端到端”的数据送给对方应用,但服务模型不同:TCP=可靠字节流;UDP=不保证可靠的消息(数据报)。
- 都靠 IP 转发:真正的路由、分片/组装发生在网络层(IP)。
- 都用端口号:套接字五元组(源/目的IP、源/目的端口、协议) 唯一标识连接(TCP)或会话(UDP)。
- 都带校验和:UDP 的校验和 IPv6 必须,IPv4 可为 0(表示不用);TCP 必须。
TCP 细节(如何做到“可靠按序”)
-
连接 & 关闭
- 三次握手:SYN → SYN+ACK → ACK 建立连接,协商初始序号等。
- 四次挥手:双方各自 FIN/ACK 关闭;异常断开用 RST。
-
序号 & 确认 & 重传
- 每个字节都有序号;对端返回 ACK 告知已收到的最大连续序号。
- 重传:超时重传(RTO 基于 RTT 估计)、快速重传(三次重复 ACK 触发)。
-
流量控制(Flow Control)
- 滑动窗口 + 接收窗口 rwnd:避免把对端缓存冲爆;对端告知还能收多少。
-
拥塞控制(Congestion Control)
- 慢启动、拥塞避免、快速重传/恢复;拥塞窗口 cwnd 决定“在网里飞行的数据”上限。
- 现代实现(CUBIC/BBR…)各有策略以平衡吞吐与时延。
-
有序交付 & 乱序重排
- 内核将乱序片段缓存、按序交付应用(Head-of-Line 阻塞:前面少一块,后面的都等)。
-
其他机制
-
MSS/MTU 协商与分片避免;Nagle(合小包)与延迟 ACK优化;KeepAlive 探活等。
-
结果:可靠、按序、拥塞友好,但:握手有开销、丢包会触发重传导致时延跃增、HoL 阻塞可能放大时延抖动。
UDP 细节(为什么“轻”)
-
无连接、无握手:直接发包,最小报头 8 字节(源/目的端口、长度、校验和)。
-
不保证:到达、不重复、按序 —— 这些都交给应用层按需实现(或干脆不要)。
-
消息边界:应用写入一次就是一个数据报,接收端一次 recvfrom() 读取一个完整报文(超出接收缓冲会被丢弃)。
-
路径 MTU:单个 UDP 报文不宜超过 PMTU(常见以 1200~1400B 为经验值),否则可能被 IP 分片,丢一个分片就丢整报文。
-
常见增强(在应用/库里实现):
-
RTP/RTCP(实时音视频时钟、序号、抖动估计、统计反馈);
-
FEC/ARQ 前向纠错或选择性重传;
-
DTLS/QUIC:在 UDP 上实现的安全/可靠(QUIC 自带拥塞控制与按流复用,解决 TCP HoL)。
-
结果:时延小、开销小;可靠性、拥塞友好与安全要靠上层协议/应用补齐;穿透 NAT 相对容易(打洞)。
典型使用场景
- TCP:HTTP(S)、WebSocket(基于 TCP 的持久连接)、SSH、FTP、数据库连接、邮件协议等。
- UDP:DNS、DHCP、SNMP、实时语音视频(RTP/RTCP、WebRTC 底层)、在线游戏状态同步、流媒体直播(部分协议)、QUIC(HTTP/3)。
选择建议(怎么选)
- “不能丢、必须按序、吞吐优先” → TCP(或 QUIC:想要低时延 + 可靠可以考虑 QUIC/HTTP3)。
- “低时延、偶尔丢也行、自己能容错/补偿**” → UDP(配 RTP/ARQ/FEC/拥塞控制/加密)。
- “防火墙/NAT 友好”:TCP 443 几乎必通;UDP 有时被限,但 QUIC(UDP/443) 越来越通行。
安全与攻击面
- TCP:配 TLS(HTTPS、TLS over TCP);易遭 SYN flood(需 SYN cookies 等防护)。
- UDP:无握手、易被放大型 DDoS(利用可伪造源地址的反射协议);安全常用 DTLS/QUIC。
报头与开销
- TCP 头:最小 20 字节(+ 可选项如 SACK、时间戳等);
- UDP 头:固定 8 字节;
- IP 头:IPv4 20B、IPv6 40B(未含扩展);实际链路还有以太网等二层开销。
对比速查表
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 三次握手/四次挥手 | 无连接 |
| 可靠性 | 有:序号/ACK/重传 | 无(需上层自建) |
| 有序性 | 有(乱序重排) | 无(应用自行处理) |
| 流量/拥塞控制 | 有(rwnd/cwnd/算法) | 无(应用/协议自建或放任) |
| 时延 | 较高(握手、重传、HoL) | 低(无握手、无重排) |
| 报头开销 | ≥20B(+可选) | 8B |
| 适配 NAT/防火墙 | TCP/443 最通行 | UDP/443 趋好(QUIC),但部分网络受限 |
| 典型场景 | Web、文件、DB、邮件 | DNS、音视频、游戏、QUIC/HTTP3 |
小误区澄清
- “UDP 不可靠=一定丢” ❌:只是“不保证”,真实网络质量 + 上层容错决定体验。
- “TCP 一定更快” ❌:在低时延、允许少量丢的实时场景,UDP 往往更好;而在大文件传输、必须可靠时 TCP/QUIC 更优。
- “UDP 没拥塞控制就更猛” ❌:没有控制会压垮网络且自身丢包更多;现代 UDP 协议(QUIC/WebRTC)都有拥塞控制。