TCP 和 UDP 的主要区别是什么?
TCP(传输控制协议)和 UDP(用户数据报协议)是互联网传输层中最核心的两个协议。
简单来说:TCP 注重数据的准确性和可靠性,而 UDP 注重数据的传输速度和实时性。
以下是它们的主要区别详解:
1. 核心区别对比表
| 特性 | TCP (Transmission Control Protocol) | UDP (User Datagram Protocol) |
|---|---|---|
| 连接性 | 面向连接 (需要三次握手建立连接) | 无连接 (直接发送数据) |
| 可靠性 | 可靠 (保证数据不丢失、不重复、无错误) | 不可靠 (尽最大努力交付,可能丢包) |
| 有序性 | 有序 (保证数据按发送顺序到达) | 无序 (接收顺序可能与发送顺序不同) |
| 传输速度 | 较慢 (因需建立连接、确认机制、拥塞控制) | 快 (无额外开销,适合实时传输) |
| 头部开销 | 大 (最小 20 字节) | 小 (固定 8 字节) |
| 传输方式 | 面向字节流 (无明显边界) | 面向报文 (保留报文边界) |
| 拥塞控制 | 有 (网络拥堵时会减慢发送) | 无 (不管网络好坏,全速发送) |
2. 详细解析
A. 连接 vs 无连接
- TCP: 在传输数据前,必须先建立连接(著名的三次握手)。传输结束后,必须断开连接(四次挥手)。这就像打电话,必须对方接通了才能开始说话。
- UDP: 不需要建立连接,想发就发。这就像寄信或者校园广播,发出去就行,不管对方在不在。
B. 可靠性 vs 效率
- TCP: 拥有确认机制(ACK)、重传机制(超时重传)和流量控制。如果数据包丢了,TCP 会自动重新发送,直到对方确认收到。
- UDP: 发送端发出去就不管了。如果网络不好导致丢包,UDP 协议层不会重发(除非应用层自己处理)。
C. 面向字节流 vs 面向报文
- TCP (字节流): TCP 把数据看作一连串无结构的字节流。如果发送方发了 10 次 10 字节的数据,接收方可能一次性收到 100 字节,也可能分两次收到。没有固定的边界。
- UDP (报文): UDP 保护消息边界。发送方发一句,接收方就收一句。发 10 次,接收方就得收 10 次。
3. 应用场景
什么时候用 TCP?
当数据的准确性高于一切,且不能容忍数据丢失时。
- 网页浏览 (HTTP/HTTPS): 网页内容不能缺字少图。
- 文件传输 (FTP): 下载的文件必须完整,错一个字节都无法使用。
- 邮件发送 (SMTP/POP3): 邮件内容不能乱码或丢失。
什么时候用 UDP?
当实时性(速度)高于准确性,或者允许少量丢包时。
- 视频会议/直播 (Zoom, 直播): 画面偶尔卡顿或模糊一下没关系,但不能有太大的延迟。
- 在线游戏 (王者荣耀, FPS游戏): 玩家的操作需要立即反馈,丢几个位置包可以通过预测补偿,但延迟高了就没法玩。
- DNS 查询: 快速查询域名 IP,发一个包过去,回一个包过来,用 TCP 建立连接太浪费时间。
4. 通俗比喻
TCP 就像“挂号信”或“打电话”:
- 你需要确认对方收到(签收)。
- 顺序不能乱(信件内容按页码读)。
- 如果丢了,邮局得负责找回或重寄。
UDP 就像“发传单”或“大喇叭广播”:
- 你只管发,不管路人接没接。
- 发得快,成本低。
- 路人可能先接到第二张传单,再接到第一张(乱序),或者根本没接到(丢包),你也不在乎。