整个 body 的 HTTP 响应最大内容长度与 headers 位于同一块中
HTTP response maximum content length for entire body to be in same chunk as headers
上下文/TL;DR
我记得在某个地方读到,在某个 body 大小(12ko?)下,HTTP 响应中有某种优化可用(其名称类似于“HTTP 快速启动 window”或某物)。它的名称是什么,最大尺寸是多少?
详情
更确切地说,这并不是真正意义上的“走不同的路线”的优化,只是请求只需要一个块就可以得到整个响应。出于说明目的,这里有 2 张来自 webpagetest.org 的屏幕截图,一个大的 HTML 页面,您可以在其中看到几个块(第 1 张图片),还有一个非常非常小的最后有一小块(第二张图片)。
- Cyan-orange-purple是客户端和服务端正在建立的连接(可以忽略那部分),
- 浅蓝色/深蓝色是响应,深蓝色是 HTML 从服务器下载到客户端的块。
在更大的响应(第1张图片)的情况下,您可以看到响应被分成几个块(更深的蓝色)而在较小的响应(第二张图片)的情况下,它只需要一个块。
问题
这个“优化”的名称是什么?它可以处理的最大 body 大小是多少?我在哪里可以读到它?它只是取决于服务器的实现,还是它真的在某些规范中的某个地方?
PS:我不是在谈论像 HTTP 206 Partial Content
这样的流媒体请求,也不是 http/1 Transfer-Encoding: chunked
标准,只是 gzipped HTML 页面由 nginx 或 express 或你有什么服务。
当您从服务器接收到任何数据时,您的客户端会使用 TCP 连接连接到服务器。
TCP 具有可以为数据包(TCP 段)发送的最大数据量,即 MSS 或最大段大小。另一个限制因素是最大传输单元 MTU,它取决于客户端和服务器之间路径中路由器的最小 MTU,并导致每个数据包可以发送的最大字节数。
我认为您在问题中提到的 12kB 是相对于:
- MTU 并取决于所使用的协议,例如,对于以太网,MTU 为 1518 字节,对于以太网 headers,上层为 1500 字节图层数据。
- 对于TCP的MSS,如果使用IPV4和以太网协议(因此MTU数据最多可以容纳1500字节的数据),是1500 - 20(ip headers) - 20(tcp headers) 给出 1460 字节的 MSS(不能保证此值,因为如果客户端和服务器在 TCP 连接过程中支持不同的 MSS 值,则可以协商 MSS 值).
如果您发送超过 MTU 的数据包,则这些值中的最小值将优先,路径中的第一个路由器将丢弃该数据包。
因此,如果页面(或数据)大小超过 MSS,TCP 会将您的数据分成多个段,从而需要更多时间来确认和发送。但是,如果您发送的数据小于 MSS,则将仅使用一个段,从而导致发送页面的时间更短或 “更少块”.
这只是一个简单的解释,当然上面的例子中使用的值是一般情况的例子,所以它们在特定场景下可能会有所不同,因为它们不是固定的。
您可以在这里找到一些来自维基百科的更有用的文章,这些文章可能有助于获得更多见解:
上下文/TL;DR
我记得在某个地方读到,在某个 body 大小(12ko?)下,HTTP 响应中有某种优化可用(其名称类似于“HTTP 快速启动 window”或某物)。它的名称是什么,最大尺寸是多少?
详情
更确切地说,这并不是真正意义上的“走不同的路线”的优化,只是请求只需要一个块就可以得到整个响应。出于说明目的,这里有 2 张来自 webpagetest.org 的屏幕截图,一个大的 HTML 页面,您可以在其中看到几个块(第 1 张图片),还有一个非常非常小的最后有一小块(第二张图片)。
- Cyan-orange-purple是客户端和服务端正在建立的连接(可以忽略那部分),
- 浅蓝色/深蓝色是响应,深蓝色是 HTML 从服务器下载到客户端的块。
在更大的响应(第1张图片)的情况下,您可以看到响应被分成几个块(更深的蓝色)而在较小的响应(第二张图片)的情况下,它只需要一个块。
问题
这个“优化”的名称是什么?它可以处理的最大 body 大小是多少?我在哪里可以读到它?它只是取决于服务器的实现,还是它真的在某些规范中的某个地方?
PS:我不是在谈论像 HTTP 206 Partial Content
这样的流媒体请求,也不是 http/1 Transfer-Encoding: chunked
标准,只是 gzipped HTML 页面由 nginx 或 express 或你有什么服务。
当您从服务器接收到任何数据时,您的客户端会使用 TCP 连接连接到服务器。
TCP 具有可以为数据包(TCP 段)发送的最大数据量,即 MSS 或最大段大小。另一个限制因素是最大传输单元 MTU,它取决于客户端和服务器之间路径中路由器的最小 MTU,并导致每个数据包可以发送的最大字节数。
我认为您在问题中提到的 12kB 是相对于:
- MTU 并取决于所使用的协议,例如,对于以太网,MTU 为 1518 字节,对于以太网 headers,上层为 1500 字节图层数据。
- 对于TCP的MSS,如果使用IPV4和以太网协议(因此MTU数据最多可以容纳1500字节的数据),是1500 - 20(ip headers) - 20(tcp headers) 给出 1460 字节的 MSS(不能保证此值,因为如果客户端和服务器在 TCP 连接过程中支持不同的 MSS 值,则可以协商 MSS 值).
如果您发送超过 MTU 的数据包,则这些值中的最小值将优先,路径中的第一个路由器将丢弃该数据包。
因此,如果页面(或数据)大小超过 MSS,TCP 会将您的数据分成多个段,从而需要更多时间来确认和发送。但是,如果您发送的数据小于 MSS,则将仅使用一个段,从而导致发送页面的时间更短或 “更少块”.
这只是一个简单的解释,当然上面的例子中使用的值是一般情况的例子,所以它们在特定场景下可能会有所不同,因为它们不是固定的。
您可以在这里找到一些来自维基百科的更有用的文章,这些文章可能有助于获得更多见解: