这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
1.HTTP与HTTPS的区别
| 方面 | HTTP | HTTPS |
|---|---|---|
| URL | http:// | https:// |
| 安全性 | 不安全 | 安全 |
| 端口 | 80 | 443 |
| 工作 | 工作在应用层 | 安全传输机制工作在传输层 |
| 加密 | 无法加密 | 对传输数据进行加密 |
| 证书 | 无需证书 | 需要SSL证书 |
2.HTTP 1.0/1.1/2.0的区别
1.HTTP 1.0
- 可发送任意类型的数据
- 方法:
GET、POST、HEAD三种请求方法 - 无
长连接 - 有较多请求头标识,其中,以
head中的Last-Modified、If-Modified-Since和Expires作为缓存标识
2.HTTP 1.1
- 引入更多的请求方法:
PUT、DELET、PATCH、OPTION、CONNECT、TRACE - 引入
长连接,TCP连接默认不关闭,可被多个请求复用,通过connection:keep-alive设置 - 引入
Cache-Control、ETag/If-None-Match缓存头标识 - 引入
range请求头标识,支持断点续传 - 使用
虚拟网络,多个虚拟主机共享一个地址 - 新增24个
状态码
缺点:连接缓慢、存在请求队头阻塞问题(因为请求是按顺序进行的,某个请求时间较长会产生阻塞)
3.HTTP 2.0
新特性:
- 使用了新的
二进制协议 多路复用机制(多个请求可在同一个TCP连接上进行)头部压缩,使用HPACK算法服务端推送
缺点:
- 进行
TLS传输时,多了一个握手过程,导致连接建立延时 - 没有彻底解决
队头阻塞问题。多个请求跑在一个TCP管道中,一旦HTTP2.0出现丢包,则整个TCP都需要进行重传,该TCP管道中的所有请求均会遭到阻塞
4.HTTP报文
HTTP报文由请求报文以及响应报文组成
请求报文:
组成结构:
- 请求行:
请求方法、请求URI、协议版本 - 请求头:各种请求的配置
- 空行
- 请求体:请求的参数
响应报文:
组成结构:
- 状态行:
协议版本、请求状态码、状态码英文名称 - 响应头:
通用头部、响应头部、实体头部 - 空行
- 响应体:服务器返回的数据主体
5.HTTPS 对称加密 非对称加密 混合加密
工作原理:
- HTTP请求
服务端生成证书,客户端对证书的有效期、合法性、域名一致性、证书公钥(RSA加密)进行校验 - 校验通过,
客户端生成随机数并使用公钥进行加密 - 产生消息体后,对消息体摘要进行
MD5(或SHA1)加密,即形成RSA签名 - 将签名发送给服务端,服务端使用
RSA私钥进行解密 - 解密后得到的随机数使用
AES加密,作为密钥(此时该密钥仅有客户端与服务端清楚)
可以知道,HTTPS采用混合加密方式:对称加密+非对称加密
对称加密与非对称加密:
简单来说:
- 对称加密:用什么密钥加密,就用什么密钥解密,一旦密钥泄漏,那么获得密钥的人就可以随意加解密
- 非对称加密:有两部分,公钥和私钥,公钥用来加密,私钥用来解密(因此私钥一定要保证不被泄漏),在速度方面比对称加密要差(注意:用
私钥进行加密的数据,也可以用公钥进行解密)
混合加密:
这里贴一张图,十分清楚,来源:
这里先设定:密钥A(对称加密),密钥B(非对称加密公钥),密钥C(非对称加密私钥),其中,密钥C存在于服务端,密钥A、B存在于客户端,步骤如下:
- 发送请求前,客户端将数据使用
密钥A加密,加密得到的数据发送给服务端 - 随后,客户端使用
密钥B将密钥A进行加密,仅有密钥C才能解密出密钥A - 客户端将
密钥B进行加密后得到的数据发送给服务端 - 这时,
服务端得到了两个数据:加密后的数据+加密后的密钥 - 服务端使用
密钥C(私钥)进行解密,获得了密钥A,最后利用密钥A,服务端进行解密获得了数据
其中:解密数据的密钥A被公钥给加密,如果别人没有私钥,即便获取到了加密的数据也无法解密。同理,没有密钥A,即便获取到了加密的数据,也无法进行解密
6.一次完整HTTP请求所经历的步骤
- 建立
TCP连接 - 发送
请求行 - 发送
请求头 - 服务器发送
状态行 - 服务器发送
响应头 - 服务器发送
数据 - 断开
TCP连接