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/htmlapplication/json -
Content-Length返回体大小 -
Cache-Control缓存控制(核心缓存头) -
ETag、Last-Modified协商缓存 -
Access-Control-Allow-OriginCORS 跨域响应头
误区: 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其实是一种加密形式:分为对称加密和不对称加密: 对称加密:请求和响应双方用的是一个加密密钥,
-
发送方:明文 + 密钥 → 密文
-
接收方:密文 + 相同密钥 → 明文
-
优点:运算快、适合大量报文加密;
-
缺点:密钥分发风险大(如何安全把密钥传给对方是难点)。 不对称加密:两把密钥成对出现:分为:公钥和私钥
-
公钥加密 → 只能私钥解密(加密传输场景)
-
私钥签名 → 只能公钥验签(防篡改、身份认证场景)
客户端与服务器之间的详细运行过程:
上边这张图展示了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 【服务端 → 客户端】
服务端告诉客户端所有的握手消息已经发送完毕,等待客户端响应
-
Client Key Exchange + Change Cipher Spec + Encrypted Handshake Message 【客户端 → 服务端】
- Client Key Exchange:客户端生成第三个随机数/预主密钥 ** ,使用服务器证书里的公钥加密**,发给服务端。
因为只有服务器持有私钥,所以只有服务器能解密拿到预主密钥。
-
Change Cipher Spec:通知服务端:后续数据开始使用协商好的会话密钥进行对称加密传输。
-
Encrypted Handshake Message(Finished 消息) :客户端把之前所有握手报文做摘要,使用尚未生成完成的会话密钥加密发送,用来校验握手流程有没有被篡改。
密钥推导规则:Client 随机数 + Server 随机数 + 预主密钥 三者共同运算,两端各自算出相同的会话密钥(对称密钥) 将服务器公钥传输给客户端
上面就是TLS握手和挥手的全流程:
1,三次握手:
目标:
-
确认双方发送能力、接收能力正常
-
协商初始序列号 ISN
-
建立 TCP 连接
完整流程:
syn :同步的请求,ACK : 确认,seq: 序列号,ack :确认号
- 第一次握手:客户端 → 服务端【SYN】**客户端主动发起连接请求报文:
SYN=1,seq=x含义:我想建立连接,我的初始序列号是x - 第二次握手:服务端 → 客户端【SYN+ACK】**服务端收到请求,同意连接,同时确认客户端报文:
SYN=1,ACK=1, seq=y,ack=x+1
- SYN:服务端也要同步,告知客户端自己初始序列号 y
- ack=x+1:接收第一次握手的序列号,序列号加一就是确认号,传输给客户端,让它自己确认是不是自己发的那个请求
- 第三次握手:客户端 → 服务端【ACK】**客户端收到 SYN+ACK,回复确认报文:
ACK=1,seq=x+1,ack=y+1👉 客户端状态:SYN_SENT → ESTABLISHED👉 服务端收到这条 ACK 后:SYN_RCVD → ESTABLISHED
2,四次挥手
FIN: 结束,ACK : 确认,seq: 序列号,ack :确认号
-
第一次挥手:客户端 → 服务端【FIN】**客户端没有数据要发送,请求关闭客户端→服务端方向通道报文:`FIN=1,seq=u
-
第二次挥手:服务端 → 客户端【ACK】服务端收到 FIN,回复确认报文:`ACK=1,seq=v,ack=u+1 关键点:此时单向通道关闭**:客户端不能再发数据给服务端;但是服务端仍然可以继续向客户端发送剩余数据!
-
第三次挥手:服务端 → 客户端【FIN】**当服务端所有数据发送完毕,没有数据继续传输,发送 FIN,关闭服务端→客户端通道报文:
FIN=1,ACK=1,seq=w,ack=u+1👉 服务端状态:CLOSE_WAIT → LAST_ACK -
第四次挥手:客户端 → 服务端【ACK】**客户端收到 FIN,回复确认报文报文:
ACK=1,seq=u+1,ack=w+1👉 客户端状态:FIN_WAIT_2 → TIME_WAIT👉 服务端收到这条 ACK:LAST_ACK → CLOSED