zer*_*one 18 architecture protocols http http2
根据我的理解,HTTP/2带有状态头压缩称为HPACK.它不会改变HTTP协议的无状态语义吗?将Web应用程序视为HTTP/2无状态协议是否安全?最后,是否HTTP/2兼容现有的负载均衡器?
Far*_*ide 19
原始HTTP是无状态协议,这意味着可以孤立地理解每个请求消息.这意味着每个请求都需要带来与服务器需要服务该请求一样多的细节,而服务器不必存储来自先前请求的大量信息和元数据.
由于HTTP/2不会改变这种范式,因此它必须以相同的方式工作,无状态.
从官方RFC中也可以清楚地看到它.据说:
超文本传输协议(HTTP)是用于分布式协作超媒体信息系统的应用程序级协议.它是一种通用的无状态协议,可用于许多任务......
而HTTP/2的定义是:
此规范描述了超文本传输协议(HTTP)语义的优化表达,称为HTTP版本2(HTTP/2)...此规范是HTTP/1.1消息语法的替代,但未废弃.HTTP的现有语义保持不变.
HTTP/2协议在设计上是无状态的,因为与原始HTTP相比,语义保持不变.
HTTP/2连接是在TCP连接之上运行的应用层协议(BTW,没有什么能阻止你使用HTTP over UDP,例如,它是可能的,但是因为它不是"可靠的传输"而不使用UDP) .不要将它与会话和传输层混合使用.HTTP协议在设计上是无状态的.通过加密的SSL/TLS连接的HTTP也不会对此语句进行任何更改,因为HTTP S中的S与传输有关,而与协议本身无关.
HPACK,HTTP/2的头压缩是一种压缩格式,专门为HTTP/2标头设计,并在单独的Internet草案中指定.它不会改变HTTP/2本身,因此它不会改变语义.
在关于HPACK的RFC for HTTP/2中,他们声明:
标头压缩是有状态的.一个压缩上下文和一个解压缩上下文用于整个连接.
这就是为什么来自HPACK的RFC:
2.2.编码和解码上下文
要解压缩标头块,解码器只需要将动态表(参见第2.3.2节)维护为解码上下文.不需要其他动态状态.
当用于双向通信时,例如在HTTP中,由端点维护的编码和解码动态表是完全独立的,即请求和响应动态表是分开的.
HPACK通过利用HTTP等协议中固有的冗余来减少头字段编码的长度.最终目标是减少发送HTTP请求或响应所需的数据量.
HPACK实现不能完全无状态,因为完全独立的编码和解码表必须由端点维护.
同时,有些库试图解决HPACK问题,例如,无状态事件驱动的HPACK编解码器CASHPACK:
HPACK实现不能完全无状态,因为需要维护动态表.依赖于HTTP/2将始终解码完整HPACK序列的假设,使用事件驱动的API实现无状态.