http2 pseudo-headers :authority & :method 的目的是什么?
What is the purpose of http2 pseudo-headers :authority & :method?
http2 pseudo-headers :authority
& :method
的目的是什么?我感到困惑,因为 :authority
& :method
似乎重复了 Request URL(主机)和 Request Method 在 http 1.1
与 :path
pseudo-headers 相比,如 https://developers.google.com/web/fundamentals/performance/http2#header_compression 中所述,我可以看到它可以用于对其他资源的连续请求。所以我怀疑 :authority
& :method
也可能是为此目的进行的优化。但我无法弄清楚到底是怎么回事。比如:authority
,:method
,:path
都和原来的RequestURL和Request Method不一样,难道浏览器不应该重新发出一个请求吗?
HTTP/2:method
pseudo-header等同于HTTP/1.1请求方式(HTTP/1.1请求行的第一个token) .
HTTP/2 :authority
pseudo-header 是更严格的、强制性的、关于主机权限的信息(即主机名和主机端口)。
在 HTTP/1.1 中,主机权限来自多个来源,甚至可能不存在,导致许多依赖于服务器实现的混乱行为。
例如,当权限位于 absolute form.
时,权限可能出现在 HTTP/1.1 请求目标中
如果 HTTP/1.1 请求目标在 origin form, typically the authority is defined by the Host
header 中。
但是,HTTP/1.1 请求可能是这种形式:
GET / HTTP/1.1\r\n
Host: \r\n
\r\n
其中 Host
字段为空,因此没有权限。这种类型的请求并不常见,但在技术上是有效的,并且不同的服务器实现可能会有不同的行为。
此外,权限可能会被 Forwarded
header 及其过时的前身 X-Forwarded-*
header 覆盖,但同样使用模糊规则。
HTTP/2 :authority
pseudo-header 的目的是为了消除权威上的混淆,使来源单一而不再有多个来源,例如 HTTP/1.1绝对形式或Host
header等
关于优化,HTTP/2 确实可以优化 :authority
信息的发送,但这与 :authority
pseudo-header 的目的正交.
优化以这种方式(非常粗略地)工作:当用户代理(例如浏览器)对页面发出请求时,它很可能会向同一权限发出后续请求,以获取其他必要的次要资源呈现页面(例如,CSS 资源、JavaScript 资源、图像等)。
HTTP/2 协议索引 :authority
字符串,比方说在 HPACK 上下文的索引 17 处,因此浏览器向服务器发送带有信息 :authority => (17, "veryverylongdomainname.com")
.
的第一个请求
对于第二个请求,浏览器和服务器现在共享这个公共信息,所以浏览器可以只发送给服务器 :authority => 17
,服务器会从索引 17 中查找权限,保存权限字符串的发送字节通过网络。
这种 HPACK 机制对大多数 headers 有效,而不仅仅是 pseudo-headers。有关详细信息,请参阅 HPACK specification.
浏览器必须对每个资源发出请求。如果他们请求相同的权限,HPACK 优化可能会启动并减少网络上的字节数。
如果浏览器对不同的权限发出请求(想象一个网络蜘蛛),那么每个请求中的权限可能不同,并且 HPACK 优化可能不会启动,因为权限总是不同的。
在最坏的情况下(权限总是不同的),HTTP/2 和 HTTP/1.1 一样好;但在一般情况下(具有相同权限的许多资源的网页),HTTP/2 优于 HTTP/1.1,因为通过网络发送的字节更少。
http2 pseudo-headers :authority
& :method
的目的是什么?我感到困惑,因为 :authority
& :method
似乎重复了 Request URL(主机)和 Request Method 在 http 1.1
与 :path
pseudo-headers 相比,如 https://developers.google.com/web/fundamentals/performance/http2#header_compression 中所述,我可以看到它可以用于对其他资源的连续请求。所以我怀疑 :authority
& :method
也可能是为此目的进行的优化。但我无法弄清楚到底是怎么回事。比如:authority
,:method
,:path
都和原来的RequestURL和Request Method不一样,难道浏览器不应该重新发出一个请求吗?
HTTP/2:method
pseudo-header等同于HTTP/1.1请求方式(HTTP/1.1请求行的第一个token) .
HTTP/2 :authority
pseudo-header 是更严格的、强制性的、关于主机权限的信息(即主机名和主机端口)。
在 HTTP/1.1 中,主机权限来自多个来源,甚至可能不存在,导致许多依赖于服务器实现的混乱行为。
例如,当权限位于 absolute form.
时,权限可能出现在 HTTP/1.1 请求目标中
如果 HTTP/1.1 请求目标在 origin form, typically the authority is defined by the Host
header 中。
但是,HTTP/1.1 请求可能是这种形式:
GET / HTTP/1.1\r\n
Host: \r\n
\r\n
其中 Host
字段为空,因此没有权限。这种类型的请求并不常见,但在技术上是有效的,并且不同的服务器实现可能会有不同的行为。
此外,权限可能会被 Forwarded
header 及其过时的前身 X-Forwarded-*
header 覆盖,但同样使用模糊规则。
HTTP/2 :authority
pseudo-header 的目的是为了消除权威上的混淆,使来源单一而不再有多个来源,例如 HTTP/1.1绝对形式或Host
header等
关于优化,HTTP/2 确实可以优化 :authority
信息的发送,但这与 :authority
pseudo-header 的目的正交.
优化以这种方式(非常粗略地)工作:当用户代理(例如浏览器)对页面发出请求时,它很可能会向同一权限发出后续请求,以获取其他必要的次要资源呈现页面(例如,CSS 资源、JavaScript 资源、图像等)。
HTTP/2 协议索引 :authority
字符串,比方说在 HPACK 上下文的索引 17 处,因此浏览器向服务器发送带有信息 :authority => (17, "veryverylongdomainname.com")
.
的第一个请求
对于第二个请求,浏览器和服务器现在共享这个公共信息,所以浏览器可以只发送给服务器 :authority => 17
,服务器会从索引 17 中查找权限,保存权限字符串的发送字节通过网络。
这种 HPACK 机制对大多数 headers 有效,而不仅仅是 pseudo-headers。有关详细信息,请参阅 HPACK specification.
浏览器必须对每个资源发出请求。如果他们请求相同的权限,HPACK 优化可能会启动并减少网络上的字节数。
如果浏览器对不同的权限发出请求(想象一个网络蜘蛛),那么每个请求中的权限可能不同,并且 HPACK 优化可能不会启动,因为权限总是不同的。
在最坏的情况下(权限总是不同的),HTTP/2 和 HTTP/1.1 一样好;但在一般情况下(具有相同权限的许多资源的网页),HTTP/2 优于 HTTP/1.1,因为通过网络发送的字节更少。