24

As the title suggests, I'm looking for some information on the purpose of pseudo/colon header fields, i.e. I want to know why we have a second type of header field...

Also - I know pseudo/colon header fields are used in http2 in place of the message and status lines (^^^the reason for which I don't know^^^); but are pseudo/colon header fields used in http1 to relay different information (from status and request)?

4

1 回答 1

31

伪标头字段的目的是统一 SPDY 和后来的 HTTP/2(基于 SPDY)中携带请求/响应信息的方式。

在设计 SPDY(还有 HTTP/2)时,需要传输以不同方式格式化的请求或响应信息。

HTTP 标头是(键,值)对,这很容易。

但是,有HTTP方法的概念。这恰好是请求行的第一个标记,所以它不是元组;它的键由它的位置(第一个标记)定义,它的值是请求行上出现的形成第一个标记的实际字符。

请求目标和 HTTP 版本也是如此:它们是请求行的第二个和第三个标记。

所以从概念上讲,一个 HTTP 请求可以用这种方式对表示,例如:

(method, GET)  
(target, /)  
(version, HTTP/1.1)  
(Connection, close)  
(Accept, *)  

但是,“method”、“target”和“version”不能用作普通 HTTP 头,因为它们从未被 HTTP 规范保留为标准 HTTP 头名称,人们可以将它们用作自定义 HTTP 头名称(想象一下使用“版本”标头的 REST API)。

HTTP/2 需要一种方法以一种同质的方式将这些对作为对进行传输,因为这会(大量)简化协议。

因此,为请求和响应行携带的额外信息引入了特殊名称。额外的信息在 HTTP/1.1 中是位置信息,但在 HTTP/2 中是正常的对,这使得 HTTP/2 在这方面更加同质:它只携带对。如此之多,以至于承载请求和响应信息的 HTTP/2 帧是相同的,它只是称为HEADERS

伪标头名称选择以冒号开头,因为这对于 HTTP/1.1 中的标头名称来说是非法字符。HTTP/1.1 不使用伪标头名称。

于 2015-06-17T20:45:20.830 回答