HTTP的补充

HTTPS工作过程

1. 基本概念

HTTPS(安全超文本传输协议)是在HTTP基础上加入SSL/TLS安全协议,主要提供:

  • 内容加密:确保数据传输安全
  • 身份认证:验证网站真实性
  • 数据完整性:防止数据被篡改

2. 完整工作流程

第一阶段:TCP连接建立
  1. TCP三次握手:客户端与服务器先建立TCP连接(端口443)
第二阶段:TLS/SSL握手过程

1.Client Hello:

    • 客户端发送支持的TLS版本
    • 支持的加密算法列表
    • 客户端随机数(Client Random)

2.Server Hello:

    • 服务器选择加密算法
    • 发送服务器随机数(Server Random)
    • 发送SSL证书(包含公钥)

3.证书验证:

    • 客户端验证服务器证书有效性
    • 检查证书链、有效期、吊销状态等

4.密钥交换:

    • 客户端生成预主密钥(Premaster Secret)
    • 用服务器公钥加密后发送给服务器
    • 服务器用私钥解密获得预主密钥

5.生成会话密钥:

    • 双方使用Client Random + Server Random + Premaster Secret
    • 通过相同算法生成相同的对称加密密钥
  1. 握手完成:
    • 双方发送加密的"Finished"消息
    • 验证握手过程未被篡改
第三阶段:加密数据传输
  1. 对称加密通信:
    • 使用协商好的对称密钥加密数据
    • 进行安全的HTTP通信

HTTPS工作过程总结:

客户端 → 发送Client Hello(含TLS版本、加密算法、随机数)→服务器返回Server Hello + SSL证书(含公钥)→ 客户端验证证书并用公钥加密预主密钥 → 服务器用私钥解密获得预主密钥 → 双方基于随机数+预主密钥生成相同的对称会话密钥 → 建立加密通道 → 开始安全的数据传输。

HTTP 资源缓存

HTTP 资源缓存是浏览器 / 客户端为减少重复请求、提升加载速度、降低服务端压力的核心机制,核心逻辑是通过请求头 + 响应头的配合,让客户端判断是否复用本地缓存的资源,无需重新从服务端获取。

缓存分为强缓存和协商缓存两个层级,优先级上强缓存 > 协商缓存:只有强缓存失效 / 不生效时,才会发起协商缓存的请求;若协商缓存命中,服务端仅返回状态码,不返回资源体,仍能大幅节省带宽。

1.强缓存

①基本概念

强缓存是客户端仅通过本地缓存的资源信息(响应头)判断是否可用,无需向服务端发起任何请求,直接复用本地资源,浏览器控制台会显示from disk cache/from memory cache。

强制缓存就是 "浏览器判断缓存没过期,直接用本地存储的资源",主动权完全在浏览器这边。

②强制缓存的完整流程
  1. 浏览器第一次请求资源,服务器返回资源时,在响应头加Cache-Control: max-age=3600;
  2. 浏览器把资源和Cache-Control一起存到本地;
  3. 1 小时内再次请求这个资源:浏览器直接读本地缓存,返回 "200 (from cache)",不发网络请求;
  4. 1 小时后缓存过期,才会进入下一关 "协商缓存"。
③核心控制头部:Cache-Control

强制缓存的 "保质期",是通过响应头里的Cache-Control字段控制的,它有几个常用指令:

  • max-age=3600:缓存 3600 秒(1 小时)后过期(最常用);
  • public:允许中间缓存(比如 CDN)也存这份资源;
  • private:只有浏览器能存,中间缓存不能存(比如用户专属的资源);
  • no-cache:不是 "不缓存",是 "需要先协商缓存再用";
  • no-store:完全不缓存,每次都要从服务器重新请求(比如敏感数据)。

2.协商缓存

①基本概念

当强缓存失效(如 max-age 到期、资源被修改)或被跳过(如 Cache-Control: no-cache)时,客户端会向服务端发起带缓存标识的请求,由服务端判断本地缓存是否可用

通俗点来讲

如果强制缓存过期了,是不是就得重新下载资源?不一定 ------ 这时候会进入 "协商缓存":浏览器带着缓存的 "标识" 问服务器 "这个资源过期了,你看看现在能用不?",服务器判断后决定是用缓存还是发新资源。

协商缓存的标志是响应码 304 Not Modified------ 意思是 "资源没变化,你用本地缓存就行"。

②协商缓存的两种 "标识方案"

服务器和浏览器靠两个头部组合来判断资源是否变化:

方案 1:Last-Modified + If-Modified-Since(基于 "修改时间")

  • 第一次请求:服务器在响应头加Last-Modified: Wed, 03 Jan 2026 10:00:00 GMT(资源最后修改时间);
  • 缓存过期后请求:浏览器在请求头加If-Modified-Since: Wed, 03 Jan 2026 10:00:00 GMT(把上次的 Last-Modified 带过去);
  • 服务器对比:如果资源现在的修改时间和这个时间一样,返回304;如果不一样,返回200+ 新资源 + 新的 Last-Modified。

方案 2:Etag + If-None-Match(基于 "唯一标识")

Last-Modified有几个天生的坑:

  • 资源内容没改,但修改时间变了(比如服务器重启),会被误判为 "资源更新";
  • 时间精度是秒级,如果资源在 1 秒内被多次修改,无法识别;
  • 有些服务器拿不到资源的修改时间。

所以有了更可靠的Etag:服务器给每个资源生成一个唯一标识(比如哈希值),资源内容变了,Etag 就会变。

流程和上面类似:

  • 第一次请求:服务器响应头加Etag: "abc123";
  • 缓存过期后请求:浏览器请求头加If-None-Match: "abc123";
  • 服务器对比:Etag 一样返回304,不一样返回200+ 新资源 + 新 Etag。

优先级:Etag > Last-Modified

如果服务器同时返回了Etag和Last-Modified,浏览器会优先用Etag做协商 ------ 毕竟它能更准确地判断资源是否真的变化。

3.缓存位置

浏览器的缓存会存在两个地方:

  • 内存缓存(from memory cache):存在内存里,读取速度极快,但关闭标签页就会被清空(适合小体积、常用的资源,比如 JS/CSS);
  • 磁盘缓存(from disk cache):存在本地磁盘里,读取速度稍慢但持久化(适合大体积资源,比如图片、视频)。

在浏览器开发者工具里看到的 "from memory cache""from disk cache",就是缓存的存储位置标识。

总结

HTTP 缓存的核心逻辑是 "强制缓存优先,协商缓存兜底":

  • 强制缓存没过期:浏览器直接用本地资源,零请求成本;
  • 强制缓存过期:通过协商缓存让服务器判断,能复用就返回 304,不能复用再发新资源。

Cookie和Session

1.图解

2.具体实现

步骤一:客户端把用户ID 和密码等登录信息放入报文的实体部分,通常是以POST 方法把请求发送给服务器。而这时,会使用HTTPS 通信来进行HTML 表单画面的显示和用户输入数据的发送。

步骤二:服务器会发放用以识别用户的Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID 绑定后记录在服务器端。

步骤三:客户端接收到从服务器端发来的Session ID 后,会将其作为Cookie 保存在本地。下次向服务器发送请求时,浏览器会自动发送Cookie,所以Session ID 也随之发送到服务器。服务端可通过验证接收到的Session ID 识别用户和其认证状态。

3.Cookie 和 session 的关系

  1. 都是为了实现客户端与服务端交互而产出
  2. Cookie是保存在客户端,缺点易伪造、不安全
  3. Session是保存在服务端,会消耗服务器资源
  4. Session实现有两种方式:Cookie和URL重写

在大多数 Web 应用中,Session 并不是完全独立存在的,它通常依赖 Cookie 来传递 session_id。可以理解为 Cookie 负责在客户端和服务器之间传递"钥匙",而 Session 负责在服务器端保存"钥匙对应的数据"。如果没有 Cookie,Session 仍然可以通过 URL 重写等方式传递 session_id,但在现代 Web 开发中,Cookie 几乎是 Session 的默认载体。

相关推荐
头发还没掉光光4 小时前
HTTP协议从基础到实战全解析
linux·服务器·网络·c++·网络协议·http
budingxiaomoli6 小时前
HTTP协议
网络·网络协议·http
你这个代码我看不懂8 小时前
Spring Boot拦截Http请求设置请求头
spring boot·后端·http
Anthony_23114 小时前
五、交换技术与VLAN
服务器·网络·网络协议·http·https·udp·信息与通信
欧洵.15 小时前
HTTP协议详解Fiddler的安装与使用
网络·网络协议·http
Tandy12356_1 天前
手写TCP/IP协议栈——HTTP协议实现(完结篇)
c语言·网络·网络协议·tcp/ip·计算机网络·http
丁总学Java1 天前
微信小程序上传揭秘:http://tmp 临时文件是如何“飞”到后端的?
http·微信小程序·小程序
廋到被风吹走1 天前
gRPC 深度解析:Protocol Buffers、HTTP/2、流式传输与拦截器设计
网络·网络协议·http
信看2 天前
SIM7600x SIM826X 实现HTTP(S) POST
网络·网络协议·http