据我了解,HTTP/2
引入一种名为HPACK
的有状态头部压缩机制。这是否改变了HTTP协议的无状态语义?对于Web应用程序来说,将HTTP/2
视为无状态协议是安全的吗?最后,HTTP/2
是否兼容现有的负载均衡器?
据我了解,HTTP/2
引入一种名为HPACK
的有状态头部压缩机制。这是否改变了HTTP协议的无状态语义?对于Web应用程序来说,将HTTP/2
视为无状态协议是安全的吗?最后,HTTP/2
是否兼容现有的负载均衡器?
原始的HTTP是一种无状态协议,这意味着每个请求消息可以独立理解。这意味着每个请求都需要带来服务器为了服务该请求所需的所有细节,而无需服务器存储先前请求的大量信息和元数据。
由于HTTP/2不改变这种范式,因此它必须以相同的方式工作,即无状态。
这在RFC文件中也很清楚地可见。其中提到:
超文本传输协议 (HTTP) 是分布式、协作式、超媒体信息系统的应用层协议。它是一个通用、无状态的协议,可用于许多任务...
HTTP/2 的定义也是:
本规范描述了超文本传输协议(HTTP)语义的优化表达,称为 HTTP 版本 2(HTTP/2)... 本规范是 HTTP/1.1 消息语法的替代方案,但并未使既有的 HTTP 语义发生变化。HTTP 的现有语义保持不变。
HTTP/2协议是设计为无状态的,因为相对于原始的 HTTP,语义保持不变。
HTTP/2连接是在TCP连接上运行的应用层协议(顺便说一下,您可以使用UDP进行HTTP传输,但UDP之所以没有使用是因为它不是“可靠的传输”)。不要将其与会话和传输层混淆。 HTTP协议是设计为无状态的。 通过加密的SSL/TLS连接的HTTP也不会改变这种情况,因为HTTPS中的S涉及到传输,而不是协议本身。
HPACK,即HTTP/2的头部压缩格式,是专门为HTTP/2头部设计的一种压缩格式,并在单独的互联网草案中进行了规定。它不会改变HTTP/2本身,因此不会改变语意。
在HTTP/2的RFC中,关于HPACK的章节中,他们指出:
头部压缩具有状态性。一个压缩上下文和一个解压缩上下文只用于整个连接。
以下是来自HPACK RFC的原因:
2.2.编码和解码上下文
为了解压头块,解码器只需维护一个动态表(请参阅第2.3.2节)作为解码上下文。没有其他动态状态是需要的。
在双向通信(例如HTTP)中使用时,端点维护的编码和解码动态表是完全独立的,即请求和响应动态表是分开的。
HPACK通过利用诸如HTTP协议中固有的冗余性来减少头字段编码的长度。其最终目标是减少发送HTTP请求或响应所需的数据量。
由于端点必须维护完全独立的编码和解码表,因此HPACK实现无法完全无状态。
同时,有一些库试图解决HPACK问题,例如,一个无状态事件驱动的HPACK编解码器CASHPACK:
由于需要维护动态表,因此HPACK实现不能完全无状态。借助于HTTP/2始终解码完整的HPACK序列的假设,通过使用事件驱动API,实现了状态的无状态化。
第5.1节的HTTP/2 RFC是HTTP/2标准定义的有状态机制的一个很好的例子。
HTTP/2是一个有状态的协议,但这并不意味着你的HTTP/2应用程序不能是无状态的。你可以选择忽略有状态的特性以创建无状态的HTTP/2应用程序。
尽管你可以将自己的应用程序定义为无状态的,但不应该假设任意的HTTP/2应用程序都是无状态的。事实上,所有流行的网站如果以无状态方式使用会出错,因此最好的做法是假设一个HTTP/2应用程序是有状态的。
同样适用于HTTP 1。尽管俗称HTTP 1是无状态的,但不能认为任意的HTTP 1应用程序都是无状态的,几乎所有应用程序在尝试无状态使用时都会出现问题。例如,你不能使用无状态的HTTP来使用Facebook。 使用有状态的HTTP是使用Facebook的要求。维基百科、谷歌、WolframAlpha、可汗学院、YouTube、亚马逊、Facebook等等都使用有状态的HTTP。DuckDuckGo可能是唯一一个不需要有状态的HTTP来实现基本功能的流行网站,但是即使如此,没有有状态的HTTP登录和其他功能也会出现问题。
有状态机制是后来对原始无状态标准的补充。虽然俗称HTTP/1是无状态的,但实际上我们已经使用了近三十年的标准化有状态机制,例如Cookie和缓存。无状态的HTTP在现代世界中并不是很有用或高效,所以与HTTP/1不同,HTTP/2从一开始就定义了有状态组件。特定的HTTP/2应用程序可以忽略HTTP/2的特性来保持无状态,但协议本身预计状态是常态而不是例外。现代的HTTP使用是有状态的。古老的HTTP是无状态的。
state
的比赛证据和0次关于stateless
的发现听起来像是一个关于HTTP2的愚蠢学生答案。HTTP/1.1中也提到了stateless
和state
,在RFC中的命中率为1比42,这是否意味着旧的HTTP比无状态更加有状态?哈哈,真是个笑话!流媒体能力并不意味着有状态性。虽然HTTP/2相对于HTTP/1.1引入了新的功能和优化,如头部压缩和服务器推送,但它并没有从根本上改变HTTP协议的无状态特性,每个请求/响应仍然独立处理,没有状态。 - Farside