【前端面试小册】网络-第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[释放连接]

可靠传输

保证机制

  1. 确认应答:接收方收到数据后发送确认
  2. 超时重传:发送方没收到确认会重传
  3. 数据校验:检验和校验数据完整性
  4. 序列号:保证数据有序
  5. 流量控制:防止发送过快
  6. 拥塞控制:防止网络拥塞

有序传输

TCP 通过序列号保证数据按顺序到达和组装。

示例

发送:数据1 → 数据2 → 数据3
接收:数据1 → 数据2 → 数据3(顺序一致)

流量控制

使用滑动窗口机制,控制发送速率,防止接收方来不及处理。

原理

  • 接收方通过窗口大小告诉发送方自己的接收能力
  • 发送方根据窗口大小调整发送速率

拥塞控制

防止过多的数据注入到网络中,避免网络过载。

算法

  1. 慢启动:指数增长
  2. 拥塞避免:线性增长
  3. 快重传:提前重传
  4. 快恢复:快速恢复

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);
    }
}

八、面试要点总结

核心知识点

  1. TCP:面向连接、可靠、有序、慢
  2. UDP:无连接、不可靠、快速、支持广播
  3. 三次握手:TCP 建立连接的过程
  4. 四次挥手:TCP 断开连接的过程
  5. 应用场景:根据需求选择合适的协议

常见面试题

Q1: TCP 和 UDP 的区别?

答:

  • 连接:TCP 面向连接,UDP 无连接
  • 可靠性:TCP 可靠,UDP 不可靠
  • 速度:TCP 慢,UDP 快
  • 场景:TCP 用于文件传输、网页;UDP 用于视频、游戏

Q2: 为什么 TCP 可靠,UDP 不可靠?

答:

  • TCP 有确认应答、超时重传、流量控制、拥塞控制
  • UDP 没有这些机制,发送后不管是否到达

Q3: 什么场景下用 UDP?

答:

  • 实时性要求高的场景(视频、语音、游戏)
  • 可以容忍少量丢包
  • 需要广播/多播

实战建议

  • ✅ 理解 TCP 和 UDP 的本质区别
  • ✅ 掌握各自的适用场景
  • ✅ 了解 TCP 的可靠性机制
  • ✅ 知道如何根据需求选择协议
#前端面试小册##前端##银行##腾讯##字节#
前端面试小册 文章被收录于专栏

每天更新3-4节,持续更新中... 目标:50天学完,上岸银行总行!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务