📌 本文由 5 篇相关文章智能合并整理而成
TCP 和 UDP 区别:面向连接 vs 无连接,可靠 vs 不可靠
TCP 和 UDP 区别:面向连接 vs 无连接,可靠 vs 不可靠
一、定义
TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是传输层最核心的两个协议。TCP 提供面向连接的可靠传输服务,UDP 提供无连接的不可靠传输服务。两者各有适用场景。
二、核心区别对比
| 对比维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接(直接发送) |
| 可靠性 | 可靠(确认重传) | 不可靠(尽力而为) |
| 有序性 | 保证数据有序到达 | 不保证顺序 |
| 流量控制 | 滑动窗口 | 无 |
| 拥塞控制 | 慢启动/拥塞避免 | 无 |
| 数据边界 | 字节流(无边界) | 报文(有边界) |
| 延迟 | 高(握手+确认) | 低(无需等待) |
| 首部大小 | 20~60 字节 | 8 字节 |
| 效率 | 低 | 高 |
三、TCP 特点详解
1. 可靠性机制
sequenceDiagram
participant S as 发送方
participant R as 接收方
S->>R: 发送数据包 1
R->>S: ACK 确认
S->>R: 发送数据包 2
Note over S: 启动定时器
Note over R: 数据包2丢失
Note over S: 超时未收到 ACK
S->>R: 重传数据包 2
R->>S: ACK 确认
可靠性机制:
– 确认应答(ACK):接收方收到数据后回复确认
– 超时重传:发送方启动定时器,超时未收到 ACK 则重传
– 快速重传:收到三个重复 ACK,立即重传(不等超时)
2. 流量控制(滑动窗口)
接收方通告窗口大小(rwnd),告知发送方能接收多少数据,防止接收方缓冲区溢出。
3. 拥塞控制
- 慢启动:指数增长,触发阈值后改为线性增长
- 拥塞避免:线性增长,丢包后窗口减半
- 快重传:三个重复 ACK 立即重传
- 快恢复:丢包后不回到慢启动
四、UDP 特点详解
1. 无连接
发送数据前不需要建立连接,减少握手延迟。
2. 报文结构
0 16 31
├────────────────┬────────────────┤
│ 源端口 │ 目的端口 │
├────────────────┼────────────────┤
│ 报文长度 │ 校验和 │
├────────────────┴────────────────┤
│ 数据载荷 │
│ ... │
└─────────────────────────────────┘
UDP 首部仅 8 字节(TCP 首部至少 20 字节)。
五、TCP 与 UDP 应用场景
TCP 适合的场景
| 场景 | 原因 | 协议 |
|---|---|---|
| Web 浏览 | 页面内容必须完整准确 | HTTP/HTTPS |
| 文件传输 | 不能有数据丢失 | FTP |
| 邮件收发 | 必须完整可靠 | SMTP/POP3/IMAP |
| 数据库连接 | 事务和数据一致性 | MySQL |
| SSH | 远程命令必须准确 | SSH |
UDP 适合的场景
| 场景 | 原因 | 协议 |
|---|---|---|
| 视频直播 | 允许丢帧,延迟优先 | RTP over UDP |
| 语音通话 | 实时性要求高 | VoIP (SIP/RTP) |
| 在线游戏 | 延迟敏感 | 自定义 UDP |
| DNS 查询 | 单次请求,轻量快速 | DNS |
| DHCP | 广播场景 | DHCP |
选择指南
flowchart TD
A{传输层协议选择} --> B{需要可靠传输?}
B -->|是| C{对延迟敏感?}
B -->|否| D[UDP]
C -->|是,但能容忍少量丢包| E[UDP+应用层可靠机制]
C -->|否,必须完整准确| F[TCP]
C -->|既可靠又需要低延迟| G[QUIC (UDP-based)]
六、特殊场景:QUIC
QUIC(Quick UDP Internet Connections)是基于 UDP 的传输协议,HTTP/3 的底层协议:
| 特性 | 说明 |
|---|---|
| 连接建立 | 0-RTT 或 1-RTT |
| 加密 | 内置 TLS 1.3 |
| 多路复用 | 无 TCP 队头阻塞 |
| 连接迁移 | 网络切换不断连 |
| 前向纠错 | FEC 减少重传 |
七、面试常见问题
Q1:TCP 和 UDP 分别适合什么场景?
A:TCP 适合对数据完整性要求高的场景(网页、文件、邮件)。UDP 适合对实时性要求高、能容忍少量丢包的场景(音视频通话、游戏、DNS)。
Q2:为什么视频通话和直播大多数用 UDP?
A:视频通话对延迟敏感。TCP 重传在网络不稳定时导致延迟增加。UDP 允许少量丢包(丢帧),配合编解码器的错误隐藏,用户体验更好。
Q3:UDP 可以保证可靠传输吗?
A:UDP 本身不可靠,但可在应用层实现(添加序列号、ACK、重传)。QUIC、KCP 等都是基于 UDP 实现可靠传输的协议。
Q4:TCP 的拥塞控制有哪些算法?
A:经典算法:Tahoe、Reno、CUBIC(Linux 默认)、BBR(基于带宽和延迟模型)。CUBIC 在高带宽高延迟网络中表现优秀,BBR 在丢包非拥塞的网络中效果更好。
相关文章:TCP 三次握手流程详解 | TCP 四次挥手流程详解 | HTTP 和 HTTPS 区别 | HTTP 状态码
TCP 四次挥手流程详解:TIME_WAIT 状态与 CLOSE_WAIT 问题分析
TCP 四次挥手流程详解:TIME_WAIT 状态与 CLOSE_WAIT 问题分析
一、定义
四次挥手(Four-Way Wavehand)是 TCP 断开连接时的流程。由于 TCP 是全双工通信,每一方的连接关闭都需要单独确认,因此需要四次交互来完成。
二、四次挥手流程
sequenceDiagram
participant C as 主动关闭方 (Client)
participant S as 被动关闭方 (Server)
Note over C: ESTABLISHED
Note over S: ESTABLISHED
C->>S: 1. FIN=1, seq=u
Note over C: FIN_WAIT_1
Note over S: CLOSE_WAIT
S->>C: 2. ACK=1, seq=v, ack=u+1
Note over C: FIN_WAIT_2
Note over S: 数据处理中...
S->>C: 3. FIN=1, ACK=1, seq=w, ack=u+1
Note over C: TIME_WAIT
Note over S: LAST_ACK
C->>S: 4. ACK=1, seq=u+1, ack=w+1
Note over S: CLOSED
Note over C: 等待 2MSL 后
Note over C: CLOSED
第一步:FIN
主动关闭方发送 FIN 报文:
– 标志位:FIN=1
– 序列号:seq=u
– 主动方:ESTABLISHED → FIN_WAIT_1
– 含义:主动方说”我数据发完了,不再发送数据了”
第二步:ACK
被动关闭方回复 ACK:
– 标志位:ACK=1
– 序列号:seq=v,确认号:ack=u+1
– 主动方:FIN_WAIT_1 → FIN_WAIT_2
– 被动方:ESTABLISHED → CLOSE_WAIT
– 含义:”收到关闭请求,但我还有数据要发”
第三步:FIN
被动关闭方发送 FIN:
– 标志位:FIN=1, ACK=1
– 序列号:seq=w,确认号:ack=u+1
– 主动方:FIN_WAIT_2 → TIME_WAIT
– 被动方:CLOSE_WAIT → LAST_ACK
– 含义:”我的数据处理完了,可以关闭了”
第四步:ACK
主动关闭方发送 ACK 确认:
– 标志位:ACK=1
– 序列号:seq=u+1,确认号:ack=w+1
– 被动方:LAST_ACK → CLOSED
– 主动方等待 2MSL 后:TIME_WAIT → CLOSED
三、关键状态说明
| 状态 | 说明 | 常见问题 |
|---|---|---|
| FIN_WAIT_1 | 主动方发送 FIN,等待 ACK | 少见 |
| FIN_WAIT_2 | 主动方收到 ACK,等待被动方 FIN | 半关闭状态 |
| CLOSE_WAIT | 被动方收到 FIN,等待应用关闭 | 应用未 close() 导致大量 CLOSE_WAIT |
| LAST_ACK | 被动方发送 FIN,等待最终 ACK | ACK 丢失会重发 FIN |
| TIME_WAIT | 主动方收到 FIN 并回复 ACK,等待 2MSL | 大量 TIME_WAIT 耗尽端口资源 |
四、为什么是四次挥手,不是三次?
TC 是全双工通信,连接双向的关闭需要独立处理。被动方回复的 ACK 和发送的 FIN 之间,被动方可能还有未发送完的数据,所以不能合并。
如果被动方也没有数据要发送了,可以将步骤 2 和 3 合并,变成三次挥手:
sequenceDiagram
participant C as 主动关闭方
participant S as 被动关闭方
C->>S: FIN
S->>C: FIN + ACK(合并)
C->>S: ACK
五、TIME_WAIT 状态详解
为什么需要 TIME_WAIT?
- 保证最后一个 ACK 到达对方:如果 ACK 丢失,被动方会重发 FIN,TIME_WAIT 状态下能重新回复 ACK
- 防止旧的报文段干扰新连接:等待 2MSL,确保网络中所有老报文段消失
MSL 含义
- MSL(Maximum Segment Lifetime):报文最大生存时间,Linux 默认 30 秒
- TIME_WAIT 时长:2 × MSL = 60 秒
大量 TIME_WAIT 问题与解决
# 查看 TIME_WAIT 数量
netstat -an | grep TIME_WAIT | wc -l
# 调整参数
net.ipv4.tcp_tw_reuse = 1 # 复用 TIME_WAIT 连接(客户端场景)
net.ipv4.tcp_fin_timeout = 30 # FIN_WAIT_2 超时
六、四次挥手场景总结
| 场景 | 挥手次数 | 说明 |
|---|---|---|
| 被动方无数据发送 | 3次 | 合并 ACK 和 FIN |
| 被动方有数据发送 | 4次 | 标准四次挥手 |
| 同时关闭 | 4次 | 双方同时发送 FIN |
| 一方异常断开 | 2次 | 超时后直接 CLOSED(RST) |
七、面试常见问题
Q1:为什么需要 TIME_WAIT 状态?
A:两个原因:① 保证最后一个 ACK 可靠送达,如果丢失被动方重发 FIN 后还有 TIME_WAIT 能回复 ACK;② 保证旧报文在 2MSL 内失效,防止干扰新连接。
Q2:大量 TIME_WAIT 有什么危害?如何解决?
A:危害:占用端口资源(限制 65K),降低系统吞吐。解决:① 开启 tcp_tw_reuse(客户端场景);② 调整 MSL;③ HTTP/1.1 keep-alive 减少连接创建;④ 使用连接池。
Q3:大量 CLOSE_WAIT 是什么原因?怎么解决?
A:服务端收到被动关闭,但应用层没有调用 close()。常见于:资源未正确释放、连接池未及时归还。解决:确保每个 socket 都正确关闭、使用 try-with-resources。
Q4:TCP 同时关闭(Simultaneous Close)会怎么样?
A:双方同时发送 FIN,各自进入 FIN_WAIT_1,收到对方的 FIN 后回复 ACK 进入 CLOSING,然后各自进入 TIME_WAIT,最终双方都等待 2MSL 后关闭。
相关文章:TCP 三次握手流程详解 | TCP 和 UDP 区别 | HTTP 和 HTTPS 区别 | HTTP 状态码
TCP 三次握手流程与核心原理:为何是三次而非两次?
TCP 三次握手流程与核心原理:为何是三次而非两次?
一、定义
TCP(Transmission Control Protocol)是面向连接的可靠传输协议。三次握手(Three-Way Handshake)是 TCP 建立连接时,客户端和服务端交换三个报文段以同步序列号、确认传输能力和协商参数的过程。
二、三次握手流程
sequenceDiagram
participant C as 客户端 (Client)
participant S as 服务端 (Server)
Note over C: CLOSED
Note over S: LISTEN
C->>S: 1. SYN=1, seq=x
Note over C: SYN_SENT
Note over S: SYN_RCVD
S->>C: 2. SYN=1, ACK=1, seq=y, ack=x+1
C->>S: 3. ACK=1, seq=x+1, ack=y+1
Note over C: ESTABLISHED
Note over S: ESTABLISHED
Note over C,S: 连接建立完成
第一步:SYN
客户端发送 SYN 报文:
– 标志位:SYN=1, ACK=0
– 序列号:seq=x(随机初始序列号 ISN)
– 客户端状态:CLOSED → SYN_SENT
– 作用:告知服务端”我要建立连接”,同步自己的序列号
第二步:SYN+ACK
服务端回复 SYN+ACK 报文:
– 标志位:SYN=1, ACK=1
– 序列号:seq=y(服务端随机初始序列号)
– 确认号:ack=x+1(确认收到客户端的 SYN)
– 服务端状态:LISTEN → SYN_RCVD
– 作用:告知客户端”收到你的请求,这是我的序列号”
第三步:ACK
客户端发送 ACK 报文:
– 标志位:ACK=1, SYN=0
– 序列号:seq=x+1
– 确认号:ack=y+1(确认收到服务端的 SYN)
– 客户端:SYN_SENT → ESTABLISHED
– 服务端收到后:SYN_RCVD → ESTABLISHED
– 作用:确认收到服务端的响应,连接正式建立
三、为什么是三次握手?两次不行吗?
sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C: 发送 SYN(seq=100)
C->>S: SYN (seq=100) [网络阻塞]
Note over C: 超时重传
C->>S: SYN (seq=300)
S->>C: SYN+ACK (ack=301)
C->>S: ACK (seq=301)
Note over C,S: 正常连接建立
Note over C: 此时旧 SYN(seq=100) 到达
C->>S: SYN (seq=100) [旧的]
S->>S: 如果没有第三次握手<br>服务端会误以为新连接
S->>C: SYN+ACK (ack=101)
C->>S: RST (拒绝)
Note over S: 浪费资源
核心原因:
| 原因 | 说明 |
|---|---|
| 防止历史连接干扰 | 两次握手无法区分旧的失效 SYN |
| 同步初始序列号 | 确保双方的 ISN 都被对方确认 |
| 确认收发能力 | 确保双方都可以正常发送和接收 |
| 协商参数 | MSS、窗口缩放因子、SACK 等选项协商 |
四、三次握手的核心作用总结
| 作用 | 说明 |
|---|---|
| 确认双方的收发能力 | 确保客户端和服务端都可以正常发送和接收 |
| 同步初始序列号 | 协商 ISN,为可靠传输做准备 |
| 协商参数 | MSS、窗口缩放因子、SACK 等 |
| 防止历史连接 | 通过 RST 终止无效连接 |
五、SYN Flood 攻击与防御
攻击原理
攻击者大量发送伪造 IP 的 SYN 报文,服务端回复 SYN+ACK 后无法收到客户端的 ACK,导致服务端保持大量半连接(SYN_RCVD),耗尽资源。
防御措施
| 方案 | 说明 |
|---|---|
| SYN Cookie | 不分配半连接资源,根据 SYN 计算 Cookie 作为序列号 |
| 增大半连接队列 | tcp_max_syn_backlog |
| 缩短超时时间 | tcp_synack_retries |
| 防火墙过滤 | 限制 SYN 包速率 |
六、相关参数
# Linux 内核参数
net.ipv4.tcp_syn_retries = 6 # SYN 重试次数
net.ipv4.tcp_synack_retries = 5 # SYN+ACK 重试次数
net.ipv4.tcp_max_syn_backlog = 1024 # 半连接队列大小
net.ipv4.tcp_syncookies = 1 # 启用 SYN Cookie
七、面试常见问题
Q1:为什么 TCP 建立连接要三次握手,而不是两次或四次?
A:两次握手无法防止已失效的连接请求到达服务端,且无法确保服务端知道客户端收到了自己的 SYN。四次握手可以但浪费了一次交互,三次是理论最小值。
Q2:三次握手中可以携带数据吗?
A:前两次(SYN、SYN+ACK)不能携带数据,因为序列号尚未同步。第三次(ACK)可以携带数据,因为双方序列号已同步。
Q3:什么是半连接队列和全连接队列?
A:半连接队列(SYN Queue):服务端收到 SYN 后的连接队列。全连接队列(Accept Queue):三次握手完成后的连接队列。
Q4:第三次握手的 ACK 丢失怎么办?
A:服务端收不到 ACK 会保持 SYN_RCVD 状态,超时重发 SYN+ACK。客户端收到 SYN+ACK 后重新回复 ACK。
相关文章:TCP 四次挥手流程详解 | TCP 和 UDP 区别 | HTTP 和 HTTPS 区别 | HTTP 状态码
HTTP 状态码详解:2xx / 3xx / 4xx / 5xx 全系列速查
HTTP 状态码详解:2xx / 3xx / 4xx / 5xx 全系列速查
一、定义
HTTP 状态码(Status Code)是服务器在响应请求时返回的三位数字代码,用于表示请求的处理结果。状态码分为五大类,每类代表不同的响应语义。
二、状态码分类
| 分类 | 范围 | 含义 |
|---|---|---|
| 1xx | 100-199 | 信息性响应 |
| 2xx | 200-299 | 成功响应 |
| 3xx | 300-399 | 重定向 |
| 4xx | 400-499 | 客户端错误 |
| 5xx | 500-599 | 服务端错误 |
三、常见状态码详解
2xx 成功
| 状态码 | 含义 | 常见原因 |
|---|---|---|
| 200 OK | 请求成功 | ✅ 正常返回数据 |
| 201 Created | 资源创建成功 | POST 新建资源 |
| 204 No Content | 无内容 | DELETE 删除成功 |
| 206 Partial Content | 部分内容 | 断点续传 |
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 1, "name": "Alice"}
HTTP/1.1 201 Created
Location: /api/users/1
HTTP/1.1 204 No Content
3xx 重定向
| 状态码 | 含义 | 场景 |
|---|---|---|
| 301 Moved Permanently | 永久重定向 | 域名变更、HTTPS 强制跳转 |
| 302 Found | 临时重定向 | 登录跳转、A/B 测试 |
| 304 Not Modified | 未修改 | 浏览器缓存有效 |
301 vs 302 对比:
| 对比 | 301 | 302 |
|---|---|---|
| 含义 | 永久移动 | 临时移动 |
| 浏览器缓存 | 缓存重定向 | 不缓存 |
| SEO | 传递权重 | 不传递权重 |
| 常见场景 | 域名变更 | 临时维护 |
4xx 客户端错误
| 状态码 | 含义 | 原因 |
|---|---|---|
| 400 Bad Request | 参数错误 | JSON/参数格式错误 |
| 401 Unauthorized | 未认证 | 未登录/token 过期 |
| 403 Forbidden | 禁止访问 | 无权限访问 |
| 404 Not Found | 资源不存在 | URL 错误/资源删除 |
| 405 Method Not Allowed | 方法不允许 | 错误调用方式 |
| 408 Request Timeout | 请求超时 | 客户端未按时发送请求 |
| 409 Conflict | 冲突 | 数据冲突 |
| 415 Unsupported Media Type | 不支持的媒体类型 | Content-Type 错误 |
| 429 Too Many Requests | 请求过多 | 超过频率限制 |
401 vs 403 区别:
– 401:你不知道你是谁(未登录/token 无效)
– 403:我知道你是谁,但你没有权限
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example"
HTTP/1.1 403 Forbidden
{"error": "您没有访问此资源的权限"}
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{"error": "请 60 秒后重试"}
5xx 服务端错误
| 状态码 | 含义 | 原因 |
|---|---|---|
| 500 Internal Server Error | 服务器异常 | 代码异常/数据库错误 |
| 502 Bad Gateway | 网关错误 | 上游服务挂了 |
| 503 Service Unavailable | 服务不可用 | 过载/维护中 |
| 504 Gateway Timeout | 网关超时 | 上游响应超时 |
502 vs 504 对比:
| 对比 | 502 | 504 |
|---|---|---|
| 含义 | 无效响应 | 响应超时 |
| 典型原因 | 上游服务崩溃 | 上游处理太慢 |
| Nginx 场景 | proxy_pass 后端挂了 | proxy_read_timeout 超时 |
四、状态码速记表
| 状态码 | 英文名 | 中文含义 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 创建成功 |
| 204 | No Content | 无内容 |
| 301 | Moved Permanently | 永久重定向 |
| 302 | Found | 临时重定向 |
| 304 | Not Modified | 未修改 |
| 400 | Bad Request | 参数错误 |
| 401 | Unauthorized | 未认证 |
| 403 | Forbidden | 禁止访问 |
| 404 | Not Found | 资源不存在 |
| 405 | Method Not Allowed | 方法不允许 |
| 429 | Too Many Requests | 请求过多 |
| 500 | Internal Server Error | 服务器异常 |
| 502 | Bad Gateway | 网关错误 |
| 503 | Service Unavailable | 服务不可用 |
| 504 | Gateway Timeout | 网关超时 |
五、RESTful API 状态码选择
| 操作 | 成功 | 新建 | 删除 | 失败 |
|---|---|---|---|---|
| GET | 200 | — | — | 404 |
| POST | 201 | 201 | — | 400/409 |
| PUT | 200 | 201 | — | 400/409 |
| DELETE | 204 | — | 204 | 404 |
六、面试常见问题
Q1:301 和 302 的区别?各在什么场景使用?
A:301 永久移动,浏览器缓存重定向(域名迁移、HTTPS 跳转)。302 临时移动,不缓存(登录跳转、A/B 测试)。
Q2:401 和 403 有什么区别?
A:401 未提供有效认证凭证(未登录、token 过期);403 已认证但无权限(角色不足、IP 被拉黑)。
Q3:502 和 504 有什么区别?
A:502 网关收到无效响应(上游挂了),504 网关等待超时(上游处理太慢)。
Q4:RESTful API 设计中怎么选状态码?
GET 成功 200,POST 成功 201,DELETE 成功 204。参数错误 400,认证失败 401,无权限 403,资源不存在 404,冲突 409,限流 429,服务器异常 500。
相关文章:HTTP 和 HTTPS 区别 | TCP 三次握手 | TCP 四次挥手 | TCP 和 UDP 区别
HTTP 和 HTTPS 区别:SSL/TLS 握手 / 加密原理 / 性能对比
HTTP 和 HTTPS 区别:SSL/TLS 握手 / 加密原理 / 性能对比
一、定义
HTTP(HyperText Transfer Protocol)是超文本传输协议,HTTPS(HyperText Transfer Protocol Secure)是 HTTP 的安全版本,通过在 HTTP 基础上加入 SSL/TLS 加密协议来实现通信安全。
二、核心区别
| 对比维度 | HTTP | HTTPS |
|---|---|---|
| 默认端口 | 80 | 443 |
| 安全性 | 明文传输 | 加密传输 |
| 数据完整性 | 无校验 | 消息认证码保护 |
| 身份认证 | 无 | CA 证书认证 |
| 性能 | 快 | 慢(额外握手加密) |
| 协议层级 | 应用层 | 应用层 + SSL/TLS |
| URL 前缀 | http:// | https:// |
| 是否需要证书 | 不需要 | 需要 CA 证书 |
三、HTTPS 的工作原理
SSL/TLS 握手流程
sequenceDiagram
participant C as 客户端
participant S as 服务端
C->>S: 1. ClientHello (TLS版本, 加密套件列表)
S->>C: 2. ServerHello (选定加密套件)
S->>C: 2. Server Certificate (公钥证书)
S->>C: 2. ServerHelloDone
C->>C: 3. 验证证书有效性
C->>C: 3. 生成 pre-master secret
C->>S: 3. ClientKeyExchange (公钥加密的密钥)
C->>C: 3. 生成会话密钥
C->>S: 3. ChangeCipherSpec + Finished
S->>S: 4. 用私钥解密 pre-master secret
S->>S: 4. 生成相同会话密钥
S->>C: 4. ChangeCipherSpec + Finished
Note over C,S: 5. 加密通信开始(对称加密 AES/ChaCha20)
C->>S: 加密的 HTTP 请求
S->>C: 加密的 HTTP 响应
加密方式混合使用
| 阶段 | 加密方式 | 作用 |
|---|---|---|
| 握手阶段 | 非对称加密(RSA/ECDHE) | 安全交换对称密钥 |
| 数据传输 | 对称加密(AES/ChaCha20) | 加密大量数据,速度快 |
四、HTTP 的三大安全问题
1. 窃听(Eavesdropping)
GET /api/user HTTP/1.1
Cookie: session=abc123 ← 明文,可被中间人截获
2. 篡改(Tampering)
原始请求:转账 100 元 → 攻击者改为:转账 10000 元
3. 冒充(Impersonation)
伪装成银行网站,诱导用户输入密码
五、HTTPS 性能优化
性能开销与优化方案
| 优化方案 | 说明 |
|---|---|
| Session Resumption | 会话复用,减少握手次数 |
| Session Ticket | 服务端加密会话状态发给客户端 |
| OCSP Stapling | 服务端缓存证书状态,减少客户端验证延迟 |
| TLS False Start | 握手未完成即可发送数据 |
# Nginx 配置
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_stapling on;
六、HTTP 版本演进
| 版本 | 特点 | 传输层 |
|---|---|---|
| HTTP/1.1 | 文本协议,队头阻塞 | TCP |
| HTTP/2 | 二进制分帧,多路复用 | TCP(强制 HTTPS) |
| HTTP/3 | QUIC 协议,解决队头阻塞 | UDP |
七、面试常见问题
Q1:HTTPS 握手的具体过程是什么?
① 客户端发送 ClientHello(支持的 TLS 版本、加密套件)→ ② 服务端返回 ServerHello、数字证书 → ③ 客户端验证证书,生成 pre-master secret 并用公钥加密发送 → ④ 双方生成会话密钥 → ⑤ 切换为对称加密通信。
Q2:HTTPS 为什么混合使用对称和非对称加密?
非对称加密安全但速度慢(比对称慢 1000 倍以上),适合小量数据加密(如密钥交换);对称加密速度快但密钥分发困难。两者结合兼顾安全与性能。
Q3:中间人攻击如何攻击 HTTPS?如何防范?
攻击者伪造证书欺骗客户端。防范:使用受信任的 CA 证书、验证证书链、证书锁定(Certificate Pinning)、使用 HSTS 强制 HTTPS。
Q4:HTTPS 和 HTTP/2 有什么关系?
HTTP/2 不要求必须使用 HTTPS,但主流浏览器只对 HTTPS 连接启用 HTTP/2,因此 HTTP/2 几乎等于 HTTPS 的升级。HTTP/2 带来多路复用、服务端推送、头部压缩等优化。
相关文章:HTTP 状态码详解 | TCP 三次握手 | TCP 和 UDP 区别 | 微服务核心组件


暂无评论内容