移动体验 / 方法解读

移动端网络请求失败如何排查?检查 NEL 报告中的 phase 字段

通过检查 Network Error Logging (NEL) 报告中的 phase 字段可以快速定位移动端网络请求失败的具体阶段。

网络事件捕获和保留系统示意图
主题资料配图,非新闻现场照片 · 配图:network event capture and retention system

确认 NEL 报告中的 phase 字段值

在 NEL 报告的 body 对象中查找 phase 字段,该字段标识了网络请求失败发生的具体阶段。常见的值包括 dns、tcp、application 等。根据 MDN 文档,phase 字段用于区分请求是在 DNS 解析阶段、TCP 连接阶段还是应用阶段出现的问题。例如,当 phase 为 dns 时,表示问题发生在域名解析环节。

如果 phase 值为 application,则表示请求已经成功建立连接,但在处理 HTTP 响应或应用逻辑时出现问题。此时应重点关注 status_code 字段,因为该字段在应用阶段会显示具体的 HTTP 状态码。通过对比 phase 和 status_code,可以判断是网络连接问题还是服务器返回的错误。

根据 phase 值判断错误类型

当 phase 为 dns 时,结合 type 字段可以进一步确认错误类型。例如,type 为 dns.name_not_resolved 表示 DNS 服务器无法解析请求的 IP 地址。这种情况下,问题通常出在本地网络或 DNS 配置上,而非服务器端。如果 type 为 dns.unreachable,则说明用户的 DNS 服务器不可达。

当 phase 为 tcp 时,type 字段可能包含 tcp.timed_out 或 tcp.refused。tcp.timed_out 表示 TCP 连接超时,可能是网络延迟过高或服务器无响应;tcp.refused 则表示服务器主动拒绝了连接,通常意味着服务器未运行或端口未开放。这些信息有助于缩小排查范围,避免盲目检查服务器配置。

验证 phase 字段与错误类型的对应关系

为了确保诊断准确,需要验证 phase 字段与错误类型的对应关系是否符合预期。例如,在 DNS 阶段,server_ip 字段通常为空,因为此时尚未获取服务器 IP 地址。如果 phase 为 application 且 server_ip 不为空,则说明连接已建立,问题可能出在后续的 HTTP 交互中。

如果 phase 为 application 且 type 为 http.error,则表示用户代理成功接收到响应,但状态码为 4xx 或 5xx。此时应检查服务器返回的具体错误信息,而非网络连接问题。通过这种验证,可以避免将应用层错误误判为网络层错误,从而提高排查效率。

使用 phase 字段优化移动端网络诊断流程

在移动端网络诊断中,phase 字段提供了一个清晰的分层视图,帮助开发者快速定位问题所在。首先检查 phase 是否为 dns,如果是,则优先排查 DNS 配置和网络连接;如果 phase 为 tcp,则检查防火墙和服务器端口;如果 phase 为 application,则检查服务器日志和 HTTP 状态码。

通过结合 phase 字段和其他报告字段(如 elapsed_time 和 url),可以生成更详细的诊断报告。例如,记录 DNS 解析耗时和 TCP 连接耗时,有助于分析网络性能瓶颈。这种基于 phase 的分层排查方法,能够显著减少无效排查时间,提升移动端网络问题的解决效率。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. Network Error Logging (NEL) - HTTP | MDN ↗
  2. 配图:network event capture and retention system ↗
← 更多移动体验文章返回顶部 ↑