HTTP/2 [RFC 7540] (二) —— 帧交换

in 开发 with 0 comment

今天我们看下几个报文交换的例子,大家也可以去抓本站的报文,本站已经全面开启h2协议。

GET 请求

一个简单的GET请求,HTTP 1.1 报文如下:

GET /resource HTTP/1.1
Host: example.org
Accept: image/jpeg

看看H2的报文:

HEADERS
   + END_STREAM
   + END_HEADERS
     :method = GET
     :scheme = https
     :path = /resource
     host = example.org
     accept = image/jpeg

首先我们在H2的报文上,先指定报文的类型,为HEADERS(type=0x1),参考我们的帧格式,接下来我们就要指定一个标记位,
标记位在帧类型的定义中有说明,我们这里因为只是请求一个资源,所以包只有一个。

接下去带:的是我们的"伪头(Pseudo-Header)",它并不属于HTTP HEADER的范畴,,我们不可以自己去生成未定义的"伪头",也不可以出现在Response里,也不会出现在非首包的位置。

接下去就是我们真正的HTTP Header了,里面定义了一些业务相关的参数,供HTTP服务器去解析和使用。

ResponseHTTP 1.1版本:

HTTP/1.1 304 Not Modified
ETag: "xyzzy"
Expires: Thu, 23 Jan ...

HTTP 2版本:

HEADERS
    + END_STREAM
    + END_HEADERS
      :status = 304
      etag= "xyzzy"
      expires = Thu, 23 Jan ...

这是一个简单的GET请求,然后我们看一下POST

POST

HTTP 1.1请求:

POST /resource HTTP/1.1
Host: example.org
Content-Type: image/jpeg
Content-Length: 123

{binary data}

HTTP 2请求:

HEADERS
    - END_STREAM
    - END_HEADERS
      :method = POST
      :path = /resource
      :scheme = https

CONTINUATION
    + END_HEADERS
      content-type = image/jpeg
      host = example.org
      content-length = 123

DATA
    + END_STREAM
{binary data}

这里唯一不同的是,我们看到了CONTINUATION包,只要不加END_HEADERS我们的header可以分很多帧去提交。
我们看下Response in HTTP 1.1:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123

{binary data}

in HTTP 2:

HEADERS
    - END_STREAM
    + END_HEADERS
      :status = 200
      content-type = image/jpeg
      content-length = 123

DATA
    + END_STREAM
{binary data}

最简单的帧交换例子就是这样,HTTP的组成部分仍然没有变化,由HEADERBODY组成,而BODY可选。

关注TalkWithMobile,关注我