一个总结的比较全面的版本供大家参考。
TCP 和 UDP 有什么区别?
-
是否面向连接:
-
TCP 是面向连接的。在传输数据之前,必须先通过“三次握手”建立连接;数据传输完成后,还需要通过“四次挥手”来释放连接。这保证了双方都准备好通信。
-
UDP 是无连接的。发送数据前不需要建立任何连接,直接把数据包(数据报)扔出去。
-
-
是否是可靠传输:
-
TCP 提供可靠的数据传输服务。它通过序列号、确认应答 (ACK)、超时重传、流量控制、拥塞控制等一系列机制,来确保数据能够无差错、不丢失、不重复且按顺序地到达目的地。
-
UDP 提供不可靠的传输。它尽最大努力交付 (best-effort delivery),但不保证数据一定能到达,也不保证到达的顺序,更不会自动重传。收到报文后,接收方也不会主动发确认。
-
-
是否有状态:
-
TCP 是有状态的。因为要保证可靠性,TCP 需要在连接的两端维护连接状态信息,比如序列号、窗口大小、哪些数据发出去了、哪些收到了确认等。
-
UDP 是无状态的。它不维护连接状态,发送方发出数据后就不再关心它是否到达以及如何到达,因此开销更小(这很“渣男”!)。
-
-
传输效率:
-
TCP 因为需要建立连接、发送确认、处理重传等,其开销较大,传输效率相对较低。
-
UDP 结构简单,没有复杂的控制机制,开销小,传输效率更高,速度更快。
-
-
传输形式:
-
TCP 是面向字节流 (Byte Stream) 的。它将应用程序交付的数据视为一连串无结构的字节流,可能会对数据进行拆分或合并。
-
UDP 是面向报文 (Message Oriented) 的。应用程序交给 UDP 多大的数据块,UDP 就照样发送,既不拆分也不合并,保留了应用程序消息的边界。
-
-
首部开销:
-
TCP 的头部至少需要 20 字节,如果包含选项字段,最多可达 60 字节。
-
UDP 的头部非常简单,固定只有 8 字节。
-
-
是否提供广播或多播服务:
-
TCP 只支持点对点 (Point-to-Point) 的单播通信。
-
UDP 支持一对一 (单播)、一对多 (多播/Multicast) 和一对所有 (广播/Broadcast) 的通信方式。
-
-
……
为了更直观地对比,可以看下面这个表格:
特性 | TCP | UDP |
---|---|---|
连接性 | 面向连接 | 无连接 |
可靠性 | 可靠 | 不可靠 (尽力而为) |
状态维护 | 有状态 | 无状态 |
传输效率 | 较低 | 较高 |
传输形式 | 面向字节流 | 面向数据报 (报文) |
头部开销 | 20 - 60 字节 | 8 字节 |
通信模式 | 点对点 (单播) | 单播、多播、广播 |
常见应用 | HTTP/HTTPS, FTP, SMTP, SSH | DNS, DHCP, SNMP, TFTP, VoIP, 视频流 |
什么时候选择 TCP,什么时候选 UDP?
选择 TCP 还是 UDP,主要取决于你的应用对数据传输的可靠性要求有多高,以及对实时性和效率的要求有多高。
当数据准确性和完整性至关重要,一点都不能出错时,通常选择 TCP。因为 TCP 提供了一整套机制(三次握手、确认应答、重传、流量控制等)来保证数据能够可靠、有序地送达。典型应用场景如下:
-
Web 浏览 (HTTP/HTTPS): 网页内容、图片、脚本必须完整加载才能正确显示。
-
文件传输 (FTP, SCP): 文件内容不允许有任何字节丢失或错序。
-
邮件收发 (SMTP, POP3, IMAP): 邮件内容需要完整无误地送达。
-
远程登录 (SSH, Telnet): 命令和响应需要准确传输。
-
......
当实时性、速度和效率优先,并且应用能容忍少量数据丢失或乱序时,通常选择 UDP。UDP 开销小、传输快,没有建立连接和保证可靠性的复杂过程。典型应用场景如下:
-
实时音视频通信 (VoIP, 视频会议, 直播): 偶尔丢失一两个数据包(可能导致画面或声音短暂卡顿)通常比因为等待重传(TCP 机制)导致长时间延迟更可接受。应用层可能会有自己的补偿机制。
-
在线游戏: 需要快速传输玩家位置、状态等信息,对实时性要求极高,旧的数据很快就没用了,丢失少量数据影响通常不大。
-
DHCP (动态主机配置协议): 客户端在请求 IP 时自身没有 IP 地址,无法满足 TCP 建立连接的前提条件,并且 DHCP 有广播需求、交互模式简单以及自带可靠性机制。
-
物联网 (IoT) 数据上报: 某些场景下,传感器定期上报数据,丢失个别数据点可能不影响整体趋势分析。