TCP和UDP到底有什么区别?一篇文章彻底搞懂两种网络通信协议
前言
在嵌入式开发、服务器开发、物联网设备以及网络通信领域,经常会遇到两个非常重要的协议:
- TCP
- UDP
很多初学者都会问:
TCP和UDP到底有什么区别?为什么有的软件使用TCP,有的软件使用UDP?
简单来说:
TCP追求可靠传输,UDP追求高速传输。
例如:
- 网页访问使用TCP
- 文件下载使用TCP
- 微信聊天使用TCP
- 视频直播部分场景使用UDP
- 在线游戏大量使用UDP
- 工业实时控制可能使用UDP
但是,仅仅知道“TCP可靠,UDP快”是不够的。
本文将从:
- 网络分层
- 数据传输方式
- 连接建立
- 数据可靠性
- 速度区别
- 使用场景
- 嵌入式开发
几个方面详细介绍TCP和UDP。
一、TCP和UDP属于哪一层?
在学习TCP和UDP之前,需要先了解TCP/IP网络模型。
常见TCP/IP模型:
应用层
|
传输层
|
网络层
|
网络接口层
其中:
应用层
负责具体业务。
例如:
- HTTP
- HTTPS
- MQTT
- Modbus TCP
- FTP
传输层
负责端到端的数据传输。
主要协议:
TCP
UDP
TCP和UDP的作用:
将应用程序的数据交给网络,并负责不同设备之间的数据传输。
网络层
主要协议:
IP协议
负责:
- 寻找目标地址
- 路由选择
- 数据包转发
例如:
192.168.1.100
就是IP地址。
二、TCP和UDP是什么?
1. TCP是什么?
TCP:
Transmission Control Protocol
中文:
传输控制协议
TCP是一种:
- 面向连接
- 可靠
- 面向字节流
的通信协议。
特点:
- 发送前需要建立连接
- 保证数据可靠到达
- 保证数据顺序
- 自动重传错误数据
- 具有流量控制和拥塞控制
简单理解:
TCP像打电话,通信前必须先建立连接。
例如:
A:你好,我准备发送数据
B:收到,可以发送
A:开始发送
B:确认收到
2. UDP是什么?
UDP:
User Datagram Protocol
中文:
用户数据报协议
UDP是一种:
- 无连接
- 不保证可靠
- 面向数据报
的通信协议。
特点:
- 不需要建立连接
- 直接发送数据
- 不保证数据一定到达
- 不保证顺序
- 没有自动重传
简单理解:
UDP像寄普通信件,发出去之后不管结果。
例如:
发送:
你好
然后结束
不会确认:
- 对方是否收到
- 是否丢失
- 是否顺序正确
三、TCP和UDP核心区别总结
| 中文名称 | 传输控制协议 | 用户数据报协议 |
| 连接方式 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不保证可靠 |
| 数据形式 | 字节流 | 数据报 |
| 速度 | 较慢 | 较快 |
| 是否重传 | 支持 | 不支持 |
| 是否排序 | 支持 | 不支持 |
| 是否确认 | 支持 | 不支持 |
| 资源消耗 | 较高 | 较低 |
| 应用场景 | 网页、文件、聊天 | 直播、游戏、实时控制 |
一句话:
TCP:宁愿慢一点,也保证正确
UDP:宁愿丢一点,也保证速度
四、TCP为什么可靠?
TCP可靠主要依靠几个机制:
1. 三次握手建立连接
TCP通信前必须建立连接。
过程:
客户端 服务器
SYN —————->
SYN+ACK <——
ACK —————->
连接建立
分别解释:
第一次握手
客户端发送:
SYN
表示:
我要建立连接。
第二次握手
服务器回复:
SYN + ACK
表示:
我收到你的请求,也准备好了。
第三次握手
客户端发送:
ACK
表示:
收到确认,可以通信。
最终:
TCP连接建立
为什么需要三次握手?
因为双方需要确认:
如果只有两次:
可能出现:
客户端以为连接成功
服务器不知道客户端是否收到确认
所以需要第三次确认。
五、TCP四次挥手关闭连接
TCP关闭连接需要四次。
过程:
客户端 服务器
FIN ————->
ACK <——-
FIN <——-
ACK ————->
连接关闭
原因:
TCP是全双工通信。
两个方向的数据需要分别关闭。
例如:
客户端:
我不发送数据了
但是服务器可能:
还有数据发送
所以需要分别关闭两个方向。
六、UDP为什么不需要握手?
UDP发送数据:
直接发送:
数据
↓
UDP
↓
IP
↓
网络
没有:
- 建立连接
- 确认
- 等待
因此:
速度更快。
例如:
视频直播:
如果等待TCP确认:
发送
等待
确认
重新发送
会产生明显延迟。
UDP:
直接发送下一帧
即使丢失一点数据:
用户也可能感觉不到。
七、TCP如何保证数据可靠?
TCP主要通过以下机制:
1. 序列号(Sequence Number)
TCP给每个数据编号。
例如:
发送:
数据A
编号1
数据B
编号2
数据C
编号3
接收端:
如果收到:
1
3
发现:
缺少2
就知道:
数据B丢失。
2. ACK确认机制
接收端收到数据后:
发送:
ACK
例如:
发送:
数据编号100
回复:
ACK 101
表示:
编号100已经收到。
3. 超时重传
如果发送:
数据1
但是没有收到:
ACK
TCP认为:
可能丢失。
重新发送:
数据1
4. 校验和
TCP包含校验字段:
用于检测:
- 数据损坏
- 传输错误
5. 流量控制
防止:
发送太快。
例如:
接收端处理能力:
10MB/s
发送端:
100MB/s
TCP会自动调整发送速度。
八、UDP为什么速度更快?
UDP少了很多机制:
TCP:
建立连接
↓
发送数据
↓
等待确认
↓
检查顺序
↓
重传
↓
调整速度
UDP:
发送数据
因此:
UDP延迟更低。
九、TCP和UDP的数据格式区别
TCP数据结构
TCP头:
+—————-+
|源端口 |
|目标端口 |
|序列号 |
|确认号 |
|控制标志 |
|窗口大小 |
|校验和 |
+—————-+
|数据
+—————-+
TCP头通常:
20字节以上。
UDP数据结构
UDP头:
+—————-+
|源端口 |
|目标端口 |
|长度 |
|校验和 |
+—————-+
|数据
+—————-+
UDP头固定:
8字节。
因此UDP开销更小。
十、TCP和UDP速度对比
很多人认为:
UDP一定比TCP快。
实际上:
不完全正确。
速度受到:
- 网络环境
- 数据大小
- 延迟要求
- 丢包率
影响。
但是一般情况下:
UDP优势:
- 延迟低
- 协议简单
- 资源占用少
TCP优势:
- 自动处理错误
- 稳定可靠
十一、TCP应用场景
1. HTTP网页访问
浏览网页:
例如:
浏览器
|
TCP
|
服务器
为什么不用UDP?
因为网页数据不能丢。
例如:
网页代码:
<html>
少一个字符:
页面可能错误。
2. 文件传输
例如:
- 下载软件
- 上传文件
- FTP
原因:
文件必须完整。
3. 邮件
例如:
SMTP协议。
邮件内容:
不能丢失。
4. 数据库连接
例如:
MySQL连接。
数据必须可靠。
十二、UDP应用场景
1. 视频直播
例如:
直播画面:
第100帧
第101帧
第102帧
偶尔丢一帧:
影响不大。
但是:
延迟增加:
用户体验下降。
2. 在线游戏
游戏更关注:
实时性。
例如:
玩家移动:
当前位置
如果TCP等待重传:
玩家可能:
瞬移。
3. 语音通话
例如:
VoIP。
丢几个声音包:
还能听懂。
但是延迟:
非常影响体验。
4. 工业实时控制
例如:
机器人控制:
位置数据
速度数据
更关注:
实时响应。
十三、嵌入式开发中的TCP和UDP
在STM32、ESP32、Linux嵌入式设备中,经常使用网络通信。
硬件:
STM32
↓
以太网PHY
↓
RJ45
↓
网络
软件:
Socket接口
↓
TCP/UDP
↓
IP协议
十四、STM32 TCP通信流程
TCP客户端:
初始化网络
↓
创建Socket
↓
连接服务器
↓
发送数据
↓
接收数据
↓
关闭连接
类似:
socket()
connect()
send()
recv()
close()
十五、STM32 UDP通信流程
UDP:
创建Socket
↓
绑定端口
↓
发送数据
↓
接收数据
函数:
socket()
sendto()
recvfrom()
不需要:
connect()
十六、工业通信中如何选择TCP还是UDP?
选择原则:
数据不能丢
选择:
TCP
例如:
- 配置参数
- 文件升级
- 数据上传
数据实时性优先
选择:
UDP
例如:
- 视频
- 控制数据
- 实时状态
数据少但频繁
可以考虑:
UDP
例如:
传感器:
每10ms发送一次状态
十七、TCP和UDP常见误区
误区1:UDP一定不可靠
错误。
UDP本身不保证可靠。
但是应用层可以自己实现:
- ACK
- 重传
- 校验
- 序号
例如:
QUIC协议就是基于UDP实现可靠传输。
误区2:TCP一定慢
错误。
TCP经过优化后:
高速网络下性能非常高。
误区3:UDP没有连接
准确来说:
UDP没有传输层连接。
但是应用程序可以维护逻辑连接。
误区4:TCP一次发送对应一次接收
错误。
TCP是字节流。
例如发送:
hello
world
接收可能:
helloworld
或者:
hello
wor
ld
需要应用层自己定义协议。
十八、TCP和UDP如何选择?
总结:
| 网页访问 | TCP |
| 文件传输 | TCP |
| 数据库 | TCP |
| 聊天消息 | TCP |
| 视频直播 | UDP |
| 在线游戏 | UDP |
| 语音通话 | UDP |
| 实时控制 | UDP |
| 可靠数据采集 | TCP |
十九、总结
TCP和UDP最大的区别:
不是速度。
而是:
是否愿意牺牲速度换取可靠性。
TCP:
连接
确认
排序
重传
可靠
UDP:
简单
快速
低延迟
不保证可靠
记忆:
TCP:
像打电话
先建立连接,
确认身份,
保证每句话听清。
UDP:
像广播喊话
直接发送,
速度最快,
但可能有人没听见。
在嵌入式、物联网和工业通信领域:
- 配置数据
- 文件传输
- 设备管理
通常选择TCP。
而:
- 实时控制
- 状态广播
- 高频数据
通常选择UDP。
真正优秀的工程设计,不是选择更先进的协议,而是根据应用场景选择最合适的通信方式。
、






