HTTP/0.9
特点:
支持单文件只有一个请求行,服务器只有请求体
问题:
只能传送文本类型的数据
HTTP/1.0
特点:
- 支持多文件,增加请求头和响应头处理语言、压缩、编码问题
accept: text/html //接收的文件类型
accept-encoding: gzip, deflate, br //接收的文件压缩方式
accept-Charset: ISO-8859-1,utf-8 //接收的文件编码
accept-language: zh-CN,zh //接收的语言
content-encoding: br //发送的文件压缩方式
content-type: text/html; charset=UTF-8 //发送的文件编码
复制代码
- 引入了状态码通知浏览器,增加响应行
- 提供Cache机制(强制缓存和协商缓存)
- 加入用户代理统计客户端信息
问题:
TCP连接和断开频繁浪费很多时间
HTTP/1.1
特点:
- 改进持久连接,一个TCP连接上可以传输多个(最多6个) HTTP 请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。
- 不成熟的HTTP管线化,将多个HTTP请求整批提交给服务器,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。
- 提供虚拟主机的支持,增加了Host字段,用来表示当前的域名地址
- 引入分块传输(Chunk transfer)机制,对动态生成的内容提供了完美支持
- 客户端Cookie、安全机制
问题:
HTTP/1.1对带宽的利用率却并不理想,主要是由以下三个原因导致的:
- TCP的慢启动
- 同时开启了多条TCP连接,那么这些连接会竞争固定的带宽
- 队头阻塞的问题(管道化要求服务端必须按照请求发送的顺序返回响应,那如果一个响应返回延迟了,那么其后续的响应都会被延迟,直到队头的响应送达)
HTTP/2(解决HTTP队头拥塞)
特点:
- 多路复用,在协议栈中添加二进制分帧层(数据转换为一个个带有请求ID编号和序号的帧)来实现的
- 实现请求的优先级,优化这些帧的交错和传输顺序进一步优化性能
- 服务器推送
- 头部压缩
问题:
HTTP/2 依然是基于TCP协议的,而TCP协议依然存在数据包级别的队头阻塞问题(一个TCP分节丢失,导致其后续分节不按序到达接收端的时候,该后续分节将被接收端一直保持直到丢失的第一个分节被发送端重传并到达接收端为止)
HTTP/3
特点:
选择了一个折衷的方法——UDP 协议,基于UDP实现了类似于 TCP 的多路数据流、传输可靠性等功能,我们把这套功能称为QUIC协议
HTTPS
HTTPS对称加密:
- 浏览器发送它所支持的加密方法列表和一个随机数client-random
- 服务器会从加密的方法列表中选取一个加密方法,然后还会生成一个随机数service-random,并将service-random和选中的加密方法返回给浏览器
- client-random + service-random计算密钥,然后利用密钥加解密
HTTPS非对称加密
服务器会将公钥通过明文的形式发送给浏览器,服务器自己留下私钥,无法保证服务器发送给浏览器的数据安全
- 浏览器发送它所支持的加密方法列表
- 服务器会从加密的方法列表中选取一个加密方法,并将公钥和选中的加密方法返回给浏览器
- 然后利用公钥加密,私钥解密
HTTPS对称加密+非对称加密
利用公钥对pre-master加密确认公钥的合法性,然后使用对称密钥进行加解密(client-random + service-random + pre-master)
- 浏览器向服务器发送对称加密方法列表、非对称加密方法列表和随机数client-random
- 服务器保存随机数client-random,然后生成随机数service-random,向浏览器发送选择的加密方法和非对称加密方法、service-random和公钥
- 浏览器保存公钥,并生成随机数pre-master,然后利用公钥对pre-master加密,并发送服务器
- 服务器拿出私钥,解密出pre-master数据,并返回确认pre-master正确性消息
- client-random + service-random + pre-master生成生成对称密钥,然后使用对称密钥加解密
HTTPS对称加密+非对称加密+数字证书(DNS劫持)
- 浏览器向服务器发送对称加密方法列表、非对称加密方法列表和随机数 client-random
- 服务器保存随机数 client-random,然后生成随机数 service-random,向浏览器发送选择的加密方法和非对称加密方法、service-random和数字证书(含公钥)
- 浏览器保存公钥,并生成随机数pre-master,然后利用公钥对pre-master加密,并发送服务器
- 服务器拿出私钥,解密出pre-master 数据,并返回确认消息
- client-random + service-random + pre-master生成生成对称密钥,然后使用对称密钥加解密