HTTP 2:Session 跨度查询

HTTP 2 : Session Span Query

抱歉,我认为这个问题可能很愚蠢,但是:

我对 HTTP 2 的理解是,您创建一个连接,如果需要,建立 TLS,然后升级到 2,并在那个连接上做很多小查询:。获得速度提升,因为您没有 re-establishing 连接和 TLS。

如果这是真的,当涉及到会话时 - 连接上的每个请求是否都被视为唯一请求并且:.有 cookie 和 headers,或者它们是否都被视为原始请求的 sub-requests?

这对代理有影响,您是否可以将来自客户端的请求合并到一个流中?

My understanding of HTTP 2 is that you create a connection, establish TLS if you want to, then upgrade to 2

不完全是。如果您使用 TLS,则使用 HTTP/2 将作为 TLS 协商的一部分进行协商。如果您不使用 TLS,则可以升级,但浏览器仅支持 HTTP/2 通过 HTTPS,因此这是大多数用例。

When it comes to sessions - is each request over the connection treated as an unique request and :. has cookies and headers, or whether they're all treated as sub-requests of the original request?

每个请求都是 HTTP/2 中所谓的 的一部分。这是一个独特的请求,有自己的 Cookie 和 Headers,并且与之前的请求无关(尽管请参阅下面的注释了解一些关于此的注意事项)。从概念上讲,它与 HTTP/1.1 允许您在一个连接上发送多个唯一的、不相关的请求并没有什么不同——但与 HTTP/1.1 不同的是,多个请求可以同时传输在 HTTP/2 感谢 multiplexing.

这张图可能有助于解释:https://freecontent.manning.com/mental-model-graphic-how-is-http-1-1-different-from-http-2/

This has impact on proxies whether you could merge requests from clients into a single stream or not?

我不确定你这是什么意思?


注意:虽然 HTTP/2 请求彼此独立,并且 HTTP 在较高级别上仍然是无状态的,但是当您进入较低级别时,有几个地方的严格措辞可能会受到挑战,并且在哪里这些请求之间在技术上存在某种联系。例如:

  • HTTP/2 实际上使用 HPACK header 压缩来压缩 HTTP headers 所以如果相同的 header 在不同的请求上发送两次(例如相同的 cookie)那么第二次调用将包含对先前收到的 header 的引用,而不是重复数据。
  • 每个请求都有一个唯一的流 ID,它是一个递增的整数,它可以是奇数(客户端发起)或偶数(服务器发起)所以当然流 ID 必须由 HTTP/2 实现管理,所以有争议。
  • HTTP/2 推送资源以响应先前的请求流 ID。

但这些实际上都只是连接级别的问题和效率问题。对于 HTTP/2 用户(例如 Web 开发人员),每个 HTTP/2 请求都是独立的,就像它在 HTTP/1.1 下一样,并且 HTTP 仍然是无状态的。