performance - 移动网络上的 HTTP/2 浏览器请求一次往返有多少字节?
问题描述
我正在一个网站上工作,目标是尽可能快。这个目标需要让移动客户端在一次往返中发出初始 HTTP 请求。(HTTP/2 的 HPACK 应该处理对同一页面的后续请求。)
传统观点认为 14 KB 的压缩响应与您在网页的第一次往返中所期望的一样多(由于 TCP 慢启动),但与该理论类似的计算在测试时不会产生类似的结果.
我的目标连接具有以下特点:
- 第三代蜂窝数据协议 (3G)
- 200 毫秒延迟(400 毫秒 RTT)
- 400Kb/s 最大下载带宽
- 300Kb/s 最大上传带宽
- 0% 丢包,至少对于这个问题来说
- 基于 TLS 的 HTTP/2
- 假设客户端为Android Chrome
最终,我想为应用程序可控请求标头的大小设定性能目标;主要是Etag
和Cookie
。(我无法真正控制Referer
等等,但至少它们在实践中具有已知的最大尺寸。)
解决方案
你不能做一个往返的 HTTP/2 页面(也不能做 HTTPS 页面,甚至使用 HTTP/1.1 也几乎不可能)。
这是因为 TLS 握手至少需要一次往返(尽管 TLSv1.3 确实有一个 0-RTT 重复握手,浏览器和服务器通常不支持)。
HTTP/2 需要更多消息,虽然它们不需要知识渊博(因此技术上没有往返)将导致 TCP 确认,因此在这种情况下拥塞窗口 (CWND) 将增加到超过 14Kb。此外,当您开始流式传输第一个响应时,它的 TCP 数据包也将被确认,从而进一步增加 CWND。
我最近写了一篇关于此的博客文章:https ://www.tunetheweb.com/blog/critical-resources-and-the-first-14kb/
那么,如果不是 14KB,那么对于第一个响应,您真的需要花费多少?这实际上是不可能的,因为它在很大程度上取决于每一侧的 TCP 堆栈(以及 TLS 和 HTTP/2 堆栈)。我的建议是不要沉迷于这个数字,而只是以尽可能少的数据提供您的网站。如果您交付的是 15KB 或 16KB,请特别不要担心,因为您不必为了得到这个 14KB 的幻数而自杀。
说虽然 Cookie 可能很大(尽管 eTag 通常不是),但它们通常不会超过 1 KB 或 2 KB。因此,如果您想在那里节省空间,那么您可能找错了地方 - 或者有一个真正超级优化的网站,这些标题是最后优化的地方!
推荐阅读
- apache-spark - 在将 spark 数据帧写入 csv 时转义反斜杠(/)
- nginx - 如何使用 Nginx 提供文件的一部分?
- python-3.x - Pyinstaller“ValueError:不能混合绝对路径和相对路径”
- java - 未返回预期对象时的 Mockito
- unity3d - 如何在动画师统一中停止特定动画?
- swiftui - SwiftUI ScrollView 将子视图推送到设备的前沿
- java - Java 文件无法检测到我手动创建的 xml 文件
- kubernetes - Kubernetes 中的命名空间和上下文有什么区别?
- java - 为什么 CompletableFuture 中的断点也会停止主线程中的执行?
- vue.js - 从 Nuxt.js 中的页面更改布局变量值