一次网络请求的处理流程

当用户打开一个 Web 站点时,浏览器会发起一系列的网络请求,以获取站点的内容。这个过程涉及到多个环节,包括缓存、代理、DNS 解析、TCP 请求、SSL 请求、HTTP 请求等。本文将详细介绍这些环节,并提供一些常见的问题排查方法。

一、网络请求的处理流程

  1. HTTP 强制缓存

HTTP 强制缓存是浏览器在本地缓存中查找请求资源的过程。如果资源在缓存中存在且未过期,浏览器将直接使用缓存中的资源,而不会向服务器发送请求。这可以显著提高页面加载速度。

  1. ServiceWorker

ServiceWorker 是一种在浏览器后台运行的脚本,可以拦截和处理网络请求。如果 ServiceWorker 存在且已经注册,它可以在请求到达服务器之前,直接从缓存中返回响应内容。这样可以进一步提高页面加载速度,甚至在离线情况下也能提供内容。

  1. 设备连接到互联网

如果浏览器无法从缓存或 ServiceWorker 中获取资源,它将尝试连接到互联网。这一步需要确保设备的网络连接正常,否则请求将无法继续。

  1. 网络代理

在网络请求过程中,用户可能会使用代理工具(如梯子工具、网络加速器等)。如果代理配置错误或连接异常,可能会导致请求失败或响应缓慢。

  1. 查找 hosts

在进行 DNS 解析之前,浏览器会先检查本地的 hosts 文件。如果 hosts 文件中存在对应的域名和 IP 地址映射,浏览器将直接使用该映射,而不会进行 DNS 解析。

  1. DNS 解析

如果 hosts 文件中没有对应的映射,浏览器将进行 DNS 解析,以获取域名对应的 IP 地址。DNS 解析的结果可能会影响请求的路由和响应速度。

  1. 初始化 TCP 请求

在获取到 IP 地址后,浏览器将初始化 TCP 请求,建立与服务器的连接。这一步需要确保网络环境稳定,否则可能会导致连接失败。

  1. 初始化 SSL

如果请求使用 HTTPS 协议,浏览器将初始化 SSL 握手,以确保数据传输的安全性。这一步需要确保 SSL 证书有效,否则可能会导致请求失败。

  1. 初始化 HTTP 请求

在建立连接后,浏览器将发送 HTTP 请求,包括请求头和请求体。服务器接收到请求后,将返回相应的响应内容。

  1. 路由设备处理数据包

在数据传输过程中,路由设备会处理数据包,确保数据能够正确到达目标服务器。如果路由设备不稳定,可能会导致数据包丢失或延迟。

  1. CDN 缓存

如果服务器使用了 CDN(内容分发网络),请求可能会被路由到离用户最近的 CDN 节点。CDN 缓存可以显著提高响应速度,但如果缓存配置不当,可能会导致内容不一致。

  1. 服务端响应

最终,服务器将处理请求并返回响应内容。如果服务器端存在问题,可能会导致响应内容不正确或响应速度缓慢。

二、常见问题与排查步骤

1. 没有返回内容

1.1 ServiceWorker 返回结果为空

  • 排查方法

    • 使用 Chrome DevTools 检查 HTTP 请求上下文,查看 ServiceWorker 是否正常工作。

1.2 HTTP 强制缓存的内容为空

  • 排查方法

    • 使用 Chrome DevTools 检查 HTTP 请求缓存应用状态和响应头,确保缓存配置正确。

1.3 代理配置错误、连接异常

  • 排查方法

    • 检查代理工具的配置,确保代理工具的使用场景正确。

    • 常见情况包括:不该用代理工具的时候使用了代理工具,或者该用代理工具的时候没有使用。

1.4 hosts 配置错误

  • 排查方法

    • 使用 Chrome DevTools 检查 HTTP 请求的 Remote Address,确保 hosts 文件中的映射正确。

    • 使用 dig 命令验证 DNS 解析结果,例如:

    • bash复制

    dig 58.com
    dig @119.29.29.29 58.com
    dig AAAA @119.29.29.29 ipv6.58.com
    

1.5 DNS 解析结果不正确

  • 排查方法

    • 使用 Chrome DevTools 检查 HTTP 请求的 Remote Address,确保 DNS 解析结果正确。

    • 使用 dig 命令验证 DNS 解析结果,例如:

    • bash复制

    dig 58.com
    dig @119.29.29.29 58.com
    dig AAAA @119.29.29.29 ipv6.58.com
    

1.6 TCP 层无法通信

  • 排查方法

    • 使用 Chrome DevTools 检查请求状态,确保 TCP 连接正常。

    • 使用 telnet 命令测试连接,例如:

    • bash复制

    telnet 58.com 80
    

1.7 SSL 证书过期、与域名不符

  • 排查方法

    • 使用 Chrome DevTools 检查 Security 面板,确保 SSL 证书有效。

1.8 HTTP 请求、响应异常

  • 排查方法

    • 使用 Chrome DevTools 检查请求状态码、缓存状态和必要的请求响应头,确保请求和响应符合预期。

2.返回内容慢

2.1 没有合理利用 HTTP 强制缓存

  • 排查方法

    • 使用 Chrome DevTools 检查 HTTP 请求缓存应用状态和响应头,确保缓存配置正确。

2.2 互联网连接状态异常

  • 排查方法

    • 使用 ping 命令验证网络基本连通性,例如:

    • bash复制

    ping -c 10 58.com
    
    • 确保网络环境满足以下条件:

      • 丢包率低于 5%。

      • 平均延时低于 20ms。

      • 最低、最高延时差值小于 30ms。

2.3 代理配置错误、连接异常

  • 排查方法

    • 检查代理工具的配置,确保代理工具的使用场景正确。

2.4 DNS 解析结果异常

  • 排查方法

    • 使用 dig 命令验证 DNS 解析结果,例如:

    • bash复制

    dig 58.com
    dig @119.29.29.29 58.com
    dig AAAA @119.29.29.29 ipv6.58.com
    

2.5 路由设备不稳定

  • 排查方法

    • 使用 traceroute 命令验证数据包到达公网之前的路由情况,例如:

    • bash复制

    traceroute -n 58.com
    
    • 检查 WiFi 状态,确保 Tx Rate 高于 150 Mbps,连接方式为 5Ghz。

2.6 没有启用 HTTP/2

  • 排查方法

    • 使用 Chrome DevTools 检查 Network 面板中的 Protocol,确保使用了 HTTP/2。

2.7 实时性需求较高的场景使用了 TCP

  • 排查方法

    • 考虑使用 UDP 协议,以提高实时性。

2.8 没正确使用 CDN 缓存

  • 排查方法

    • 使用 Chrome DevTools 检查请求的参数,确保 CDN 缓存配置正确。

3. 返回内容不对

返回内容不对通常是服务端或 HTTP 网关服务的问题,需要联系后端或运维来解决。

4. 通信内容被监控、劫持、篡改

4.1 DNS 解析记录监控、劫持、篡改

  • 防御方法

    • 在 Chrome 中配置使用可靠的 DoT(DNS over TLS)或 DoH(DNS over HTTPS),例如:

      • 打开 chrome://settings/security

      • 选择 Use secure DNS

      • 选择 With custom,国内建议填写 https://doh.pub/dns-query

    • 在路由器中使用支持 DoT/DoH 且支持 EDNS Client Subnet 的方式,与上游 DNS 通信。

    • 在域名提供商处配置 DNSSEC。

4.2 中间人攻击(MITM)

  • 防御方法

    • 使用 SSL 的站点不一定是安全的,但不使用或没有正确使用 SSL 的站点一定是不安全的。

    • 通过客户端锁定站点证书的方式,是最安全的方法。

三、总结

网络请求的处理流程涉及多个环节,每个环节都可能影响请求的成功与否。通过合理的配置和排查方法,可以有效解决常见的网络问题,提高用户体验。