TCP与UDP:传输层两大协议的深度对比
概述
TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是互联网传输层的两大核心协议。它们各有特点,适用于不同的应用场景。
基本概念
TCP
TCP是一种面向连接的、可靠的、基于字节流的传输层协议。它确保数据完整、有序地到达目的地。
code
客户端 服务器
|---- SYN ------------->|
|<--- SYN+ACK ---------|
|---- ACK ------------->|
|==== 连接建立 ==========|
|---- 数据传输 --------->
|<--- 数据传输 --------->
|---- FIN ------------->|
|<--- FIN+ACK ---------|
|---- ACK ------------->|
|==== 连接关闭 ==========|
UDP
UDP是一种无连接的、不可靠的、基于数据报的传输层协议。它不保证数据的可靠传输,但速度快、开销小。
code
客户端 服务器
|---- 数据报 ---------->|
|---- 数据报 ---------->|
|---- 数据报 ---------->|
(无连接建立过程)
核心区别对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠传输 | 不可靠传输 |
| 顺序保证 | 保证数据顺序 | 不保证顺序 |
| 传输方式 | 字节流 | 数据报 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有 | 无 |
| 头部大小 | 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后关闭)
可靠性保证
- 校验和:检测数据在传输过程中是否损坏
- 序列号:确保数据按序到达
- 确认应答:接收方确认收到数据
- 超时重传:发送方未收到确认时重传
- 连接管理:建立和关闭连接的机制
流量控制
使用滑动窗口机制,接收方告知发送方自己的接收窗口大小:
code
发送方 接收方
|---- 数据 (seq=1) --------->|
|<--- ACK (ack=2, win=4096) -|
|---- 数据 (seq=2) --------->|
|<--- ACK (ack=3, win=4096) -|
拥塞控制
TCP使用四种算法控制网络拥塞:
- 慢启动:初始拥塞窗口小,指数增长
- 拥塞避免:达到阈值后线性增长
- 快重传:收到3个重复ACK立即重传
- 快恢复:收到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位)
特点
- 无连接:发送数据前不需要建立连接
- 不可靠:不保证数据到达,不保证顺序
- 高效:头部小,处理简单
- 支持广播:可以一对多传输
应用场景
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)