HTTP网络请求
# 简述 HTTPS 加密过程

HTTPS 使用 TLS/SSL 协议进行加密,主要包含以下步骤:
# 1.客户端发起请求
- 发送支持的加密算法列表
- 发送随机数 Client Random
# 2.服务器回应
- 选择加密算法
- 发送数字证书(包含公钥)
- 发送随机数 Server Random
# 3.客户端验证证书
- 验证证书是否由可信 CA 签发
- 验证证书域名是否匹配
- 验证证书是否在有效期内
# 4.生成会话密钥
- 客户端生成随机数 Pre-master secret
- 使用服务器公钥加密 Pre-master secret
- 客户端和服务器都通过三个随机数生成会话密钥 (Client Random + Server Random + Pre-master secret)
# 5.开始加密通信
- 双方使用会话密钥进行对称加密通信
- 保证通信内容的机密性和完整性
特点:
- 采用混合加密:非对称加密传输密钥,对称加密传输数据
- 数字证书保证服务器身份可信
- 具有防篡改和不可否认性
# TCP 是如何建立连接的,三次握手,四次挥手

三次握手
- 客户端向服务端发送建立连接请求,客户端进入 SYN-SEND 状态
- 服务端收到建立连接请求后,向客户端发送一个应答,服务端进入 SYN-RECEIVED 状态
- 客户端接收到应答后,向服务端发送确认接收到应答,客户端进入 ESTABLISHED 状态

四次挥手
- 客户端向服务端发送断开连接请求
- 服务端收到断开连接请求后,告诉应用层去释放 tcp 连接
- 服务端向客户端发送最后一个数据包 FINBIT ,服务端进入 LAST-ACK 状态
- 客户端收到服务端的断开连接请求后,向服务端确认应答
三次握手四次挥手,客户端都是主动方,服务端都是被动方。在状态方面:三次握手的客户端和服务端都是由原来的 closed 变为 established,四次挥手的客户端和服务端都是由原来的 established 变为 closed。
# HTTP 几个版本的区别
# HTTP/0.9
- 仅支持 GET 请求,无请求头和请求体
- 只能传输 HTML 文件,返回 ASCII 字符流
- 无响应头
缺点:功能极其有限
# HTTP/1.0 多类型支持
- 支持多种文件类型(不限于 ASCII)
- 引入请求头和响应头(key-value 形式)
- 每个请求都需要建立新的 TCP 连接
缺点:频繁连接导致性能开销
# HTTP/1.1 持久连接
- 引入持久连接(keep-alive): 一个 TCP 连接可传输多个 HTTP 请求
- 默认开启 keep-alive,通常限制 6-8 个并发连接
- 引入 Host 字段,支持虚拟主机
- 引入 Chunk transfer 机制处理动态内容长度
缺点:存在队头阻塞问题(前面的请求阻塞后续请求)
# HTTP/2.0 多路复用
- 一个域名仅使用一个 TCP 长连接
- 引入二进制分帧层,实现多路复用(并行传输请求)
- 支持请求优先级
- 强制使用 HTTPS(HTTP + TLS 加密)
仍依赖 TCP,存在 TCP 队头阻塞问题
# HTTP/3.0 QUIC 协议
- 基于 UDP 协议而非 TCP
- 实现了类似 TCP 的流量控制和可靠传输
- 继承 TLS 加密
- 多路费用
- 解决 TCP 对头阻塞问题
# HTTP 常见的状态码
# 1. 2xx 成功状态码
# 重点解析
- 200 OK:最基础的成功状态码,表示请求完全成功。
- 204 No Content:成功但无返回数据,适用于不需要返回内容的操作(如
DELETE)。 - 205 Reset Content:要求客户端重置当前视图(如提交表单后清空输入框)。
- 206 Partial Content:支持分块传输(如视频流、大文件下载)。
# 实际场景
- 204:删除资源后,服务器只需确认成功,无需返回数据。
- 206:浏览器下载大文件时,通过
Range头实现断点续传,服务器返回206和部分内容。
# 2. 3xx 重定向状态码
# 重点解析
- 301 vs 302:
- 301:永久重定向,搜索引擎会更新链接到新地址。
- 302:临时重定向,搜索引擎仍保留原地址。
- 303:强制客户端用
GET方法访问新地址(避免POST重复提交)。 - 304:协商缓存,通过
ETag或Last-Modified判断资源是否修改。
# 实际场景
- 301:网站域名更换,旧域名永久跳转到新域名。
- 302:用户未登录时临时跳转到登录页。
- 304:浏览器缓存未过期,直接使用本地资源,减少服务器压力。
# 3. 4xx 客户端错误状态码
# 重点解析
- 400:请求语法错误(如 JSON 格式错误)。
- 401 vs 403:
- 401:未认证(如未登录或
token失效)。 - 403:已认证但无权限(如普通用户访问管理员接口)。
- 401:未认证(如未登录或
- 404:资源不存在(可能是 URL 拼写错误)。
# 实际场景
- 401:前端未携带
token访问需要认证的接口。 - 403:用户尝试删除他人数据时被拒绝。
- 404:输入错误的 API 路径。
# 4. 5xx 服务端错误状态码
# 重点解析
- 500:服务器内部错误(如代码抛出未捕获的异常)。
- 501:服务器不支持请求的功能(如调用了未实现的 API)。
- 503:服务不可用(如服务器过载或维护)。
# 实际场景
- 500:数据库连接失败导致服务崩溃。
- 503:电商大促时服务器流量激增,暂时限流。
# 面试加分点
缓存机制:
- 提到
304时,可以展开说:- 浏览器通过
If-Modified-Since(基于时间)或If-None-Match(基于ETag)发起条件请求。 - 服务器比对后决定返回
304或200。
- 浏览器通过
- 提到
安全设计:
- 403 可以结合敏感词过滤或权限系统设计。
- 401 需提到
JWT或OAuth认证流程。
性能优化:
- 206 用于优化大文件传输。
- 301 减少重复跳转的开销。
高可用:
- 如何避免
503?- 答案:负载均衡、服务降级、限流策略(如令牌桶)。
- 如何避免
# 模拟面试问题
问题:用户登录后访问某个接口返回
403,可能是什么原因?
回答:可能是权限不足(如普通用户访问管理员接口),或请求被风控系统拦截(如敏感操作)。问题:如何实现文件的断点续传?
回答:客户端通过Range头指定下载范围,服务器返回206和部分内容,并支持ETag校验文件一致性。问题:
304是如何减少带宽消耗的?
回答:浏览器缓存资源后,下次请求携带If-None-Match(ETag),若资源未修改,服务器返回304,浏览器直接使用缓存。
编辑 (opens new window)
上次更新: 2025/12/08, 12:51:29