About HTTP/1.0 and HTTP/2
您目前处于:编程  2017年01月09日

Before Request and Response

client向server请求资源,得到回复其实至少是三个过程:

# 建立TCP连线:由 Three-way handshake 建立连线

# client发送request:由浏览器发出 HTTP request

#server response:由 server 请求接受后,回应请求

HTTP/1.0

在 HTTP/1.0 的时候,client每请求一项资源,都必须先建立一次 TCP 连线,而在 client 收到 server 的 response后,便会断开TCP连线。

HTTP/1.1

而在 HTTP/1.1 的时代,允许同域名下的资源 request and response后,才断开 TCP 连线。

HTTP/2

在这里着重介绍 HTTP/2 的5个特色:

Binary Framing Layer

Multiplexing

Request Prioritization

Header Compression

Server Push


Binary Framing Layer

在 HTTP/1.X 由 OSI model 中的 Application Layer,存在着 Binary Framing Layer,记录着 HTTP 的内容像 HEADER 中的 method、content、message 等内容,以及 Data 部分。

而到 HTTP2 时,改由 HEADER frame 来纪录 HEADER 的内容,并使用 Data frame 来 纪录 Data 的内容。

一个基础的 Stream 由 HEADER frame 与 Data frame 组成。(共有10种 frame)

而每次的 connection 可以乘载着任意数量的 stream。

frame: HTTP/2通信最小单位

Multiplexing

Multiplexing 允许单一的 tcp 有多重请求/回应,也就是说 client 和 server 可以将 http 请求/回应分解成不藕合的 frame,然后随机发送,最后在另一端根据 stream ID 将 freame 组合起来。

由于 HTTP/1.X 的机制是采 FIFO,只有当请求得到回应后,才能发起下一次请求,也就是说请求间至少存在着前一次的请求 + 回应的等待时间。

Request Prioritization

在 HTTP/2 中,stream 有著 priority 的属性,而藉由 Priorty frame,便可以建立起 priority tree。

(1) A 的 priority 为 12,所以 A 共分配到 12/(12+4) = 3/4的资源比例。

B 的 priority 为 4,所以 B 共分配到 4/(12+4) = 1/4的资源比例。

(2) C 藕合于 D,当 D 关闭后,C并无其他竞争者,所以可以得到 D 100%的资源。

(3) 在 C 关闭后,A 可以得到 C 3/4的资源,B 可以得到 C 1/4的资源。

(4) D 关闭后,E 可以得到 D 50%的资源,C 得到的资源相同于 E。

在 E 关闭后,A 可以得到 C 3/4的资源,B 可以得到 C 1/4的资源。

Header Compression

在 client 和 server 个维护一个 HPACK,採用 hash 的方式来记录 HEADER 的内容。

也就是说当 client 要请求资源前会先去 HPACK 查找缺失的资源,接著请求缺少的资源。

Server Push

在 Binary Framing Layer 提过,frame 共有10种。

在这裡会利用 PUSH_PROMISE 的frame,它用于 server 主动发送资源给 client。

在上图例子中,client 先向 server 请求了 page.html,藉由 Server Push 的机制,server 除了回应 page.html 这个资源外,也主动发送了 script.js 以及 style.css 资源给 client。


转载请并标注: “本文转载自 linkedkeeper.com ”