0%

HTTP各版本特性

HTTP(超文本传输协议)定义了浏览器如何向服务器请求万维网文档以及服务器如何将文档传送给浏览器。

HTTP 0.9

HTTP 0.9在请求时不支持请求头,并且只支持GET方法。

HTTP 1.0

HTTP1.0 加入了以下几个内容

  • 在请求中加入了HTTP版本号信息

  • 加入了请求头

  • 增加了HTTP Status Code作为状态码

但是HTTP1.0在性能上有很大的问题,每次请求都需要建立一个TCP连接,并且是串行执行请求。

HTTP 1.1

HTTP 1.1的变化主要有以下几个内容

  1. 设置 keepalive 让 HTTP 重用 TCP 连接,省下了每次握手都要进行 TCP 3 次握手的重大开销。也就是 HTTP 长连接。
  2. 支持以流水线的形式进行请求发送,只要一个请求发出去,不必等到其回来就可以发送第二个请求出去。
  3. 增加了 cache control 机制。
  4. 增加 HOST 头,服务器可以知道你在请求哪个网站。
  5. 加入了 OPTIONS 方法,用于 CORS 应用。

HTTPS

HTTPS在传输过程中通过加密来保护数据安全,避免用户敏感信息被第三方获取。其过程如下

  1. 客户端发起HTTPS请求,告诉客户端自己所支持的加密套件列表以及希望使用的TLS选项。
  2. 服务端选择客户端的一个加密套件,会有一套数字证书,就是一对公钥和私钥。
  3. 传输证书,将公钥信息传递给客户端。
  4. 客户端解析证书,会验证公钥是否有效。一般操作系统和浏览器都会内置一个知名证书颁发机构的名单,也可以通过手动指定证书的方式来添加证书。如果证书存在问题,那么会弹出警示框告诉用户该网站不安全。如果证书没有问题,那么生成一个随机值作为会话密钥。
  5. 将随机值通过公钥进行加密,然后将加密后的随机值传输给服务端
  6. 服务端用私钥解密,获取到的随机值就是会话密钥。双方使用该密钥进行对称加密通信。

HTTP 2.0

HTTP 1.1虽然可以重用TCP连接,但是还是需要串行发送请求以保证其顺序。但是大量的网页请求中都是些资源类的东西,如果能够并行这些请求,那就会增加更大的网络吞吐和性能。同时HTTP1.1 在传输数据时使用的是文本的方式,借助zip压缩方式以减少网络带宽,但是会消耗前端和后端的CPU资源。

与HTTP2.0的新特性包括

  1. HTTP/2是一个二进制协议,增加了数据传输的效率。
  2. 可以在一个TCP连接中并发请求多个HTTP请求。
  3. 使用HPACK算法压缩头部信息,如果多个请求的头是相识的,协议会消除重复的部分。
  4. 允许服务端PUSH。例如请求X,服务端知道X依赖于Y,会同时将Y一起返回客户端。

HTTP 3.0

虽然HTTP2.0能够多个HTTP请求复用一个TCP连接,但是底层的TCP协议不知道上层有多少个HTTP请求,一旦出现丢包,会造成所有的HTTP请求都必需等待丢了的包被重传回来,即使这个包不是本次HTTP请求的。

为了解决这一问题,HTTP 3.0 将HTTP的底层由TCP协议改为了UDP协议,并且使用了QUIC。因为UDP不需要管理顺序,不管丢包。QUIC的任务就是要有一个像TCP一样的丢包重传机制。在基于UDP以后,QUIC直接将TCP和TLS需要做的事情合并为了三次握手。因此QUIC可以将其视为一个在UDP之上的伪TCP +TLS +HTTP/2的多路复用的协议。