【前端面试小册】网络-第7节:TCP 与 UDP
一、概述
TCP 和 UDP 都是传输层协议,它们负责在网络中传输数据。虽然都属于传输层,但它们的特点和适用场景完全不同。
类比理解:
- TCP:就像打电话,需要先接通(三次握手),通话质量有保障,说完再挂断(四次挥手)
- UDP:就像寄明信片,写完直接投递,不管对方有没有收到
二、TCP 协议
2.1 TCP 是什么
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
核心特点:
- 面向连接
- 可靠传输
- 有序传输
- 流量控制
- 拥塞控制
2.2 TCP 的特性
面向连接
含义:使用 TCP 前必须先建立 TCP 连接(三次握手),在传送数据完毕后还要释放已经建立的 TCP 连接(四次挥手)。
流程:
graph LR
A[建立连接] --> B[传输数据]
B --> C[释放连接]
可靠传输
保证机制:
- 确认应答:接收方收到数据后发送确认
- 超时重传:发送方没收到确认会重传
- 数据校验:检验和校验数据完整性
- 序列号:保证数据有序
- 流量控制:防止发送过快
- 拥塞控制:防止网络拥塞
有序传输
TCP 通过序列号保证数据按顺序到达和组装。
示例:
发送:数据1 → 数据2 → 数据3
接收:数据1 → 数据2 → 数据3(顺序一致)
流量控制
使用滑动窗口机制,控制发送速率,防止接收方来不及处理。
原理:
- 接收方通过窗口大小告诉发送方自己的接收能力
- 发送方根据窗口大小调整发送速率
拥塞控制
防止过多的数据注入到网络中,避免网络过载。
算法:
- 慢启动:指数增长
- 拥塞避免:线性增长
- 快重传:提前重传
- 快恢复:快速恢复
2.3 TCP 报文结构
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
关键字段:
- 源端口/目的端口:标识通信端点
- 序列号:保证数据有序
- 确认号:确认收到的数据
- 标志位:SYN、ACK、FIN 等
- 窗口大小:流量控制
三、UDP 协议
3.1 UDP 是什么
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
核心特点:
- 无连接
- 不可靠
- 高效快速
- 支持广播
3.2 UDP 的特性
无连接
含义:不需要建立连接就可以直接发送数据。
优点:
- 减少延迟
- 减少开销
- 更快的传输速度
不可靠
表现:
- 不保证数据一定到达
- 不保证数据顺序
- 不保证数据完整性(只有简单校验)
- 没有重传机制
面向报文
UDP 对应用层交下来的报文,不合并,不拆分,只是添加 UDP 首部。
特点:
- 保留报文边界
- 适合一次性传输少量数据
支持一对一、一对多、多对多
UDP 支持:
- 单播:一对一
- 广播:一对所有
- 多播:一对多
3.3 UDP 报文结构
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
| |
| Data octets ... |
+-----------------------------------+
字段说明:
- 源端口:16 位
- 目的端口:16 位
- 长度:UDP 数据报长度
- 校验和:可选的错误检查
特点:UDP 首部只有 8 个字节,非常简单。
四、TCP 与 UDP 对比
4.1 详细对比表格
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不可靠传输 |
| 有序性 | 保证有序 | 不保证有序 |
| 速度 | 较慢 | 较快 |
| 资源消耗 | 较大 | 较小 |
| 首部大小 | 20-60 字节 | 8 字节 |
| 全双工 | 是 | 是 |
| 流量控制 | 有 | 无 |
| 拥塞控制 | 有 | 无 |
| 应用场景 | 文件传输、邮件、网页 | 视频、语音、直播 |
4.2 优缺点对比
TCP 优缺点
优点:
- ✅ 可靠传输,保证数据完整性
- ✅ 有序传输,保证数据顺序
- ✅ 有流量控制和拥塞控制
- ✅ 适合大数据传输
缺点:
- ❌ 建立连接有延迟(三次握手)
- ❌ 占用系统资源多
- ❌ 速度相对较慢
- ❌ 不支持广播和多播
UDP 优缺点
优点:
- ✅ 速度快,延迟低
- ✅ 占用资源少
- ✅ 支持广播和多播
- ✅ 适合实时应用
缺点:
- ❌ 不可靠,可能丢包
- ❌ 不保证顺序
- ❌ 无流量控制
- ❌ 无拥塞控制
五、应用场景
5.1 TCP 适用场景
文件传输
// HTTP 文件下载
fetch('https://example.com/file.zip')
.then(response => response.blob())
.then(blob => {
// 下载文件
});
原因:需要保证文件完整性,不能丢失任何数据。
网页浏览
// HTTP/HTTPS 请求
fetch('https://example.com/api/data')
.then(response => response.json())
.then(data => console.log(data));
原因:需要保证数据完整和有序。
邮件发送
协议:SMTP、POP3、IMAP
原因:邮件内容不能有任何丢失。
远程登录
协议:SSH、Telnet
原因:需要可靠的命令传输。
5.2 UDP 适用场景
视频直播
// WebRTC 视频通话
const peerConnection = new RTCPeerConnection();
// UDP 传输视频流
原因:
- 实时性要求高
- 丢失少量数据包不影响观看
- 可以容忍一定的画质损失
语音通话
协议:VoIP
原因:
- 实时性要求高
- 延迟比可靠性更重要
- 丢失少量数据可以容忍
在线游戏
// 游戏状态同步(伪代码)
socket.send({
type: 'position',
x: player.x,
y: player.y
});
原因:
- 需要低延迟
- 旧的位置信息可以丢弃
- 最新状态更重要
DNS 查询
# DNS 查询使用 UDP
nslookup www.example.com
原因:
- 查询数据量小
- 需要快速响应
- 如果失败可以重试
广播/多播
// IPTV、组播视频
原因:
- TCP 不支持广播和多播
- UDP 支持一对多传输
六、选择建议
6.1 选择 TCP 的情况
✅ 数据不能丢失(文件、邮件) ✅ 数据顺序重要(网页、数据库) ✅ 需要可靠传输 ✅ 数据量较大
6.2 选择 UDP 的情况
✅ 实时性要求高(视频、语音) ✅ 可以容忍少量丢包 ✅ 数据量小 ✅ 需要广播/多播 ✅ 需要低延迟
6.3 实际案例分析
HTTP/HTTPS 为什么使用 TCP?
原因:
- 网页内容不能丢失
- 需要保证数据完整性
- 顺序很重要(HTML、CSS、JS 要按顺序加载)
直播为什么使用 UDP?
原因:
- 实时性最重要
- 丢失几帧画面可以接受
- 延迟比完整性更重要
- 不需要重传旧数据
七、混合使用
7.1 QUIC 协议
QUIC(Quick UDP Internet Connections)是 Google 开发的基于 UDP 的传输层协议,结合了 TCP 和 UDP 的优点。
特点:
- 基于 UDP
- 实现了 TCP 的可靠传输
- 更快的连接建立(0-RTT)
- 更好的拥塞控制
应用:HTTP/3 使用 QUIC 协议
7.2 应用层可靠性
在 UDP 之上实现应用层的可靠性机制:
// 自定义可靠 UDP(伪代码)
class ReliableUDP {
send(data) {
const packet = {
seq: this.seq++,
data: data,
timestamp: Date.now()
};
this.sendPacket(packet);
this.waitForAck(packet);
}
waitForAck(packet) {
setTimeout(() => {
if (!this.acked[packet.seq]) {
this.send(packet.data); // 重传
}
}, 1000);
}
}
八、面试要点总结
核心知识点
- TCP:面向连接、可靠、有序、慢
- UDP:无连接、不可靠、快速、支持广播
- 三次握手:TCP 建立连接的过程
- 四次挥手:TCP 断开连接的过程
- 应用场景:根据需求选择合适的协议
常见面试题
Q1: TCP 和 UDP 的区别?
答:
- 连接:TCP 面向连接,UDP 无连接
- 可靠性:TCP 可靠,UDP 不可靠
- 速度:TCP 慢,UDP 快
- 场景:TCP 用于文件传输、网页;UDP 用于视频、游戏
Q2: 为什么 TCP 可靠,UDP 不可靠?
答:
- TCP 有确认应答、超时重传、流量控制、拥塞控制
- UDP 没有这些机制,发送后不管是否到达
Q3: 什么场景下用 UDP?
答:
- 实时性要求高的场景(视频、语音、游戏)
- 可以容忍少量丢包
- 需要广播/多播
实战建议
- ✅ 理解 TCP 和 UDP 的本质区别
- ✅ 掌握各自的适用场景
- ✅ 了解 TCP 的可靠性机制
- ✅ 知道如何根据需求选择协议
每天更新3-4节,持续更新中... 目标:50天学完,上岸银行总行!
查看14道真题和解析