前端面试:讲讲浏览器从输入网址到打开网页的整个过程

269 阅读8分钟

当我们在浏览器中输入一个网址并按下回车键时,浏览器会启动一个复杂的流程,让我们来一步步地分解这个过程:

步骤 1:DNS 解析

首先,浏览器会把你输入的网址送到 DNS(域名系统)服务器。DNS 就像是一个电话簿,它会把人们能理解的网址转换成计算机能理解的 IP 地址,就像是把人名转换成电话号码一样。这个 IP 地址是服务器的“住址”,浏览器需要找到这个地址才能访问网站。

以下是DNS解析的详细过程:

  1. 浏览器缓存: 浏览器首先会检查自己的缓存,看看是否已经解析过这个域名。如果之前解析过,浏览器就可以直接使用缓存中的IP地址,节省解析时间。
  2. 操作系统缓存: 如果浏览器的缓存中没有找到对应的IP地址,浏览器会向操作系统发出请求,询问是否有这个域名的IP地址缓存。操作系统也会维护一个DNS缓存,类似于浏览器缓存。
  3. 路由器缓存: 如果操作系统缓存中也没有找到IP地址,浏览器会向家庭路由器(或者企业网络的边界设备)发出请求,检查是否有对应的缓存信息。
  4. ISP缓存: 如果以上缓存都没有找到IP地址,浏览器会联系互联网服务提供商(ISP)的DNS服务器,这是一个更高级别的DNS服务器。ISP DNS服务器通常会维护着大量的域名与IP地址的映射关系,可能会找到所需的IP地址。
  5. 根域名服务器: 如果连ISP的DNS服务器也没有找到IP地址,就需要从根域名服务器开始。根域名服务器是整个DNS系统的顶级,它们知道哪些顶级域(如.com、.org、.net等)的DNS服务器需要联系。
  6. 顶级域名服务器: 根据根域名服务器提供的信息,浏览器会联系对应的顶级域名服务器(例如 ".com" 的顶级域名服务器)。这些服务器会指示浏览器前往下一级的域名服务器。
  7. 二级域名服务器: 浏览器到达二级域名服务器,这些服务器管理着具体的域名和IP地址的映射关系。在这里,浏览器将最终获得目标域名的IP地址。
  8. 返回IP地址: 权威域名服务器返回目标域名对应的IP地址给浏览器。浏览器会将这个IP地址存储在自己的缓存中,以备将来使用。
  9. 建立连接: 有了IP地址,浏览器可以向服务器发起连接请求,然后开始下载网页内容,并展示给用户。

这个过程中,从浏览器到根域名服务器再到二级域名服务器,是一个递归的过程。整个DNS解析过程的速度会受到多个因素的影响,包括缓存情况、网络延迟等。虽然看起来复杂,但它确保了我们可以用方便的域名来访问互联网上的资源。

步骤 2:建立连接

一旦浏览器知道了服务器的 IP 地址,它就会和服务器建立连接,就像是你拨打电话一样。这个连接是通过 HTTP 或者 HTTPS 协议建立的,它们决定了浏览器和服务器之间如何传递数据。

以下是建立TCP连接的详细过程:

  1. 三次握手:

    • 第一次握手(SYN): 浏览器向服务器发送一个同步序列号(SYN)的数据包,请求建立连接。这个包也包含一个随机的初始序列号。
    • 第二次握手(SYN-ACK): 服务器收到请求后,回复一个带有确认序列号(ACK)和同步序列号(SYN)的数据包。这表示服务器愿意建立连接,并且确认客户端的初始序列号。
    • 第三次握手(ACK): 浏览器收到服务器的确认后,会再次发送一个确认序列号(ACK)的数据包,表示连接已经建立。从此时开始,双方都可以开始传输数据。
  2. 连接建立: 经过三次握手,连接正式建立,浏览器和服务器之间可以开始安全地传输数据。

为什么要进行三次握手呢?这是为了确保双方都准备好并且能够正常通信。第一次握手是为了告诉服务器“我想要连接”,第二次握手是为了告诉浏览器“我愿意连接并接受你的初始序列号”,第三次握手是为了告诉服务器“我已准备好连接,我们可以开始传输数据”。

同样,这个过程也是为了确保连接的可靠性。如果只有两次握手,可能会导致某些情况下服务器误认为连接已经建立,而浏览器并没有准备好。三次握手的过程可以降低这种误判的风险。

步骤 3:发送 HTTP 请求

现在,浏览器会发送一个 HTTP 请求到服务器,请求获取网页的内容。这个请求包含了很多信息,比如你要访问哪个具体的页面,以及浏览器自身的一些信息。

以下是发送HTTP请求的详细过程:

  1. 构建请求: 浏览器已经知道了要请求的网页的IP地址,它会构建一个HTTP请求报文。这个报文包含了请求的方法(GET、POST等)、路径(URL中的路径部分)、HTTP版本、请求头(User-Agent、Cookie等)以及可选的请求体(POST请求时的数据)。
  2. 发送请求: 一旦TCP连接建立好,浏览器会将构建好的HTTP请求报文发送给服务器。这个报文会通过网络传输到服务器的指定端口。

步骤 4:服务器处理请求

服务器接收到浏览器发送的请求后,会开始处理它。这可能涉及到从数据库中获取数据、处理逻辑,然后准备好要发送给浏览器的数据。

步骤 5:发送 HTTP 响应

一旦服务器准备好数据,它会将数据封装在 HTTP 响应中,然后发送回浏览器。这个响应包含了网页的内容,以及一些元数据,比如状态码,它告诉浏览器请求是否成功或有错误。

  1. 处理响应: 服务器处理完请求后,会生成一个HTTP响应报文,包含了响应的状态码、响应头(Content-Type、Content-Length等)以及响应体(网页的具体内容)。
  2. 响应传输: 服务器将响应报文发送回浏览器。这个报文会经过网络传输,回到与浏览器相连的设备上。

步骤 6:浏览器渲染

浏览器收到服务器的响应后,它会开始解析响应的内容。如果响应中包含 HTML、CSS 和 JavaScript,浏览器会根据这些内容来构建网页的结构、样式和交互效果。

这个过程包括多个阶段,让我们一步步深入了解:

  1. 解析HTML: 浏览器首先会将获取的HTML代码解析成DOM(文档对象模型)树。DOM树是一个树状结构,表示网页的结构,每个HTML元素对应一个DOM节点。浏览器通过逐行读取HTML代码,分析标签、属性等信息,构建出DOM树。
  2. 解析CSS: 浏览器解析CSS代码,生成CSSOM(CSS对象模型)树。CSSOM树表示网页的样式规则,类似于DOM树但用于表示样式。浏览器会根据DOM树和CSSOM树计算每个元素的具体样式。
  3. 构建渲染树: 浏览器会将DOM树和CSSOM树合并,形成渲染树(也称呈现树)。渲染树只包含需要渲染的元素和相关样式信息,不包含不会影响页面外观的元素(比如<head>中的内容)。
  4. 布局(Layout): 渲染树构建完成后,浏览器会进行布局,也叫重排(reflow)。在布局阶段,浏览器会根据渲染树来计算每个元素在屏幕上的准确位置和尺寸。生成一个布局树。
  5. 绘制(Painting): 在布局完成后,浏览器会进行绘制,也叫重绘(repaint)。在绘制阶段,浏览器会根据布局树将每个元素的可视部分绘制在屏幕上。
  6. 合成(Composition): 浏览器将所有元素的绘制结果进行合成,生成最终的页面图像。这个过程包括将各个图层(如元素、背景、边框等)按正确的顺序叠加在一起。
  7. 显示: 最终,浏览器将合成后的图像显示在屏幕上,用户可以看到完整的渲染结果。

需要注意的是,浏览器渲染是一个逐步的过程,不是一次性完成的。在渲染的过程中,可能会有JavaScript脚本的执行,可能会有网络请求,也可能会有用户的交互。这些因素都会影响渲染的流程和速度。