一、协议基础与设计目标
| 维度 | TCP(传输控制协议) | UDP(用户数据报协议) |
|---|---|---|
| 所属层次 | 传输层(Transport Layer) | 传输层(Transport Layer) |
| 设计目标 | 可靠数据传输(如文件传输、网页浏览) | 低延迟数据传输(如视频直播、实时通信) |
| 连接方式 | 面向连接(需三次握手建立连接) | 无连接(直接发送数据包,无需提前建立连接) |
二、核心特性对比(高频考点)
1. 连接与可靠性
-
TCP:
- 三次握手:建立连接时客户端与服务器交换 SYN、SYN-ACK、ACK 包;
- 四次挥手:断开连接时交换 FIN、ACK、FIN、ACK 包;
- 可靠机制:通过序列号、确认应答、重传机制确保数据不丢失。
-
UDP:
- 无连接过程,直接发送数据包(类似“发送后不管”);
- 不保证数据到达,无重传机制,可能丢包。
2. 数据传输方式
-
TCP:
- 流式传输:数据无边界,需应用层自行处理分包(如 HTTP 头部的 Content-Length);
- 拥塞控制:通过慢启动、拥塞避免算法适应网络环境。
-
UDP:
- 数据包传输:每个数据包独立(最大约 64KB),有明确边界;
- 无拥塞控制,可能因网络拥堵导致丢包,但延迟更稳定。
3. 头部开销
- TCP:头部固定 20 字节(含源端口、目标端口、序列号、确认号等);
- UDP:头部仅 8 字节(含源端口、目标端口、长度、校验和)。
三、典型应用场景
| 协议 | 应用场景 | 原因 |
|---|---|---|
| TCP | 网页浏览(HTTP)、文件传输(FTP)、邮件(SMTP)、远程登录(SSH) | 需保证数据完整到达,允许稍高延迟 |
| UDP | 视频直播(RTMP/RTSP)、实时通信(WebRTC)、DNS 查询、网络游戏 | 需低延迟,可容忍少量丢包(如视频帧丢失可忽略) |
四、问题
1. 问:TCP 如何保证数据可靠性?
TCP 通过以下机制实现可靠传输:
- 序列号与确认应答:每个数据包带序列号,接收方返回 ACK 确认;
- 超时重传:发送方未收到 ACK 时,重新发送数据包;
- 滑动窗口:控制发送方发送速率,避免接收方缓冲区溢出;
- 拥塞控制:根据网络状况动态调整发送窗口大小(慢启动、拥塞避免、快重传、快恢复)。
2. 问:为什么 UDP 更适合实时通信?
- 无连接开销:无需三次握手,适合快速发送数据;
- 无重传机制:不等待丢失包的重传,保证延迟稳定;
- 头部开销小:8 字节头部相比 TCP 的 20 字节更高效;
- 应用层可控:开发者可自定义丢包处理(如视频直播中丢帧直接跳过)。
3. 问:能否用 TCP 实现 UDP 的低延迟?为什么?
- 不能完全实现,原因如下:
- TCP 的拥塞控制和重传机制必然引入延迟;
- 即使关闭 Nagle 算法(减少小包合并),仍有确认应答的往返时间(RTT);
- UDP 无连接特性决定了其启动延迟更低(如 DNS 查询用 UDP 而非 TCP)。
五、协议细节对比表
| 特性 | TCP | UDP |
|---|---|---|
| 连接状态 | 有连接(需建立与断开) | 无连接(stateless) |
| 数据完整性 | 保证不丢失、不重复、按序到达 | 不保证(可能丢包、乱序) |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有(慢启动、拥塞避免) | 无 |
| 传输效率 | 低(头部开销大、重传机制) | 高(头部开销小、无额外操作) |
| 适用网络 | 广域网(需处理复杂网络环境) | 局域网(延迟敏感场景) |
六、总结
TCP 可靠有连接,三次握手四次挥,
序列号加确认答,超时重传保完整;
UDP 无连速度快,头部仅占 8 字节,
丢包乱序自己处理,直播游戏最适合。