TCP 与 UDP 协议对比

1. 核心概念:面向报文 vs 面向字节流
面向报文的传输方式:应用层交给 UDP 多长的报文,UDP 就原样发送,即一次发送一个报文。发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付给 IP 层。UDP 既不拆分,也不合并,而是保留报文的边界。因此,应用程序需要选择合适的报文大小。
面向字节流的传输方式:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序看成是一连串的无结构的字节流。TCP 有缓冲区,当应用程序传送的数据块太长,TCP 就可以把它划分短一些再传送;如果应用程序一次只发送一个字节,TCP 也可以等待积累有足够多的字节后再构成报文段发送出去。
2. TCP 协议:可靠传输的基石
2.1 协议特性
- 全称:Transmission Control Protocol(传输控制协议)。
- 面向连接:传输数据前必须先建立逻辑连接。
- 可靠性:通过确认应答、序列号、重传机制保证数据不丢失、不重复、按序到达。
- 报头长度:最小 20 字节。
2.2 连接管理:三次握手与四次挥手
三次握手过程
- 客户端发送:SYN = 1, SEQ = X,指定初始序号。
- 服务器回复:SYN = 1, ACK = X + 1, SEQ = Y,确认收到并发送自己的序号。
- 客户端确认:ACK = Y + 1, SEQ = X + 1,连接建立完成。
注意:连接建立过程中,同步信号 SYN 始终为 1。连接建立后,SYN = 0。确认应答信号 ACK 始终等于收到的 SEQ + 1。
四次挥手过程
- A 发起关闭:发送 FIN = 1。
- B 确认:发送 ACK = 1。
- B 发起关闭:发送 FIN = 1。
- 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 核心差异概览
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 面向无连接 |
| 可靠性 | 可靠传输(无丢失、不重复、有序) | 不可靠(尽力而为,可能丢包) |
| 排序 | 保证数据顺序 | 不保证顺序 |
| 边界 | 字节流(无边界) | 报文(有边界) |
| 传输速度 | 较慢(握手及控制开销) | 极快(无额外控制) |
| 通信模式 | 一对一 | 一对一、一对多、多对多 |
| 报头开销 | 20 ~ 60 字节 | 8 字节 |
| 控制机制 | 流量控制、拥塞控制 | 无 |
4.2 关键性能维度对比
- 为什么 UDP 比 TCP 快?
- TCP 需要三次握手建立连接。
- TCP 有复杂的拥塞控制和流量控制机制。
- 为什么 TCP 比 UDP 可靠?
- 面向连接:确保对方在线才发送。
- 确认重传:丢失数据会自动补发,UDP 则是“发后即忘”。
5. 场景化应用:如何选择协议?
5.1 什么时候使用 TCP?
当对 网络通讯质量 有严格要求,需要数据准确无误地传递给对方时。
- 典型应用:浏览器访问(HTTP/HTTPS)、文件传输(FTP)、邮件收发(POP3/SMTP)。
5.2 什么时候使用 UDP?
当对 传输速度 要求极高,而对少量丢包不敏感时。
- 典型应用:实时音视频(QQ 语音/视频)、流媒体直播、DNS 查询、TFTP。
6. 深入理解:数据的边界问题
- TCP 无边界:客户端分多次发送数据给服务器,若服务器缓冲区足够大,可能会一次性接收全部数据,这种现象常被称为“粘包”。
- UDP 有边界:客户端每发送一次,服务器端就会接收一次。发送次数与接收次数一一对应。
