【发布时间】:2016-07-10 18:14:48
【问题描述】:
据我了解,HTTP/2 带有一个名为 HPACK 的有状态标头压缩。它不会改变 HTTP 协议的无状态语义吗? Web 应用程序将HTTP/2 视为无状态协议是否安全?最后,HTTP/2 会兼容现有的负载均衡器吗?
【问题讨论】:
标签: http architecture protocols http2
据我了解,HTTP/2 带有一个名为 HPACK 的有状态标头压缩。它不会改变 HTTP 协议的无状态语义吗? Web 应用程序将HTTP/2 视为无状态协议是否安全?最后,HTTP/2 会兼容现有的负载均衡器吗?
【问题讨论】:
标签: http architecture protocols http2
原来的HTTP是一个无状态的协议,这意味着每个请求消息都可以被孤立地理解。这意味着每个请求都需要包含服务器为该请求提供服务所需的尽可能多的详细信息,而服务器不必存储来自先前请求的大量信息和元数据。
由于 HTTP/2 没有改变这种范式,它必须以相同的方式工作,无状态。
从official RFCs 也可以清楚地看到它。声明如下:
超文本传输协议 (HTTP) 是用于分布式、协作、超媒体信息系统的应用程序级协议。它是一个通用的无状态协议,可用于许多任务...
HTTP/2 的定义说:
本规范描述了超文本传输协议 (HTTP) 语义的优化表达,称为 HTTP 版本 2 (HTTP/2)...本规范是 HTTP/ 1.1 消息语法。 HTTP 的现有语义保持不变。
HTTP/2 协议在设计上是无状态的,因为与原始 HTTP 相比,语义保持不变。
HTTP/2 连接是在 TCP 连接之上运行的应用层协议(顺便说一句,没有什么能阻止您使用 HTTP over UDP 例如,这是可能的,但不使用 UDP,因为它不是“可靠的运输”)。不要将它与会话和传输层混合。 HTTP 协议在设计上是无状态的。 通过加密 SSL/TLS 连接的 HTTP 也不会改变此语句,因为 HTTPS 中的 S 关注的是传输,而不是协议本身。
HPACK,HTTP/2 的标头压缩,是一种专门为 HTTP/2 标头设计的压缩格式,在 separate internet draft 中指定。它不会改变 HTTP/2 本身,因此不会改变语义。
在RFC for HTTP/2 关于 HPACK 的部分中,他们声明:
标头压缩是有状态的。一个压缩上下文和一个 整个连接都使用解压上下文。
这就是来自HPACK's RFC的原因:
2.2.编码和解码上下文
要解压头块,解码器只需要维护一个 动态表(参见第 2.3.2 节)作为解码上下文。没有其他 需要动态。
当用于双向通信时,例如在 HTTP 中, 端点维护的编码和解码动态表是 完全独立,即请求和响应动态表 是分开的。
HPACK 通过利用 HTTP等协议固有的冗余。的最终目标 这是为了减少发送 HTTP 所需的数据量 请求或响应。
HPACK 实现不能完全无状态,因为编码和解码表完全独立,必须由端点维护。
同时还有一些库,尝试解决HPACK问题,例如无状态事件驱动的HPACK编解码器CASHPACK:
HPACK 实现不能完全无状态,因为需要维护动态表。依靠 HTTP/2 将始终解码完整的 HPACK 序列这一假设,无状态是使用事件驱动的 API 实现的。
【讨论】:
许多 HTTP/2 组件就是有状态的定义。
没有理智的人可以阅读 HTTP/2 RFC 并认为它是无状态的。错误的“HTTP 是无状态的”旧时教条是错误的并不代表 HTTP 的当前现实。
以下是有状态 HTTP/1 和 HTTP/2 组件的有限列表,并非详尽无遗:
Section 5.1 HTTP/2 RFC 是 HTTP/2 标准定义的有状态机制的一个很好的例子。
Web 应用程序将 HTTP/2 视为无状态协议是否安全?
HTTP/2 是一种有状态协议,但这并不意味着您的 HTTP/2 应用程序不能是无状态的。您可以通过仅使用 HTTP/2 功能的子集来选择不对无状态 HTTP/2 应用程序使用某些有状态功能。
Cookie 和其他一些状态机制,或者不太明显的状态机制,是 HTTP 后期添加的。 HTTP 1 is said to be stateless 尽管在实践中我们使用标准化的状态机制。 与 HTTP/1.0 不同,HTTP/2 在其标准中定义了有状态组件,因此是有状态的。特定的 HTTP/2 应用程序可以使用 HTTP/2 功能的子集来保持无状态。
如果尝试无状态地使用它们,需要状态的现有应用程序,甚至是 HTTP 1 应用程序都会中断。如果禁用 cookie,可能无法登录某些 HTTP/1.1 网站,从而破坏应用程序。假设特定的 HTTP 1 应用程序不使用状态可能并不安全。这对于 HTTP/2 没有什么不同。在 Netscape 在 1994 年发明 cookie 和 HTTPS 之前,http 可以被认为是无状态的。
和我说最后一次:
【讨论】: