Journal Article

TCP与UDP:传输层两大协议的深度对比

深入对比TCP与UDP的核心区别,包括连接方式、可靠性、性能差异及应用场景,帮助开发者正确选择传输协议。

6 min9 views

TCP与UDP:传输层两大协议的深度对比

概述

TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是互联网传输层的两大核心协议。它们各有特点,适用于不同的应用场景。

基本概念

TCP

TCP是一种面向连接的、可靠的、基于字节流的传输层协议。它确保数据完整、有序地到达目的地。

code
客户端                    服务器
  |---- SYN ------------->|
  |<--- SYN+ACK ---------|
  |---- ACK ------------->|
  |==== 连接建立 ==========|
  |---- 数据传输 --------->
  |<--- 数据传输 --------->
  |---- FIN ------------->|
  |<--- FIN+ACK ---------|
  |---- ACK ------------->|
  |==== 连接关闭 ==========|

UDP

UDP是一种无连接的、不可靠的、基于数据报的传输层协议。它不保证数据的可靠传输,但速度快、开销小。

code
客户端                    服务器
  |---- 数据报 ---------->|
  |---- 数据报 ---------->|
  |---- 数据报 ---------->|
  (无连接建立过程)

核心区别对比

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性可靠传输不可靠传输
顺序保证保证数据顺序不保证顺序
传输方式字节流数据报
流量控制有(滑动窗口)
拥塞控制
头部大小20-60字节8字节
传输效率较低较高
资源消耗较大较小

TCP详解

三次握手

建立连接的过程,确保双方都能收发数据:

code
第一次握手:客户端 -> 服务器
SYN=1, seq=x
(客户端进入SYN_SENT状态)

第二次握手:服务器 -> 客户端
SYN=1, ACK=1, seq=y, ack=x+1
(服务器进入SYN_RCVD状态)

第三次握手:客户端 -> 服务器
ACK=1, seq=x+1, ack=y+1
(双方进入ESTABLISHED状态)

四次挥手

断开连接的过程:

code
第一次挥手:客户端 -> 服务器
FIN=1, seq=u
(客户端进入FIN_WAIT_1状态)

第二次挥手:服务器 -> 客户端
ACK=1, ack=u+1
(服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态)

第三次挥手:服务器 -> 客户端
FIN=1, seq=w
(服务器进入LAST_ACK状态)

第四次挥手:客户端 -> 服务器
ACK=1, ack=w+1
(客户端进入TIME_WAIT状态,等待2MSL后关闭)

可靠性保证

  1. 校验和:检测数据在传输过程中是否损坏
  2. 序列号:确保数据按序到达
  3. 确认应答:接收方确认收到数据
  4. 超时重传:发送方未收到确认时重传
  5. 连接管理:建立和关闭连接的机制

流量控制

使用滑动窗口机制,接收方告知发送方自己的接收窗口大小:

code
发送方                          接收方
  |---- 数据 (seq=1) --------->|
  |<--- ACK (ack=2, win=4096) -|
  |---- 数据 (seq=2) --------->|
  |<--- ACK (ack=3, win=4096) -|

拥塞控制

TCP使用四种算法控制网络拥塞:

  1. 慢启动:初始拥塞窗口小,指数增长
  2. 拥塞避免:达到阈值后线性增长
  3. 快重传:收到3个重复ACK立即重传
  4. 快恢复:收到3个重复ACK后不回到慢启动

UDP详解

数据报格式

code
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Length             |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
/                           Data                                /
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • 源端口:发送方端口号(16位)
  • 目的端口:接收方端口号(16位)
  • 长度:UDP头部+数据的长度(16位)
  • 校验和:可选,用于错误检测(16位)

特点

  1. 无连接:发送数据前不需要建立连接
  2. 不可靠:不保证数据到达,不保证顺序
  3. 高效:头部小,处理简单
  4. 支持广播:可以一对多传输

应用场景

TCP应用场景

  • Web浏览:HTTP/HTTPS使用TCP
  • 文件传输:FTP、SFTP使用TCP
  • 电子邮件:SMTP、POP3、IMAP使用TCP
  • 远程登录:SSH、Telnet使用TCP
  • 数据库:MySQL、PostgreSQL使用TCP
javascript
// TCP Socket示例(Node.js)
const net = require('net');

const server = net.createServer((socket) => {
  socket.on('data', (data) => {
    console.log('收到数据:', data.toString());
    socket.write('确认收到');
  });
});

server.listen(3000);

UDP应用场景

  • 视频流媒体:RTMP、RTP使用UDP
  • 在线游戏:实时性要求高
  • DNS查询:域名解析使用UDP
  • VoIP:网络电话使用UDP
  • 广播/多播:网络广播使用UDP
javascript
// UDP Socket示例(Node.js)
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log('收到消息:', msg.toString());
  console.log('来自:', rinfo.address, rinfo.port);
});

server.bind(3000);

性能对比

延迟

  • TCP:需要建立连接,有确认等待
  • UDP:直接发送,无等待时间

吞吐量

  • TCP:有拥塞控制,吞吐量受限
  • UDP:无限制,但可能导致网络拥塞

资源消耗

  • TCP:需要维护连接状态,内存消耗大
  • UDP:无状态,资源消耗小

可靠UDP实现

在UDP基础上实现可靠性:

code
应用层协议设计:
1. 序列号:确保数据顺序
2. 确认机制:ACK确认收到
3. 超时重传:未收到ACK时重传
4. 滑动窗口:控制发送速率

常用方案:
- QUIC(HTTP/3使用)
- KCP(国产开源协议)
- WebRTC(实时通信)

选择建议

选择TCP

  • 数据完整性要求高
  • 不容忍数据丢失
  • 对延迟不敏感
  • 需要有序传输

选择UDP

  • 实时性要求高
  • 可容忍少量丢包
  • 需要广播/多播
  • 资源受限环境

总结

TCP和UDP是互联网的两大基石:

  • TCP:可靠、有序、效率较低
  • UDP:高效、实时、不可靠

理解它们的区别,才能在开发中做出正确的选择。现代网络应用中,两者常常结合使用,比如QUIC协议在UDP基础上实现了TCP的可靠性。


本文最后更新于2026年7月

相关推荐

评论 (0)

加载评论中...