HTTP/2.0

327 阅读4分钟

1.HTTP/1.x缺陷

HTTP/1.x 实现简单是以牺牲性能为代价的:

  • 客户端需要使用多个连接才能实现并发和缩短延迟;
  • 不会压缩请求和响应首部,从而导致不必要的网络流量;
  • 不支持有效的资源优先级,致使底层TCP连接的利用率低下

2.二进制分帧层

HTTP/2.0 将报文分成Header帧和Data帧,它们都是二进制格式的

image.png

在通信过程中,只会有一个TCP连接存在,它承载了任意数量的双向数据流(Stream)

  • 一个数据流(Stream)都有一个唯一标识符和可选的优先级信息,用于承载双向信息
  • 消息(Message)是与逻辑请求或响应对应的完整的一系列帧
  • 帧(Frame)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装

image.png

3.服务端推送

HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发送请求了

  • 例如: 客户端请求page.html页面,服务端就把script.js和style.css等与之相关的资源一起发给客户端

image.png

4.首部压缩

  • HTTP/1.1的首部带有大量信息,而且每次都要重复发送

  • HTTP/2.0要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输

  • 不仅如此,HTTP/2.0也是用Huffman编码对首部字段进行压缩

image.png

5.HTTP/1.1新特性

  • 默认是长连接
  • 支持流水线
  • 支持同时打开多个TCP
  • 支持虚拟主机
  • 新增状态码 100
  • 支持分块传输编码
  • 新增缓存处理指令 max-age

6.Get和Post比较

6.1 作用

  • Get用于获取资源
  • Post用于传输实体主体

6.2 参数

Get和Post请求都能使用额外的参数,但是Get的参数是以查询字符串出现再URL中,而Post的参数存储再实体主体中不能因为Post参数存储再实体主体中就认为它的安全性更高,因为照样可以通过抓包工具(Fiddler)查看

  • 因为URL只支持ASCII码,因此Get的参数中如果存在中文等字符需要先进性编码
    • 例如: 中文 会转换为 %E4%B8%AD%E6%96%87
    • 空格会转化为 %20
  • Post参数支持标准字符集
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

6.3 安全

安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的

GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变

安全的方法除了 GET 之外还有: HEAD、OPTIONS

不安全的方法除了 POST 之外还有: PUT、DELETE

6.4 幂等性

幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)

  • 所有的安全方法也都是幂等的

在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是

  • GET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
  • POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:
POST /add_row HTTP/1.1   -> Adds a 1nd row
POST /add_row HTTP/1.1   -> Adds a 2nd row
POST /add_row HTTP/1.1   -> Adds a 3rd row
  • DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:
DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404

6.5 可缓存

如果要对响应进行缓存,需要满足以下条件:

  • 请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的;
  • 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501;
  • 响应报文的 Cache-Control 首部字段没有指定不进行缓存

6.6 XMLHttpRequest

为了阐述 POST 和 GET 的另一个区别,需要先了解 XMLHttpRequest:

XMLHttpRequest是一个API,它为客户端提供了再客户端和服务器之间传输数据的功能。它提供了一个通过URL来获取数据的简单方式,并且不会使整个页面刷新。这使得页面只更新一部分页面而不会打扰到用户。XMLHttpRequest再AJAX中被大量使用

  • 在使用XMLHttpRequest的POST方法时,浏览器会先发送Header再发送Data。但是并不是所有浏览器会这个做,例如火狐就不会
  • 而GET方法Header和Data会一起发送