http和https及其拓展 http 和 https 详解,包括每一个小知识点 HTTP & HTTPS 超完整详解(覆盖全部核心细小知识点) 前置基础 1

1 阅读11分钟

http和https详解

首先https是http经过TLS加密后,交给tcp的一种被加密的传输协议,基于 TCP,默认端口 443,所以应该先对http进行详解:

一,http详解:

http:全名:(HyperText Transfer Portocol)超文本传输协议: 作用:浏览器(客户端)与web服务器之间传输数据的应用协议层 标准端口:80 数据直接明文传输,数据裸奔,中间人(你和目标服务器中间,能够拦截,转发网络数据包的第三方)可以随意地篡改和窃听

2,特点:

基于文本的协议:请求和响应的部分的协议内容为文本格式,底层通过TCP协议传输,稳定性强。 TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全

基于请求-响应模型:一次请求对应一次响应,必须由客户端先发起请求,服务端才会返回响应。 请求和响应是一一对应关系,没有请求,就没有响应

无状态:服务端不会记忆与客户端的历史交互信息,每次请求-响应都是独立的。 无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。 缺点: 多次请求间不能共享数据 优点: 速度快 刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢? 接下来,我们就来详细剖析。 HTTP协议又分为:请求协议和响应协议

3,请求和响应协议:

请求协议:浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体 请求协议组成:

  • 请求协议: 浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体
  • 请求协议组成:

  • 响应协议: 服务器将数据以响应格式返回给浏览器。包括:响应行 、响应头 、响应体
  • 响应协议组成:

:

4,http工作的完整流程:

1,DNS解析:域名 -> Ip地址; 2,TCp三次握手,建立连接; 3,客户端发送HTTP请求报文; 4,服务器处理,返回HTTP报文; 5,TCP四次挥手断开连接(如果有Keep_alive则延迟断开)

5,http的三个主流版本的区别:

版本核心特性缺陷
HTTP/1.0短连接,无 Keep-Alive频繁创建 TCP,性能差
HTTP/1.1持久连接、管线化、Host 头、缓存完善线头阻塞(队头阻塞) ,同连接请求串行
HTTP/2(h2)二进制帧、多路复用、头部压缩、服务器推送TCP 层依然存在队头阻塞
HTTP/3(h3)基于 QUIC 协议(UDP),彻底解决队头阻塞普及率略低
管线化:HTTP1.1 允许连续发多个请求不用等响应.

6,http的常见请求方法:

  • GET:获取资源,参数拼在 URL;规范上不能修改服务端数据限制:URL 长度有限;请求体规范不推荐使用(部分服务器会丢弃 GET body)
  • POST:提交数据,数据放请求体;新增资源
  • PUT:全量更新资源
  • PATCH:局部更新资源
  • DELETE:删除资源
  • HEAD:和 GET 一样,但服务器只返回响应头,没有响应体,用来探测资源是否存在
  • OPTIONS:查询服务器支持哪些请求方法(跨域预检 OPTIONS)

安全方法:不会修改服务器数据:GET,HEAD,OPTIONS 幂等方法:多次请求效果和一次一致:GET,HEA,PUt,DELETE 不幂等:连续提交两次会创建两条数据:POST

7,http的状态码:

  • 1%% 信息类:请求收到,继续处理
  • 2%% 成功
  • 3%% 重定向:
  • 301 Moved Permanently 永久重定向(浏览器缓存跳转地址)
  • 302 Found 临时重定向
  • 304:Not MOdified 协商缓存命中,无需返回资源
  • 4%% 客户端错误
  • 5%% 服务端错误

8,http缓存机制:

  • 1:强缓存: 浏览器不发请求,直接读取本地缓存: Cache-Control: max-age=3600 # 缓存有效期3600秒(1小时) 一个小时内访问,都是进行强缓存,一个小时后,强缓存失效,静茹协议缓存
  • 2:协商缓存: 强缓存过期后,浏览器携带标识向服务器询问资源是否更新 流程:

1,先返回文件到浏览器缓存中,

2,如果是强缓存:

HTTP/1.1 200 OK 
Content-Type: text/css 
Cache-Control: max-age=3600 # 缓存有效期3600秒(1小时)

请求头控制规定的时间有效期是一个小时,这代表在资源第一次被缓存到浏览器中后,未来一个小时后内的请求都会直接读取浏览器自己的缓存 3,一个小时后,分两种情况 缓存过期,第二次请求,浏览器自动带上头: http GET /static/style.css If-None-Match: "abc123xyz789" # 带上上次的ETag 情况1:文件没修改:不会返回css资源体:

HTTP/1.1 304 Not Modified

情况2:css文件修改,服务器发现ETAG(这个文件的唯一标识,一个文件对应一个,文件一改这个也会 改)修改,会返回新的文件:

HTTP/1.1 200 OK
ETag: "def456"
# 返回全新css文件

这时浏览器就会更新本地缓存

完整串联整个访问流程 1,如何判断缓存是否生效: 生效:直接读取本地读取,不请求服务器 失效:发起请求,带上协商缓存标识(if-none-match) 2,资源器校验资源 未改:304 改了:200

location ~* \.(css|js|png|jpg)$ { 
expires 7d; # 输出 Cache-Control: max-age=604800 + 
etag on; # 开启ETag 
}

这里面开启了强缓存和协商,二者并不冲突,这里先执行强缓存,告诉浏览器7天内不要发请求,都读取本地缓存,等事件过了后再开启协商

常用响应头:

  • Set-Cookie:服务器下发 Cookie,浏览器保存

  • Location:重定向地址(301/302 使用)

  • Content-Type:返回数据类型 text/html application/json

  • Content-Length 返回体大小

  • Cache-Control 缓存控制(核心缓存头)

  • ETagLast-Modified 协商缓存

  • Access-Control-Allow-Origin CORS 跨域响应头

误区: 1,304不是强缓存,304属于协商缓存,依然产生http请求 2,cache-control:no-cache 不是不缓存,而是关闭强缓存,必须修协商缓存 3,cache-control:no-store 这才是完全禁止缓存,不保存任何资源

二,https详解:

什么是https?其实https并不是一个全新的协议,而是http经过TLS加密过后交给TCp的http,相当于http穿了一个防弹衣,这使得需要传输的数据不再是裸奔,不再没有任何隐私. 默认端口:443. 其中:HTTP 负责通信业务;TLS 负责加密、身份认证、防篡改

详解TPS:

要想了解https的详细运行流程就需要了解SSL和TPS: SSL是TPS的前身,现在用的最多的是TPS TPS其实是一种加密形式:分为对称加密和不对称加密: 对称加密:请求和响应双方用的是一个加密密钥,

  • 发送方:明文 + 密钥 → 密文

  • 接收方:密文 + 相同密钥 → 明文

  • 优点:运算快、适合大量报文加密;

  • 缺点:密钥分发风险大(如何安全把密钥传给对方是难点)。 不对称加密:两把密钥成对出现:分为:公钥和私钥

  • 公钥加密 → 只能私钥解密(加密传输场景)

  • 私钥签名 → 只能公钥验签(防篡改、身份认证场景)

客户端与服务器之间的详细运行过程: 0cd0b60332bfdcd06fcc3d68bc202fee.jpg

上边这张图展示了TLS1.2握手全流程: 1,Client Hello 【客户端 → 服务端】,客户端发起握手请求,携带: 支持的 TLS 版本:告诉服务器自己适配哪个TLS版本 客户端支持的加密套件列表:是 TLS/SSL 协议里一套完整密码算法组合,加密套件列表就是一组有序排列的加密套件集合。 第一个随机数(Client Random):用于组成会话密钥 2,Server Hello 【服务端 → 客户端】,服务端回复,协商通信基础参数: 选定双方都支持的 TLS 版本 敲定最终使用的加密套件 生成并发送 第二个随机数(Server Random) 3,Certificate 【服务端 → 客户端】: 服务端下发数字证书:数字证书:文件的互联网上的电子身份证,用于检验数据是否是我们需要的数据, 证书内包含:服务器公钥、域名、CA 签名。客户端后续会验证证书合法性。 4. Server Key Exchange:有的握手方式没有这个,这个的有无取决于加密套件里的密钥交换算法,这里不详学 在两种握手场景中:RSA握手和ECDHE握手:

  • 套件以 RSA 密钥交换 → 没有 Server Key Exchange 在这个场景中:客户端发送加密套件列表 服务端选中套件,下发数字证书(证书里本来就有服务端固定的公钥)
  • 套件以 ECDHE/DHE 密钥交换 → 必须发送 Server Key Exchange 5, Server Hello Done 【服务端 → 客户端】
    服务端告诉客户端所有的握手消息已经发送完毕,等待客户端响应
  1. Client Key Exchange + Change Cipher Spec + Encrypted Handshake Message 【客户端 → 服务端】

    1. Client Key Exchange:客户端生成第三个随机数/预主密钥 ** ,使用服务器证书里的公钥加密**,发给服务端。

    因为只有服务器持有私钥,所以只有服务器能解密拿到预主密钥。

    1. Change Cipher Spec:通知服务端:后续数据开始使用协商好的会话密钥进行对称加密传输

    2. Encrypted Handshake Message(Finished 消息) :客户端把之前所有握手报文做摘要,使用尚未生成完成的会话密钥加密发送,用来校验握手流程有没有被篡改。

    密钥推导规则:Client 随机数 + Server 随机数 + 预主密钥 三者共同运算,两端各自算出相同的会话密钥(对称密钥) 将服务器公钥传输给客户端

上面就是TLS握手和挥手的全流程:

1,三次握手:

目标:

  • 确认双方发送能力、接收能力正常

  • 协商初始序列号 ISN

  • 建立 TCP 连接

完整流程: Snipaste_2026-08-04_16-15-25.png syn :同步的请求,ACK : 确认,seq: 序列号,ack :确认号

  1. 第一次握手:客户端 → 服务端【SYN】**客户端主动发起连接请求报文:SYN=1,seq=x含义:我想建立连接,我的初始序列号是x
  2. 第二次握手:服务端 → 客户端【SYN+ACK】**服务端收到请求,同意连接,同时确认客户端报文:SYN=1,ACK=1, seq=y,ack=x+1
  • SYN:服务端也要同步,告知客户端自己初始序列号 y
  • ack=x+1:接收第一次握手的序列号,序列号加一就是确认号,传输给客户端,让它自己确认是不是自己发的那个请求
  1. 第三次握手:客户端 → 服务端【ACK】**客户端收到 SYN+ACK,回复确认报文:ACK=1,seq=x+1,ack=y+1👉 客户端状态:SYN_SENT → ESTABLISHED👉 服务端收到这条 ACK 后:SYN_RCVD → ESTABLISHED

2,四次挥手

FIN: 结束,ACK : 确认,seq: 序列号,ack :确认号 Snipaste_2026-08-04_15-45-41.png

  1. 第一次挥手:客户端 → 服务端【FIN】**客户端没有数据要发送,请求关闭客户端→服务端方向通道报文:`FIN=1,seq=u

  2. 第二次挥手:服务端 → 客户端【ACK】服务端收到 FIN,回复确认报文:`ACK=1,seq=v,ack=u+1 关键点:此时单向通道关闭**:客户端不能再发数据给服务端;但是服务端仍然可以继续向客户端发送剩余数据!

  3. 第三次挥手:服务端 → 客户端【FIN】**当服务端所有数据发送完毕,没有数据继续传输,发送 FIN,关闭服务端→客户端通道报文:FIN=1,ACK=1,seq=w,ack=u+1👉 服务端状态:CLOSE_WAIT → LAST_ACK

  4. 第四次挥手:客户端 → 服务端【ACK】**客户端收到 FIN,回复确认报文报文:ACK=1,seq=u+1,ack=w+1👉 客户端状态:FIN_WAIT_2 → TIME_WAIT👉 服务端收到这条 ACK:LAST_ACK → CLOSED