小熊加速器低延迟体验指南

小熊加速器低延迟网络体验

Ping很低为什么网页仍然慢:把往返时间、拥塞窗口与资源瀑布拆开看

低ping只能说明一种探测在当时较快返回。网页还要经历资源发现、名称解析、连接建立、请求等待、内容传输、DOM处理和依赖资源加载;把浏览器阶段与QUIC传输机制对齐,才能知道慢发生在哪里。

同一台电脑上,ping稳定在很低的数字,网页首屏却迟迟不出现;另一个地址的ping略高,标题和主要图片反而先完成。两组现象并不矛盾,因为探测工具与浏览器没有测量同一件事。

ping通常发送一种体积很小的探测报文,记录它从本机到目标再返回的时间。真实网页要解析地址、建立安全连接、发送请求、等待服务器、接收不同大小的资源,还要由浏览器解析文档和执行脚本。低ping只能说明那类探测在当时很快返回,不能替代整条页面时间线。

先问数字属于哪一段

“延迟”常被当成一个统一指标,实际至少有三个层次。第一层是某种探测报文的往返。第二层是传输连接内部估计的往返时间,它会受到确认策略与样本历史影响。第三层是用户等待页面的时间,其中还包含服务器处理、资源发现和浏览器工作。

这三个层次可以相关,却没有固定换算式。路径距离增加可能同时抬高多个时间,但资源被缓存、连接已经存在或服务器响应很快时,页面仍可能先出现。反过来,路径往返很低,服务器排队或关键脚本迟迟不返回,用户依然会等待。

判断前要写清楚目标:是在比较探测往返、主文档首字节、某张关键图片的传输,还是文档达到可交互状态。没有测量对象的“20毫秒”只是一个脱离上下文的数字。

浏览器瀑布不是一根总进度条

W3C Resource Timing为HTTP资源定义了一组阶段。redirectStart与redirectEnd描述可见的重定向;fetchStart进入取得流程;domainLookupStart到domainLookupEnd覆盖名称解析;connectStart到connectEnd覆盖连接;secureConnectionStart标出安全连接开始。requestStart之后才是正式请求,responseStart表示首个可用响应头开始,responseEnd则靠近资源取得结束。

这些边界让“网页慢”变成可定位的问题。名称解析区间长,调查方向与服务器首字节等待长不同。连接区间短而requestStart到responseStart很长,可能涉及服务器、上游应用或响应排队。responseStart很快、responseEnd很晚,则要考虑资源大小、传输能力、拥塞和丢包恢复。

阶段差值是观察线索,不是责任判决。浏览器看不到服务器内部每个队列,也不知道网络中每台设备的状态。一次请求等待长,无法单独证明某个服务商、运营商或所谓节点有故障。

主文档完成后还有另一条时间线

Navigation Timing把一次导航作为独立记录。主文档取得有responseEnd,文档处理还有domInteractive、DOMContentLoaded。domComplete以及loadEventEnd。规范中的duration到loadEventEnd为止,但这不代表所有页面都在那一刻给用户同样的视觉或交互体验。

主文档字节可以很快到达,解析器随后才发现样式表、字体、图片和脚本。脚本又可能产生新的请求,样式表也能引用字体与背景图。一个靠后的关键资源足以让首屏看起来空白,而ping与主文档首字节都保持漂亮。

DOMContentLoaded表示对应事件开始或结束,不是“所有图片下载完成”的别名。load事件也不能概括异步加载、延后组件或用户第一次操作是否顺畅。比较时应记录你关心的可见元素,并在瀑布里找到它真正对应的资源。

低RTT仍要服从发送窗口

IETF RFC 9002描述QUIC如何估计连接路径的往返时间。端点从ACK产生样本,分别维护最新RTT、最小RTT、平滑RTT与波动量。握手确认后,算法还会在规定边界内考虑对端报告的确认延迟。

这套连接内估计不是外部ping的别名。探测报文可能使用不同协议,数据量很小,也不参与当前浏览器连接的确认历史。连接迁移或新路径还会重置估计。把命令行ping直接写成QUIC的smoothed_rtt,会混淆测量来源。

即使真实连接RTT很低,发送者也不能一开始把任意多的数据同时灌入网络。RFC 9002的NewReno参考算法让连接以有限初始拥塞窗口进入慢启动。每次确认推动窗口增长,于是小文档可能在初始窗口内很快完成,大图片或脚本包却需要更多轮确认才能送完。

因此,小探测快与大资源慢可以同时成立。决定传输时间的不只是一轮往返,还包括初始可发送量、资源字节数、确认节奏、应用是否持续提供数据以及接收端流量控制。协议名称本身不会取消这些限制。

丢包的代价不一定出现在平均ping里

RFC 9002规定,丢包或ECN拥塞标记会使发送者离开慢启动并进入恢复。参考算法在恢复时降低慢启动阈值与拥塞窗口;如果足够长的一段发送都被判定丢失,持续拥塞会把窗口降到最小值。

少量ping样本可能恰好全部返回,网页传输的某些数据包却发生丢失。页面包含的包更多、持续时间更长,撞上短暂拥塞的机会也不同。此时平均ping看起来稳定,关键资源仍会因重传、探测超时或窗口缩小而拉长。

反面情况也存在。ping工具可能因目标限制探测响应而显示丢包,真实HTTPS连接仍然可用。不能把探测丢包率直接复制成网页数据丢包率;它最多提示在同一时段继续检查真实请求。

浏览器瀑布通常不会直接显示QUIC内部每次窗口变化。能观察到的是资源从responseStart到responseEnd被拉长、协议标识和传输大小等外部结果。把传输规范作为机制解释,不要伪装成浏览器已经测到的内部参数。

缓存与连接复用会改变第二次结果

Resource Timing明确包含从HTTP缓存取得的资源。规范还规定本地缓存命中时transferSize可为零,经验证缓存使用约定的值;相同URL也可能复用先前已经发起的下载。刷新后出现大量零传输,并不代表网络突然获得无限速度。

连接复用也会让domainLookupStart、connectStart等字段与首次访问不同。第一次需要解析、连接和安全握手,第二次可能沿用现有连接。若拿第一次的总时间对比第二次,再把差额全部归因于线路变化,结论从条件上就不成立。

可比实验至少要区分冷访问与重复访问。冷访问不等于必须删除所有浏览数据,更不能关闭安全保护;可以使用独立的新会话,明确记录是否首次打开。重复访问则保留缓存和连接状态,回答“日常再打开”的体验。两个问题都有价值,但要分开陈述。

零值有时代表看不见

跨源资源的详细计时受Timing-Allow-Origin等来源边界控制。某些字段为零或未显示,可能是浏览器为隐私与安全限制了可见性,而不是DNS、重定向或连接在物理上只花了零毫秒。

同一来源也存在重定向可见边界。Navigation Timing规定,跨来源重定向链可能使部分重定向或卸载字段归零。看到一条看似从fetchStart直接跳到responseStart的记录,应查明字段是否允许暴露。

报告瀑布时不要上传完整URL。查询参数可能含会话标识、搜索词、文件名称或其他私人信息;请求头、Cookie、IP地址和账号也不属于普通反馈。保留资源类型、去参数后的主机或路径类别、阶段差值、协议与大小区间即可。

用受控比较回答一个问题

选择同一台设备、同一浏览器和同一网络,固定要观察的页面与元素。第一轮记录访问是否为新会话、导航类型和发生时间;随后找出主文档与最慢的关键资源,抄下DNS、连接、请求到首字节、首字节到响应结束的区间。

第二轮若改变网络,就保持页面、设备、浏览器和访问阶段不变。若比较冷访问与重复访问,就保持网络不变,并明确两轮缓存与连接条件。一次只回答一个比较问题,结果才有解释空间。

还要记录transferSize、encodedBodySize和nextHopProtocol是否可见。资源体积不同,单看responseEnd没有意义;协议不同也只是条件之一,不能推出某协议对所有页面都更快。字段缺失时写“不可见”,不要填零或猜值。

样本至少跨多个时点重复,分别保留中位表现与明显慢样本。这里的目的不是用少量结果宣告长期质量,而是发现慢样本集中在哪个阶段。若慢都落在requestStart到responseStart,继续向内容服务方提供时间和请求类别;若落在responseStart到responseEnd,再结合资源大小和同网络对照调查传输。

结论应停在证据边界

低ping不能证明网页必然快,高ping也不能单独证明页面必然慢。前者可能遗漏服务器等待、资源依赖、发送窗口与丢包恢复;后者也可能被缓存、连接复用和较少资源抵消。

浏览器时间线负责告诉你等待落在哪一段,传输规范负责解释为什么低RTT下仍可能出现窗口与恢复代价。两者合起来能形成可复查的判断,却不能从一张瀑布图还原整个互联网。

最终记录应包含测量对象、访问阶段、设备与网络条件、文档里程碑、关键资源阶段、资源大小、协议可见性和时间。去掉敏感URL与身份信息后,这些资料足以让负责人复现方向。无法控制的服务器变化、跨源不可见字段和路径内部状态,则应明确写成不确定,而不是用一个ping数字填补。

把首字节等待与下载等待分开

requestStart到responseStart常被称为等待首字节的区间,但它混合了请求在网络中送达、服务端接收与处理、响应头返回等过程。这个区间变长时,浏览器不能告诉你服务器内部究竟在查数据库、等待上游,还是请求在途中排队。可确认的是:资源内容尚未开始到达,继续只测下载带宽不会回答同一个问题。

responseStart到responseEnd更接近响应主体到达阶段。若一个小型样式表和一张大图耗时不同,要先按编码后的大小比较。相同大小在同网络下反复出现长尾,才值得结合丢包与拥塞机制讨论;大小相差几十倍时,绝对完成时间本来就不能平行比较。

主文档首字节慢、所有子资源随后正常,与主文档很快但某个阻塞样式表迟到,是两种完全不同的因果顺序。前者让资源发现整体后移,后者只卡住依赖该资源的呈现。将二者都写成“线路延迟高”,会丢掉最能指导复查的信息。

为什么不能只报平均值

页面慢常由少数长尾样本决定。五次访问里四次正常、一次因恢复过程拉长,平均值可能看起来变化不大,用户却真实遇到一次长等待。记录中应保留每次关键阶段,而不是只留一个均值。

中位数适合描述通常表现,较慢分位或明确的最慢样本用来观察尾部。样本很少时不要给它包装成稳定的百分位,只需列出各次结果和条件。时间跨度也要写明,因为连接状态、缓存、服务器负载与家庭网络占用都会随时段变化。

传输层的smoothed_rtt本身也是带历史权重的估计。RFC 9002用先前平滑值和新调整样本更新它,同时维护波动量。一个平滑数值不会展示每个包的变化,也不能代替页面资源的尾部完成时间。把“平均ping”“平滑RTT”和“页面五次中位数”放在同一栏,却不写计算对象,会制造看似精确的错误比较。

资源发现顺序会制造空档

瀑布里的空白不一定是网络停止工作。浏览器可能尚未从HTML或CSS发现后续资源,也可能等待脚本运行后才知道请求地址。此时资源条目根本还没开始,无法用它的DNS或连接区间解释之前的空档。

initiatorType可帮助区分资源由图片、脚本、样式、fetch或导航触发,但它不能完整呈现所有业务依赖。阅读时要从关键资源向前找发起者:如果字体由样式表声明,样式表的迟到会推迟字体发现;如果接口请求由脚本产生,脚本下载和执行都可能在请求之前。

这也是“减少ping”未必改变首屏的原因。若主要等待发生在资源尚未被发现或主线程忙于执行,网络往返缩短几毫秒不会消除依赖顺序。解决方向应由阶段证据决定,而不是预先指定为换线路。

反馈给不同负责人的最小证据

内容服务方需要发生时间、去敏感参数后的资源类别、requestStart到responseStart区间和响应状态。前端负责人更关心主文档之后何时发现阻塞资源、DOMContentLoaded与load里程碑,以及资源发起类型。网络负责人则需要固定接入环境下的重复样本、协议、传输阶段和是否伴随其他请求异常。

同一份记录可以服务三种调查,但不能把无法观察的内部状态写成事实。字段因跨源保护不可见,就明确标注;浏览器没有暴露拥塞窗口,就只说现象与RFC机制一致,不声称已经读取窗口数值。这样留下的证据较少,却比一张包含Cookie、完整URL和武断结论的截图更安全,也更容易复查。

资料来源

  • World Wide Web Consortium (W3C):《Resource Timing》,发布或更新于 2026-04-20
  • World Wide Web Consortium (W3C):《Navigation Timing Level 2》,发布或更新于 2026-02-25
  • Internet Engineering Task Force (IETF):《RFC 9002: QUIC Loss Detection and Congestion Control》,发布或更新于 2021-05-01