Skip to content

TCP 与 UDP 协议对比

tcpip思维导图

1. 核心概念:面向报文 vs 面向字节流

面向报文的传输方式:应用层交给 UDP 多长的报文,UDP 就原样发送,即一次发送一个报文。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。UDP 既不拆分,也不合并,而是保留报文的边界。因此,应用程序需要选择合适的报文大小。

面向字节流的传输方式:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序看成是一连串的无结构的字节流。TCP 有缓冲区,当应用程序传送的数据块太长,TCP 就可以把它划分短一些再传送;如果应用程序一次只发送一个字节,TCP 也可以等待积累有足够多的字节后再构成报文段发送出去。

2. TCP 协议:可靠传输的基石

2.1 协议特性

  • 全称:Transmission Control Protocol(传输控制协议)。
  • 面向连接:传输数据前必须先建立逻辑连接。
  • 可靠性:通过确认应答、序列号、重传机制保证数据不丢失、不重复、按序到达。
  • 报头长度:最小 20 字节。

2.2 连接管理:三次握手与四次挥手

三次握手过程

  1. 客户端发送:SYN = 1, SEQ = X,指定初始序号。
  2. 服务器回复:SYN = 1, ACK = X + 1, SEQ = Y,确认收到并发送自己的序号。
  3. 客户端确认:ACK = Y + 1, SEQ = X + 1,连接建立完成。

注意:连接建立过程中,同步信号 SYN 始终为 1。连接建立后,SYN = 0。确认应答信号 ACK 始终等于收到的 SEQ + 1。

四次挥手过程

  1. A 发起关闭:发送 FIN = 1。
  2. B 确认:发送 ACK = 1。
  3. B 发起关闭:发送 FIN = 1。
  4. A 确认:发送 ACK = 1,连接正式断开。

2.3 优缺点分析

优点:

  • 可靠稳定:建立连接、确认应答、窗口控制、拥塞控制、重传机制。
  • 有序传输:利用 SEQ 和 ACK 机制保证接收端按序组装数据。

缺点:

  • 效率较低:建立/断开连接的耗时,以及传输过程中的确认机制会占用系统资源(CPU/内存)。
  • 安全性挑战:容易受到利用连接机制的攻击,如 SYN Flood (DOS/DDOS)。

3. UDP 协议:高效的数据传输

3.1 协议特性

  • 全称:User Datagram Protocol(用户数据报协议)。
  • 无连接:发送数据前无需建立连接,即刻发送。
  • 报头长度:仅 8 字节,额外开销极小。

3.2 运行机制与简介

  • 尽力而为:不保证可靠交付,不需要维护复杂的连接状态表。
  • 吞吐量大:不受拥塞控制算法调节,仅受应用生成速率和带宽限制。
  • 支持多播/广播:一台服务器可同时向多个客户机传输相同消息。

ping 命令原理:通过向目标主机发送数据包(通常基于 ICMP,部分实现模拟 UDP 行为),测试网络连通性。

3.3 优缺点分析

优点:

  • 传输速度快:无需握手,无拥塞控制。
  • 资源占用少:报头短,协议栈处理逻辑简单。

缺点:

  • 不可靠:网络拥堵时容易丢包。
  • 不稳定:没有重传机制。

3.4 进阶:基于 UDP 实现可靠传输

如果需要在 UDP 上实现可靠性,可以仿造 TCP 的做法:在应用层为每个 UDP 包添加 SEQ 序号,接收方收到后回复确认。若发送方在指定时间内未收到回复,则执行重传逻辑(如 KCP 协议)。

4. TCP 与 UDP 深度对比

4.1 核心差异概览

特性TCPUDP
连接性面向连接面向无连接
可靠性可靠传输(无丢失、不重复、有序)不可靠(尽力而为,可能丢包)
排序保证数据顺序不保证顺序
边界字节流(无边界)报文(有边界)
传输速度较慢(握手及控制开销)极快(无额外控制)
通信模式一对一一对一、一对多、多对多
报头开销20 ~ 60 字节8 字节
控制机制流量控制、拥塞控制

4.2 关键性能维度对比

  • 为什么 UDP 比 TCP 快?
    1. TCP 需要三次握手建立连接。
    2. TCP 有复杂的拥塞控制和流量控制机制。
  • 为什么 TCP 比 UDP 可靠?
    1. 面向连接:确保对方在线才发送。
    2. 确认重传:丢失数据会自动补发,UDP 则是“发后即忘”。

5. 场景化应用:如何选择协议?

5.1 什么时候使用 TCP?

当对 网络通讯质量 有严格要求,需要数据准确无误地传递给对方时。

  • 典型应用:浏览器访问(HTTP/HTTPS)、文件传输(FTP)、邮件收发(POP3/SMTP)。

5.2 什么时候使用 UDP?

当对 传输速度 要求极高,而对少量丢包不敏感时。

  • 典型应用:实时音视频(QQ 语音/视频)、流媒体直播、DNS 查询、TFTP。

6. 深入理解:数据的边界问题

  • TCP 无边界:客户端分多次发送数据给服务器,若服务器缓冲区足够大,可能会一次性接收全部数据,这种现象常被称为“粘包”。
  • UDP 有边界:客户端每发送一次,服务器端就会接收一次。发送次数与接收次数一一对应。