【八股文】地址栏输⼊ URL 敲下回车后发生了什么

158 阅读4分钟

当在浏览器地址栏输入 URL 并按下回车后,浏览器会执行一系列复杂的步骤来加载页面。以下是详细的流程:

1. 解析 URL

浏览器首先解析用户输入的 URL,确定协议(如 HTTP、HTTPS)、域名、端口(默认 HTTP 为 80,HTTPS 为 443)、路径和查询参数等信息。

2. 检查缓存

浏览器会检查以下缓存,以确定是否可以直接使用缓存的资源:

  • 浏览器缓存:检查是否有该 URL 的缓存资源。
  • 操作系统缓存:检查操作系统的 DNS 缓存。
  • 路由器缓存:检查路由器的 DNS 缓存。
  • ISP 缓存:检查互联网服务提供商(ISP)的 DNS 缓存。

如果缓存有效且未过期,浏览器会直接使用缓存资源,跳过后续步骤。

3. DNS 解析

如果缓存中没有域名对应的 IP 地址,浏览器会发起 DNS 查询:

  1. 本地 DNS 查询:浏览器向本地 DNS 服务器发起递归查询。
  2. 迭代查询:本地 DNS 服务器依次向根域名服务器、顶级域名服务器和权威域名服务器发起查询,最终获取目标域名的 IP 地址。
  3. 返回 IP 地址:本地 DNS 服务器将 IP 地址返回给浏览器。

4. 建立 TCP 连接

浏览器根据 IP 地址和端口号,与目标服务器建立 TCP 连接:

  1. 三次握手:

    • 客户端发送 SYN 包。
    • 服务器回复 SYN-ACK 包。
    • 客户端发送 ACK 包,完成连接建立。

如果是 HTTPS 协议,还需要进行 TLS 握手:

  1. TLS 握手:

    • 客户端发送 ClientHello 消息。
    • 服务器回复 ServerHello 消息,并发送证书和公钥。
    • 客户端验证证书,生成对称密钥,并用服务器的公钥加密后发送。
    • 服务器解密后,双方使用对称密钥加密通信。

5. 发送 HTTP 请求

浏览器向服务器发送 HTTP 请求,请求内容包括:

  • 请求行:方法(GET、POST 等)、路径、协议版本。
  • 请求头:包含浏览器信息、缓存策略、Cookie 等。
  • 请求体:如果是 POST 请求,可能包含表单数据或文件。

6. 服务器处理请求

服务器接收到请求后,执行以下操作:

  1. 解析请求:解析请求行、请求头和请求体。
  2. 处理请求:根据路径和参数执行相应的业务逻辑(如查询数据库、调用 API 等)。
  3. 生成响应:服务器生成 HTTP 响应,包括状态码、响应头和响应体。

7. 返回 HTTP 响应

服务器将 HTTP 响应发送给浏览器,响应内容包括:

  • 状态行:状态码(如 200、404)和状态信息。
  • 响应头:包含内容类型、缓存策略、Cookie 等。
  • 响应体:HTML、CSS、JavaScript 等资源。

8. 浏览器渲染页面

浏览器接收到响应后,开始渲染页面:

  1. 解析 HTML:浏览器解析 HTML 文件,构建 DOM 树。
  2. 解析 CSS:浏览器解析 CSS 文件,构建 CSSOM 树。
  3. 构建渲染树:将 DOM 树和 CSSOM 树合并为渲染树。
  4. 布局:计算每个元素的位置和大小(Layout/Reflow)。
  5. 绘制:将渲染树绘制到屏幕上(Paint)。
  6. 执行 JavaScript:如果页面中包含 JavaScript,浏览器会解析并执行。

9. 加载其他资源

在渲染过程中,浏览器可能会发现需要加载其他资源(如图片、CSS、JavaScript 文件),此时会重复以下步骤:

  1. 发起请求:向服务器发起资源请求。
  2. 接收响应:接收服务器返回的资源。
  3. 更新渲染:根据新资源更新页面渲染。

10. 页面加载完成

当所有资源加载完毕,页面渲染完成后,浏览器会触发 DOMContentLoadedload 事件,表示页面加载完成。

总结

从输入 URL 到页面加载完成,浏览器经历了以下主要步骤:

  1. 解析 URL。
  2. 检查缓存。
  3. DNS 解析。
  4. 建立 TCP 连接(或 TLS 握手)。
  5. 发送 HTTP 请求。
  6. 服务器处理请求并返回响应。
  7. 浏览器解析和渲染页面。
  8. 加载其他资源。
  9. 页面加载完成。

这个过程涉及网络协议(如 DNS、TCP、HTTP)、浏览器渲染引擎和操作系统的协作,是互联网工作的核心机制之一。