# TCP 和 UDP 有什么区别?

8 min read
Table of Contents

TCP 和 UDP 有什么区别?

TCP 与 UDP 的区别

【核心定义】

TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议;UDP 是一种无连接的、不可靠的、基于数据报的传输层通信协议。

【关键要点】

  1. 连接方式

    • TCP:面向连接。通信前必须通过“三次握手”建立连接,通信结束后通过“四次挥手”释放连接。
    • UDP:无连接。发送数据前无需建立连接,直接发送。
  2. 可靠性

    • TCP:提供可靠交付。通过确认应答(ACK)、超时重传、流量控制(滑动窗口)、拥塞控制等机制保证数据无差错、不丢失、不重复、按序到达。
    • UDP:尽最大努力交付。不保证可靠性,可能丢包、乱序。
  3. 传输单位与模式

    • TCP:基于字节流。将数据视为无结构的字节序列,没有固定边界。传输是全双工的。
    • UDP:基于数据报。每个报文有明确边界,一次发送一个完整报文。支持一对一、一对多、多对多通信。
  4. 首部开销

    • TCP:首部至少20字节,包含序列号、确认号、窗口大小等复杂字段。
    • UDP:首部固定8字节,结构简单。
  5. 传输效率

    • TCP:由于建立连接、确认、重传等机制,延迟较高,传输效率相对较低。
    • UDP:无连接、无确认,延迟低,传输效率高。

【深度推导/细节】

TCP 如何保证可靠性?(逻辑拆解)

  • Step 1: 确认与重传:发送方每发送一个数据段,都启动一个重传计时器。接收方成功接收后,会回复一个带有ACK号的确认报文。若发送方在计时器超时前未收到ACK,则重发该数据。
  • Step 2: 数据排序:每个TCP报文都有序列号(SEQ)。接收方根据序列号对乱序到达的数据进行排序,确保提交给应用层的数据是有序的。
  • Step 3: 流量控制:接收方通过TCP首部中的窗口字段告知发送方自己剩余的缓冲区大小(接收窗口 rwnd),发送方据此调整发送速率,防止接收方缓冲区溢出。
  • Step 4: 拥塞控制:发送方通过维护一个拥塞窗口(cwnd) 来探测网络容量,采用慢启动、拥塞避免、快重传、快恢复算法动态调整发送速率,避免网络过载。

UDP 的“不可靠”意味着什么?

UDP的不可靠是协议层面的设计选择,它把可靠性、顺序、去重等责任完全交给了应用层。这使得它在需要低延迟、能容忍部分数据丢失的场景(如音视频流、DNS查询、实时游戏)中具有不可替代的优势。应用层可以根据需要,在UDP之上实现自定义的、更轻量级的可靠机制。

【关联/对比】

特性维度TCPUDP
连接性面向连接无连接
可靠性高可靠,保证交付不可靠,尽最大努力
传输模式字节流,无边界的连续数据数据报,有明确边界的独立报文
复杂度与开销高(首部大,机制复杂)低(首部小,机制简单)
速度与延迟较慢,延迟较高快,延迟低
适用场景文件传输、邮件、网页浏览等要求精确的场景视频流、语音通话、DNS、QUIC、实时游戏等

与QUIC协议的关联:QUIC(基于UDP)是新一代传输协议,它在UDP不可靠的基础上,在用户空间实现了类似TCP的可靠传输、流量控制和拥塞控制,同时整合了TLS加密,旨在解决TCP的队头阻塞和握手延迟问题。这体现了“底层用UDP保证效率,上层实现逻辑保证可靠”的设计思想。

『面试官追问』

  1. TCP的“流”具体是什么意思?和UDP的“数据报”在编程接口上有什么体现?

    • TCP:在接收方,read() 调用可能返回发送方多次 write() 写入数据的任意组合,因为数据没有边界。应用层需要自己定义消息边界(如长度前缀、分隔符)。
    • UDP:一个 sendto() 发送的数据,必然由一个 recvfrom() 完整接收,报文边界得以保留。
  2. TCP的拥塞控制具体算法是怎样的?

    • 慢启动:连接开始时或超时后,cwnd从1个MSS开始,每收到一个ACK,cwnd指数增长(翻倍)。
    • 拥塞避免:当cwnd达到慢启动阈值(ssthresh)后,转为线性增长(每RTT增加1个MSS)。
    • 快重传:收到3个重复ACK时,立即重传丢失的报文,而不必等待超时。
    • 快恢复:触发快重传后,将ssthresh设为当前cwnd的一半,cwnd设为新的ssthresh(或+3),直接进入拥塞避免阶段。
  3. 什么场景下,即使要求可靠,也会选择UDP而不是TCP?

    • 对延迟极度敏感:如实时竞技游戏,丢失一帧旧数据比等待重传新数据更重要。
    • 需要自定义可靠策略:如音视频流,可以只对关键帧(I帧)要求可靠,对非关键帧(P/B帧)允许丢失。
    • 大规模并发连接:如物联网(IoT),TCP的连接和维护开销过大。
    • 作为新协议的基础:如QUIC、某些RPC框架,在UDP上构建更适合自己业务逻辑的可靠传输层。
  4. TCP和UDP可以绑定同一个端口吗?

    • 可以。因为TCP和UDP是完全独立的协议,它们的端口号空间是分开的。一个进程可以同时监听同一个端口号的TCP连接和UDP报文。

总结选择心法:要可靠、有序、大数据量,选TCP;要速度、低延迟、能容忍丢失,或需要广播/多播,选UDP。 现代架构中,两者并非互斥,常结合使用(如QUIC),或在应用层根据数据类型混合使用(如视频会议中,信令用TCP,媒体流用UDP)。

My avatar

文章看完了,不打算去别的篇章转转吗?👀 感谢你的耐心阅读!如果你有问题想探讨,或者发现了文中的 Bug,请务必通过页脚的链接联系我


More Posts

# TCP 滑动窗口的作用是什么?

7 min read

TCP 滑动窗口是一种流量控制与拥塞控制机制,它通过动态调整发送方与接收方之间的数据窗口大小,在保证可靠传输的前提下,最大限度地提升网络吞吐量,并避免因发送过快而导致的数据包丢失或网络拥塞。

Read

Comments