HTTP/1.1改进
- 持久化连接:
设定header为connection:keep-alive实现持久连接,持久连接会等到TCP四次挥手才会断开。
- 虚拟主机:
添加header为host:dns域名。可能一个项目有多个域名,但是他们的IP地址是一样的,因此服务器可以对于不同的域名进行不同的响应。
- 添加状态码:
比如421错误代码等等。
- 添加浏览器缓存方式:
比如添加private和no-store。
private是指只允许浏览器进行缓存数据,不允许中间代理以及服务器缓存数据。
no-store是指浏览器和服务器都不允许缓存。
注意:no-cache是更为常用的方式,指浏览器当下不缓存。
-
分块传输->文本传输
-
range关键字:
可以文件指定范围进行传送
- 管道传输
一个TCP连接可以发送多个请求文件块。,然后http/1.1一般是6个TCP通道,之所以是6个是因为http/1.1采用文本块的多路复用,如果该TCP文本块阻塞,可能会影响到别的TCP文件;同时TCP请求的建立和资源分配也需要空间,过多会导致资源分配出现问题,性能下降。
HTTP/2.0改进
- 多路复用
多个请求可以并行在一个TCP连接发送
- 二进制帧和流
文本传输更改为二进制帧流,解决应用层队首阻塞
- 单一连接
只开放一个TCP连接
- Header压缩
hpack算法压缩头部体积,特别是cookie的大小
hpack算法:(1)维护一张静态字典表,里面有常见的header和缩写,查找到相关header就替换成缩写;(2)维护一张该浏览器的动态表,里面有该浏览器常用的header和缩写,查找就替换成缩写;(3)如果都没有,就压缩成缩写,并把header和缩写写入动态表。
- 优先级排序
http/2.0浏览器会自定义给文件的优先级进行排序,根据依赖关系进行排序,优先处理关键资源。
HTTP/3.0改进
- QUIC
结合了TCP+TLS的协议,能够实现握手和加密通信
- 0-RTT
握手和加密是在一个RTT实现的,然后立马就可以发送消息,不需要服务器端答复握手的确定序列号
-
多路复用
-
传输层解决队首阻塞
传输层基于UDP无状态协议,不会进行丢包校验
- header压缩
同样是基于hpack算法