当一次下载看起来在等待时,请区分三件事:响应头到达、正文字节到达,以及应用能够使用或渲染结果。仅凭一个旋转指示器无法判断究竟哪一环被延迟。

正常的流式传输各阶段可以重叠:

origin produces a chunk → proxy forwards bytes → client consumes them

代理可以在转发的同时把符合条件的内容写入缓存。缓存并不需要等待整个文件。Squid 的 read_ahead_gap 控制的是先于交付进行的预取,这属于另一种缓冲。

当慢速客户端填满输出队列时,背压可以暂时停止上游读取。Content-Length 同样能在不做完整缓冲的情况下提供长度。HTTP/1.1 分块编码允许增量交付,但如果前序组件把数据扣住,它无法承诺低延迟。

接下来检查处理阶段。重写或检查可能需要正文的一部分或全部。压缩与应用层分帧可能延迟有用输出。在客户端,等待完整字节数组的方法会推迟返回,而浏览器可能在能够渲染之前就已收到字节。

CONNECT 成功之后,普通代理无需知道隧道文件的最终长度即可转发服务流。在更改其缓冲区或超时设置之前,请先追踪上面第一个缺失的事件。当观察者是 curl 时,它的 no-buffer 选项改变的是本地输出阶段。

相关文章