主要观点:
- 探讨 Pitchfork 及 HTTP/2,认为 Ruby HTTP 服务器缺乏 HTTP/2 支持并非关键问题,HTTP/2 主要在减少页面加载延迟方面有优势,在局域网内作用不大。
- HTTP/2 主要解决了 HTTP/1.1 中并发连接数受限和请求阻塞问题,通过在单个 TCP 连接中复用请求解决头阻塞。
- 服务器推送功能已从规范中删除,HTTP/1.1 和 HTTP/2 在语义上已无差异,HTTP/2 增加了实现和部署复杂性。
- 建议将 HTTP/2 处理留给基础设施入口点(如负载均衡器或反向代理),在 Ruby HTTP 服务器中支持 HTTP/2 不是关键重要功能。
关键信息:
- HTTP/2 始于 2009 年名为 SPDY,目标是减少页面加载延迟,当时页面平均资源数增加,HTTP/1.1 下载小文件速度受限。
- RFC 2616 规定浏览器对单个域只允许两个并发连接,导致下载多个资源时延迟影响性能,浏览器后来停止遵守该规则。
- 持久连接很重要,增加连接数可更快下载资源,但最好从同一连接下载以避免 TCP 慢启动。
- HTTP/2 主要解决了头阻塞问题,还强制使用加密、压缩请求和响应头及服务器推送,但服务器推送已被弃用。
- 在局域网内,HTTP/2 对服务器到客户端的低往返时间影响不大,且增加了复杂性。
- 有零配置解决方案如 thruster 可在单台机器上处理 HTTP/2,但一般建议使用常见中间件如 Nginx、Caddy 等。
重要细节:
- 2008 年浏览器开始提高每个域的连接限制,如 Firefox 3 提高到 6 个。
- TCP 连接有慢启动,新建立的连接吞吐量较低。
- 服务器推送功能因在浏览器缓存资源时会降低页面加载时间而被弃用,被 103 Early Hints 取代。
- HTTP/2 是二进制协议,调试和部署更复杂,且规范不强制要求加密,浏览器和一些库要求加密。
- 认为处理 HTTP/2 留给负载均衡器或反向代理更合理,与 TLS 处理方式类似,Ruby HTTP 服务器缺乏 HTTP/2 支持影响不大,HTTP/3 目标与 HTTP2 相似可应用相同结论。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。