从输入URL到页面加载:浏览器背后的故事

156 阅读6分钟

浏览器输入URL后的整个过程

当用户在浏览器中输入URL并按下回车键后,浏览器会经历一系列步骤来加载并显示网页。以下是详细的过程描述:

1. DNS解析

首先,浏览器需要将用户输入的域名(例如:www.example.com)转换为对应的IP地址,这个过程称为DNS解析。浏览器会先检查本地缓存,如果没有找到,则会查询操作系统缓存、路由器缓存,最后向ISP的DNS服务器发送查询请求,直到找到对应的IP地址。

Snipaste_2025-02-12_16-14-46.png

DNS解析过程

  1. 浏览器缓存:浏览器会首先检查自身的DNS缓存,看看是否有对应的IP地址。
  2. 操作系统缓存:如果浏览器缓存中没有找到,浏览器会查询操作系统的DNS缓存。
  3. 路由器缓存:如果操作系统缓存中也没有找到,查询请求会发送到本地路由器,检查其缓存。
  4. ISP DNS服务器:如果路由器缓存中仍然没有找到,查询请求会发送到ISP的DNS服务器。
  5. 递归查询:如果ISP的DNS服务器也没有找到,它会进行递归查询,直到找到对应的IP地址。

2. 建立TCP连接

获得IP地址后,浏览器会与目标服务器建立TCP连接。这个过程包括三次握手:

  1. SYN:客户端发送SYN包请求建立连接。
  2. SYN-ACK:服务器回应SYN-ACK包确认收到请求。
  3. ACK:客户端再发送ACK包确认连接建立。

Snipaste_2025-02-12_16-18-35.png

三次握手的意义

  • 第一步:客户端发送SYN包,表示希望建立连接,并告知初始序列号。
  • 第二步:服务器收到SYN包后,发送SYN-ACK包,表示同意建立连接,并告知服务器的初始序列号。
  • 第三步:客户端收到SYN-ACK包后,发送ACK包,确认连接建立。

3. 发送HTTP请求

TCP连接建立后,浏览器会向服务器发送HTTP请求。请求包括请求行、请求头和请求体。

  • 请求行:包含请求方法(如GET、POST)、请求URL和HTTP版本。
  • 请求头:包含浏览器信息、接受的文件类型等。
  • 请求体:包含请求的具体数据(如POST请求的数据)。

Snipaste_2025-02-12_16-20-10.png

常见的HTTP请求方法

  • GET:请求指定的资源。
  • POST:向服务器提交数据。
  • PUT:更新指定的资源。
  • DELETE:删除指定的资源。

4. 服务器处理请求

服务器接收到HTTP请求后,会根据请求的内容进行处理。服务器可能需要查询数据库、调用其他服务或执行其他逻辑来生成响应数据。

服务器处理的步骤

  1. 解析请求:服务器解析HTTP请求,提取请求方法、URL和请求头信息。
  2. 处理逻辑:根据请求的内容,执行相应的处理逻辑,如查询数据库、调用其他服务等。
  3. 生成响应:处理完成后,生成HTTP响应,包括状态行、响应头和响应体。

5. 服务器发送HTTP响应

服务器处理完请求后,会生成HTTP响应并发送回浏览器。响应包括状态行、响应头和响应体。

  • 状态行:包含HTTP版本、状态码(如200、404)和状态描述。
  • 响应头:包含服务器信息、响应内容类型等。
  • 响应体:包含实际的响应数据(如HTML、JSON)。

常见的HTTP状态码

  • 200 OK:请求成功。
  • 404 Not Found:请求的资源不存在。
  • 500 Internal Server Error:服务器内部错误。

6. 浏览器渲染页面

浏览器接收到HTTP响应后,会开始渲染页面。首先,浏览器解析HTML文档,构建DOM树。然后,解析CSS,构建CSSOM树。接着,浏览器将DOM树和CSSOM树结合,生成渲染树。最后,浏览器根据渲染树绘制页面。

Snipaste_2025-02-12_16-31-49.png

渲染过程

  1. 解析HTML:浏览器解析HTML文档,构建DOM树。
  2. 解析CSS:浏览器解析CSS,构建CSSOM树。
  3. 生成渲染树:浏览器将DOM树和CSSOM树结合,生成渲染树。
  4. 布局:浏览器计算每个元素的位置和大小。
  5. 绘制:浏览器根据渲染树绘制页面。

7. 执行JavaScript

在页面渲染过程中,浏览器会遇到JavaScript代码。浏览器会暂停渲染,执行JavaScript代码。JavaScript代码可能会修改DOM树和CSSOM树,导致页面重新渲染。

JavaScript执行过程

  1. 解析和编译:浏览器解析和编译JavaScript代码。
  2. 执行:浏览器执行JavaScript代码。
  3. 修改DOM和CSSOM:JavaScript代码可能会修改DOM树和CSSOM树。
  4. 重新渲染:如果DOM树或CSSOM树发生变化,浏览器会重新渲染页面。

8. 加载资源

HTML文档中可能包含其他资源(如图片、视频、CSS文件、JavaScript文件)。浏览器会根据资源的URL发送请求,加载这些资源。加载完成后,浏览器会继续渲染页面。

资源加载过程

  1. 解析HTML:浏览器解析HTML文档,发现需要加载的资源。
  2. 发送请求:浏览器根据资源的URL发送请求。
  3. 接收响应:服务器返回资源的响应。
  4. 渲染资源:浏览器加载资源并渲染页面。

9. 交互

页面加载完成后,用户可以与页面进行交互。用户的操作(如点击按钮、输入文本)会触发事件,JavaScript代码会处理这些事件,更新页面内容。

交互过程

  1. 用户操作:用户点击按钮、输入文本等。
  2. 事件触发:用户操作触发事件。
  3. 事件处理:JavaScript代码处理事件。
  4. 更新页面:JavaScript代码更新页面内容。

10. 断开TCP连接

当页面加载完成且没有进一步的请求时,浏览器会断开与服务器的TCP连接。断开连接的过程包括四次挥手:

  1. FIN:客户端发送FIN包请求断开连接。
  2. ACK:服务器回应ACK包确认收到请求。
  3. FIN:服务器再发送FIN包请求断开连接。
  4. ACK:客户端回应ACK包确认断开连接。

Snipaste_2025-02-12_16-19-17.png

四次挥手的意义

  • 第一步:客户端发送FIN包,表示希望断开连接。
  • 第二步:服务器收到FIN包后,发送ACK包确认收到请求。
  • 第三步:服务器发送FIN包,表示同意断开连接。
  • 第四步:客户端收到FIN包后,发送ACK包确认断开连接。

通过以上步骤,浏览器完成了从输入URL到页面呈现的整个过程。每个步骤都涉及多个子步骤和复杂的技术细节,确保用户能够快速、准确地访问所需的网页内容。