TCP 与 UDP
核心区别
| TCP | UDP | |
|---|---|---|
| 连接 | 面向连接(先握手) | 无连接(直接发) |
| 可靠性 | 可靠(不丢失、不重复、有序) | 尽力交付(不保证) |
| 传输方式 | 字节流(无边界) | 数据报(有边界) |
| 通信模式 | 1 对 1 | 1对1、1对多、广播 |
| 头部大小 | 最小 20 字节 | 固定 8 字节 |
| 拥塞控制 | 有(网络拥塞会降速) | 无(发多快就多快,可能丢包) |
| 适用场景 | HTTP、FTP、SSH(要求可靠) | DNS、视频流、游戏、QUIC(要求低延迟) |
TCP 如何保证可靠传输
1. 三次握手(建立连接)
客户端 服务端
│── SYN(x) ────────────→│ "我要连接,我的序号是 x"
│←── SYN(y) + ACK(x+1) ─│ "同意,我的序号是 y,确认收到 x"
│── ACK(y+1) ───────────→│ "确认收到 y"
连接建立
2. 四次挥手(断开连接)
客户端 服务端
│── FIN ────────────────→│ "我发完了,想关闭"
│←── ACK ────────────────│ "收到,但我可能还有数据要发"
│ (服务端继续发剩余数据)
│←── FIN ────────────────│ "我也发完了"
│── ACK ────────────────→│ "确认"
客户端等待 2MSL 后关闭
3. 流量控制(滑动窗口)
接收方在每次 ACK 里告知自己的剩余缓冲区大小(rwnd),发送方根据这个值控制发送量,防止把接收方"撑爆"。
接收方缓冲区满 → rwnd = 0 → 发送方暂停发送
接收方处理完数据 → rwnd > 0 → 发送方继续
4. 拥塞控制
流量控制防止接收方过载,拥塞控制防止网络过载。
| 阶段 | 行为 |
|---|---|
| 慢启动 | 从小窗口开始,指数增长,探测网络容量 |
| 拥塞避免 | 超过阈值后改为线性增长,缓慢试探 |
| 快重传 | 收到 3 个重复 ACK → 立即重传,不等超时 |
| 快恢复 | 快重传后不回到慢启动,从新阈值线性增长 |
检测到丢包(超时 or 重复 ACK)→ 降低发送窗口 → 重新探测
使用场景选择
需要完整、准确的数据? → TCP
· 网页(HTTP/HTTPS)
· 文件传输(FTP)
· 邮件(SMTP)
· 远程登录(SSH)
需要低延迟,少量丢包可接受? → UDP
· 视频/音频通话(WebRTC)
· 在线游戏
· DNS 查询(小包,快速)
· HTTP/3(QUIC 基于 UDP,自己实现可靠性)