# TCP 和 UDP 有什么区别?
Table of Contents
TCP 和 UDP 有什么区别?
TCP 与 UDP 的区别
【核心定义】
TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议;UDP 是一种无连接的、不可靠的、基于数据报的传输层通信协议。
【关键要点】
-
连接方式
- TCP:面向连接。通信前必须通过“三次握手”建立连接,通信结束后通过“四次挥手”释放连接。
- UDP:无连接。发送数据前无需建立连接,直接发送。
-
可靠性
- TCP:提供可靠交付。通过确认应答(ACK)、超时重传、流量控制(滑动窗口)、拥塞控制等机制保证数据无差错、不丢失、不重复、按序到达。
- UDP:尽最大努力交付。不保证可靠性,可能丢包、乱序。
-
传输单位与模式
- TCP:基于字节流。将数据视为无结构的字节序列,没有固定边界。传输是全双工的。
- UDP:基于数据报。每个报文有明确边界,一次发送一个完整报文。支持一对一、一对多、多对多通信。
-
首部开销
- TCP:首部至少20字节,包含序列号、确认号、窗口大小等复杂字段。
- UDP:首部固定8字节,结构简单。
-
传输效率
- TCP:由于建立连接、确认、重传等机制,延迟较高,传输效率相对较低。
- UDP:无连接、无确认,延迟低,传输效率高。
【深度推导/细节】
TCP 如何保证可靠性?(逻辑拆解)
- Step 1: 确认与重传:发送方每发送一个数据段,都启动一个重传计时器。接收方成功接收后,会回复一个带有ACK号的确认报文。若发送方在计时器超时前未收到ACK,则重发该数据。
- Step 2: 数据排序:每个TCP报文都有序列号(SEQ)。接收方根据序列号对乱序到达的数据进行排序,确保提交给应用层的数据是有序的。
- Step 3: 流量控制:接收方通过TCP首部中的窗口字段告知发送方自己剩余的缓冲区大小(接收窗口 rwnd),发送方据此调整发送速率,防止接收方缓冲区溢出。
- Step 4: 拥塞控制:发送方通过维护一个拥塞窗口(cwnd) 来探测网络容量,采用慢启动、拥塞避免、快重传、快恢复算法动态调整发送速率,避免网络过载。
UDP 的“不可靠”意味着什么?
UDP的不可靠是协议层面的设计选择,它把可靠性、顺序、去重等责任完全交给了应用层。这使得它在需要低延迟、能容忍部分数据丢失的场景(如音视频流、DNS查询、实时游戏)中具有不可替代的优势。应用层可以根据需要,在UDP之上实现自定义的、更轻量级的可靠机制。
【关联/对比】
| 特性维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 高可靠,保证交付 | 不可靠,尽最大努力 |
| 传输模式 | 字节流,无边界的连续数据 | 数据报,有明确边界的独立报文 |
| 复杂度与开销 | 高(首部大,机制复杂) | 低(首部小,机制简单) |
| 速度与延迟 | 较慢,延迟较高 | 快,延迟低 |
| 适用场景 | 文件传输、邮件、网页浏览等要求精确的场景 | 视频流、语音通话、DNS、QUIC、实时游戏等 |
与QUIC协议的关联:QUIC(基于UDP)是新一代传输协议,它在UDP不可靠的基础上,在用户空间实现了类似TCP的可靠传输、流量控制和拥塞控制,同时整合了TLS加密,旨在解决TCP的队头阻塞和握手延迟问题。这体现了“底层用UDP保证效率,上层实现逻辑保证可靠”的设计思想。
『面试官追问』
-
TCP的“流”具体是什么意思?和UDP的“数据报”在编程接口上有什么体现?
- TCP:在接收方,
read()调用可能返回发送方多次write()写入数据的任意组合,因为数据没有边界。应用层需要自己定义消息边界(如长度前缀、分隔符)。 - UDP:一个
sendto()发送的数据,必然由一个recvfrom()完整接收,报文边界得以保留。
- TCP:在接收方,
-
TCP的拥塞控制具体算法是怎样的?
- 慢启动:连接开始时或超时后,cwnd从1个MSS开始,每收到一个ACK,cwnd指数增长(翻倍)。
- 拥塞避免:当cwnd达到慢启动阈值(ssthresh)后,转为线性增长(每RTT增加1个MSS)。
- 快重传:收到3个重复ACK时,立即重传丢失的报文,而不必等待超时。
- 快恢复:触发快重传后,将ssthresh设为当前cwnd的一半,cwnd设为新的ssthresh(或+3),直接进入拥塞避免阶段。
-
什么场景下,即使要求可靠,也会选择UDP而不是TCP?
- 对延迟极度敏感:如实时竞技游戏,丢失一帧旧数据比等待重传新数据更重要。
- 需要自定义可靠策略:如音视频流,可以只对关键帧(I帧)要求可靠,对非关键帧(P/B帧)允许丢失。
- 大规模并发连接:如物联网(IoT),TCP的连接和维护开销过大。
- 作为新协议的基础:如QUIC、某些RPC框架,在UDP上构建更适合自己业务逻辑的可靠传输层。
-
TCP和UDP可以绑定同一个端口吗?
- 可以。因为TCP和UDP是完全独立的协议,它们的端口号空间是分开的。一个进程可以同时监听同一个端口号的TCP连接和UDP报文。
总结选择心法:要可靠、有序、大数据量,选TCP;要速度、低延迟、能容忍丢失,或需要广播/多播,选UDP。 现代架构中,两者并非互斥,常结合使用(如QUIC),或在应用层根据数据类型混合使用(如视频会议中,信令用TCP,媒体流用UDP)。