伪/冒号标题字段的用途

Nat*_*ius 14 networking protocols http http-headers http2

正如标题所示,我正在寻找关于伪/冒号头字段目的的一些信息,即我想知道为什么我们有第二种类型的头字段......

另外 - 我知道在http2中使用伪/冒号头字段代替消息和状态行(^^^我不知道的原因^^^); 但是http1中使用伪/冒号头字段来传递不同的信息(来自状态和请求)?

sbo*_*det 17

伪标头字段的目的是统一在SPDY中以及稍后在HTTP/2(基于SPDY)中携带请求/响应信息的方式.

当设计SPDY(但也是HTTP/2)时,需要传输以不同方式格式化的请求或响应信息.

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

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

与请求目标和HTTP版本相同:它们是请求行的第二个和第三个标记.

因此,从概念上讲,HTTP请求可以用这种方式用对来表示,例如:

(method, GET)  
(target, /)  
(version, HTTP/1.1)  
(Connection, close)  
(Accept, *)  
Run Code Online (Sandbox Code Playgroud)

但是,"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不使用伪标头名称.