从输入URL到页面加载完成的过程

Yuyang 前端小白🥬

输入URL用户发起请求

当用户在客户端输入一个网址如(如 https://www.example.com),浏览器会根据这个操作发起网络请求。

浏览器解析URL

浏览器会解析用户输入的URL

  • 协议:例如HTTP或HTTPS
  • 主机名:例如www.example.com
  • 端口号:例如80或443
  • 路径:例如/index.html
  • 查询参数:例如?name=example
  • 锚点:例如#section

检查缓存

在发起真正的网络请求之前,浏览器会检查以下几处缓存,以节省时间和资源:

  • 浏览器缓存:如果之前已经访问过该网站,浏览器可能已经缓存了该资源,直接从缓存中加载。(强缓存、协商缓存)
    • 强缓存依赖于请求头的Expires或Cache-Control
  • DNS 缓存:浏览器会首先检查是否缓存了该域名对应的 IP 地址,避免重复的 DNS 解析。
  • 操作系统的 DNS 缓存:如果浏览器没有缓存 DNS 记录,它会查询操作系统的 DNS 缓存(如 Windows 的 DNS 缓存或 Linux 的 nscd)。

发起DNS请求

如果缓存中没有找到对应的IP地址,浏览器会发起一个DNS请求,将域名解析为IP地址。

构建HTTP/HTTPS请求(应用层)

一旦获取了IP地址,浏览器就可以构建HTTP/HTTPS请求。HTTP请求报文包含以下几个部分:

  • 请求行:包含请求方法、请求URL和HTTP协议版本
  • 请求头:包含请求的各种信息,如User-Agent、Accept、Cookie等
  • 请求体:包含请求的数据,如POST请求的表单数据

建立TCP连接(传输层)

HTTP是基于TCP协议的,因此浏览器需要建立TCP连接。TCP是一种面向连接的协议,它提供可靠的数据传输服务。HTTPS还需要建立TLS连接,TLS是SSL的升级版,提供了更强的安全性。

  • 三次握手:客户端和服务器之间需要通过三次握手建立连接。
  • 第一次握手:客户端发送一个 SYN 包给服务器,请求建立连接。
  • 第二次握手:服务器收到 SYN 包后,回应一个 SYN+ACK 包。
  • 第三次握手:客户端收到 SYN+ACK 包后,回应一个 ACK 包。

构建数据包(网络层)

一旦建立了TCP连接,浏览器就可以基于DNS解析得到的IP地址将HTTP请求报文封装成数据包,通过网络层发送给服务器。

数据包在网络中传输(数据链路层)

数据包通过数据链路层的设备(如交换机、网卡)在网络中传输,最终到达服务器。

服务器处理请求,浏览器接受HTTP响应

服务器收到请求后,会根据请求的 URL、
请求头等信息,调用相应的处理程序,如处理静态资源的 Nginx、处理动态资源的 Tomcat。

浏览器渲染

浏览器接收到服务器返回的 HTTP 响应后,会解析响应报文,根据响应头中的 Content-Type 等信息判断响应的类型,然后进行相应的处理。

  • HTML:浏览器会解析 HTML,构建 DOM 树。
  • CSS:浏览器会解析 CSS,构建 CSSOM 树。
  • render tree:浏览器会将 DOM 树和 CSSOM 树合并成一个 render tree。
  • 布局:浏览器会根据 render tree 计算每个节点的位置。
  • 绘制:浏览器会将 render tree 绘制到屏幕上。

关闭TCP连接(四次挥手)

一旦服务器返回了 HTTP 响应,浏览器会关闭 TCP 连接。

  • 四次挥手:客户端和服务器之间需要通过四次挥手关闭连接。
  • 第一次挥手:客户端发送一个 FIN 包给服务器,请求关闭连接。
  • 第二次挥手:服务器收到 FIN 包后,回应一个 ACK 包。
  • 第三次挥手:服务器发送一个 FIN 包给客户端,请求关闭连接。
  • 第四次挥手:客户端收到 FIN 包后,回应一个 ACK 包。

总结

以上就是从输入 URL 到页面加载完成的整个过程。在这个过程中,浏览器和服务器之间进行了多次的交互,包括 DNS 解析、建立 TCP 连接、发送 HTTP 请求、处理请求、返回 HTTP 响应等。最终,浏览器会将服务器返回的 HTML、CSS、JavaScript 等资源解析渲染,最终呈现给用户。