HTTP/1.0到HTTP3.0

107 阅读2分钟

HTTP/1.1改进

  1. 持久化连接:

设定header为connection:keep-alive实现持久连接,持久连接会等到TCP四次挥手才会断开。

  1. 虚拟主机:

添加header为host:dns域名。可能一个项目有多个域名,但是他们的IP地址是一样的,因此服务器可以对于不同的域名进行不同的响应。

  1. 添加状态码:

比如421错误代码等等。

  1. 添加浏览器缓存方式:

比如添加private和no-store。

private是指只允许浏览器进行缓存数据,不允许中间代理以及服务器缓存数据。

no-store是指浏览器和服务器都不允许缓存。

注意:no-cache是更为常用的方式,指浏览器当下不缓存。

  1. 分块传输->文本传输

  2. range关键字:

可以文件指定范围进行传送

  1. 管道传输

一个TCP连接可以发送多个请求文件块。,然后http/1.1一般是6个TCP通道,之所以是6个是因为http/1.1采用文本块的多路复用,如果该TCP文本块阻塞,可能会影响到别的TCP文件;同时TCP请求的建立和资源分配也需要空间,过多会导致资源分配出现问题,性能下降。

HTTP/2.0改进

  1. 多路复用

多个请求可以并行在一个TCP连接发送

  1. 二进制帧和流

文本传输更改为二进制帧流,解决应用层队首阻塞

  1. 单一连接

只开放一个TCP连接

  1. Header压缩

hpack算法压缩头部体积,特别是cookie的大小

hpack算法:(1)维护一张静态字典表,里面有常见的header和缩写,查找到相关header就替换成缩写;(2)维护一张该浏览器的动态表,里面有该浏览器常用的header和缩写,查找就替换成缩写;(3)如果都没有,就压缩成缩写,并把header和缩写写入动态表。

  1. 优先级排序

http/2.0浏览器会自定义给文件的优先级进行排序,根据依赖关系进行排序,优先处理关键资源。

HTTP/3.0改进

  1. QUIC

结合了TCP+TLS的协议,能够实现握手和加密通信

  1. 0-RTT

握手和加密是在一个RTT实现的,然后立马就可以发送消息,不需要服务器端答复握手的确定序列号

  1. 多路复用

  2. 传输层解决队首阻塞

传输层基于UDP无状态协议,不会进行丢包校验

  1. header压缩

同样是基于hpack算法