🔗 功能:HTTP/2.0 支持
- 目标:HTTP/2.0 合规。
- 状态:设计基础工作正在进行中。
- 预计完成时间:未知
- 版本:待定
- 开发者:AmosJeffries
- 更多:- RFC 7540 - RFC 7541 - Bug 4248 - http://http2.github.io/
🔗 详细信息
HTTP/2 的设计在很大程度上借鉴了 SPDY 实验性协议,用于在 SSL 连接上以多路复用的方式对 HTTP 请求进行帧封装。它避免了 HTTP 因依赖有状态的“\r\n”帧边界而产生的管道问题。
然而,HTTP/2 存在一些主要差异
- HTTP/2 包含一个特殊的连接前缀,用于与 HTTP/1.1 和 HTTP/1.0 进行自动协议切换
- 帧布局已针对 HTTP 消息(非浏览器使用场景)进行了显著优化。
- TLS 是可选的
- 压缩算法经过专门重塑,以提高 HTTP 性能,并避免 SPDY 中使用的 gzip 压缩带来的安全漏洞。
- SPDY 中的几种帧类型和流量控制语义已被删除或优化。
Squid 将正式支持 HTTP/2,并且只支持 IETF 批准并包含在 HTTP/2 规范中的所需 SPDY 功能。
🔗 从客户端到 Squid 的流量
要在 Squid 中实现 HTTP/2 接收端口,我们需要
- 复制 HTTP 客户端连接管理器(ConnStateData、ClientSocketContext、ClientHttpRequest 类三元组)
- 更新新版本,以便在读/写时使用 HTTP/2 帧进行解封装/封装
- 更新新管理器以处理多个并行数据管道通道(HTTP/2 语法中的“流”)。目前只有一个活动上下文和一个空闲管道队列。HTTP/2 要求最少并行 100 个。
- 避免直接读写客户端套接字,这在 Squid-3.2 中已基本完成,但仍有少数例外,例如隧道和 ssl-bump。
- 实现 HTTP/2 头部解析器和打包器例程
- 实现 HTTP/2 压缩(HPACK)算法
- 字符串字面量编码器
- 霍夫曼编码器/解码器
- 实现 Upgrade 头部支持
- 用于 h2c 标签
- 用于 TLS/*
- 为没有 OpenSSL 的系统实现 TLS。
- 包括 ALPN 扩展支持
- 可能也包括 NPN 扩展支持
只有当浏览器制造商再次拒绝实现 HTTP/2 在 80 或 3128 端口上的代理支持时,才需要这样做。值得注意的是 MSIE,它对代理很友好。
🔗 进展
已完成:(在 Squid-3.5 中)
- 解决 Bug 3371 对我们透明检测和转发 HTTP/2 能力的干扰
已完成:(在 Squid-4 中)
- 为没有 OpenSSL 的系统实现使用 GnuTLS 的 TLS 支持。
已完成:(在 http2 分支中)
- 检测 80 端口拦截流量中的 HTTP/2 连接头部魔术字节
- 为 HTTP/2 帧解析器实现分支点
正在进行中
- 解析 HTTP/2 请求
🔗 从 Squid 到服务器的流量
要在 Squid 中实现服务器网关,我们需要
- 添加一个新的 HTTP/2.0 服务器连接池,该池与 HTTP/1.1 空闲 pconn 池类似但有所不同
- 池没有超时关闭(超时是相对于最后使用时间,而不是池化时间)。
- 保留正在积极使用的连接,但可以与更多服务器请求共享。
- 在有状态连接管理器对象(目前是
HttpStateData)级别进行池化,而不是无状态 TCP 连接详细信息(Comm::Connection)。
- 复制 HTTP 服务器连接管理器
- 更新新版本,以便在读/写时使用 HTTP/2 帧进行封装/解封装
- 更新新管理器以处理多个并行数据管道。
- 实现强制传输层压缩/解压缩。
- 与接收套接字代码共享,但状态表不同
- 实现 HTTP/2 头部解析器和打包器例程
- 与接收套接字代码共享
- 为没有 OpenSSL 的系统实现 TLS。
- 包括 ALPN 扩展支持
分类: WantedFeature
导航:站点搜索,站点页面,类别,🔼 向上