打开一个网页发生了什么

前言

“打开一个网页发生了什么”,是一个经典的不能再经典的面试题。在技术面这一关卡中,不论是校招,还是社招,是必考的一道题。

那这道看似平平无奇的题目,为什么会成为一道必考题呢?其实是因为,如果要答好这道题,必须掌握以下这些知识点才能答得精彩漂亮:

  1. DNS 解析过程。

  2. Nginx 负载均衡。

  3. 网络协议之 TCP 与 HTTP 协议。

  4. 前端渲染过程。

这就是打开一个网页过程涉及到的基本流程,如果做进一步细化的话,甚至可以涉及到 微服务、中间件、消息队列、数据库等知识。

从上面这些涉及到的知识体系,就可以看出,这道题考察的难度远远不像它的标题那样简单。

答案解析

关于这一问题,很多同学应该会如此回答:

  1. 在浏览器输入网址,按下回车

  2. 跳转并加载相关页面

  3. 展示页面信息

如果我们作为一个普通的互联网用户,如此回答其实也是正确的。但是如果是一个计算机学院相关的学生,或者是计算机相关的从业人员,如此回答便显得不够专业了。

首先我们需要了解到,这道题的整体流程主要分为以下几个大阶段:

  1. 浏览器阶段(DNS 解析)

  2. 网络请求阶段

  3. 前端渲染阶段

image

其中,每个阶段又可以细化出多个步骤。

浏览器阶段(DNS 解析)

在浏览器输入网址阶段,其实主要考察的是我们对于 DNS 解析过程的理解。首先先看下面这张图片

image

总结一下,在 DNS 解析过程中,流程应该为:

  1. 浏览器是否存在对应的缓存记录,如果没有话,则继续后面的步骤。

  2. hosts 文件和操作系统是否存在对应的缓存记录,如果没有话,则继续后面的步骤。

  3. 向域名解析服务器查找是否存在对应的记录,如果没有话,则域名解析错误,浏览器提示如下所示:

image

  1. 如果请求过程中,在任何一个环境找到对应的记录,则会返回服务器对应的 ip 地址,进入网络请求阶段。

网络请求阶段

image

在整个网络请求阶段,流程就更加的复杂了,具体步骤如下:

  1. 是否有在 Nginx 配置负载均衡,如果有的话,则上一步 DNS 解析过程中获取到的 ip 地址为 Nginx 代理服务器的地址。然后在访问过程中,Nginx 根据我们设定的分配算法和规则,选择一台后端的真实 Web 服务器;如果没有配置的话,就直接访问对应的Web服务器。

  2. TCP 三次握手建立连接。

  3. 查看请求信息是否加密,即是否使用的是HTTPS的协议。如果使用HTTPS的协议,那么就握手建立安全连接后再发起请求,如果没有,则直接发起请求。

  4. Web服务器收到请求后产生对应的响应信息。

  5. 同样如果有在 Nginx 配置负载均衡。那么Web服务器收到请求后,产生响应,并将网页发送给Nginx负载均衡服务器。然后Nginx再将原本的响应数据返回给浏览器(客户端);如果没有配置的话,则直接将原本的响应数据返回给浏览器(客户端)

前端渲染阶段

image

最后,涉及到展示页面信息:

  1. 解析 HTML,然后构建 DOM 树。

  2. 加载样式之后,解析样式,构建样式规则树。

  3. 加载 javascript 之后,执行 javascript 代码。

  4. 将 DOM 树和样式规则树(CSS Rule Tree)匹配构建渲染树(Render Tree)。

  5. 计算元素位置进行布局。

  6. 绘制页面。

  7. 显示页面。

从这个过程中我们可以看到,一些肉眼看到的过程在短短的数秒内,其实有一个非常复杂的逻辑处理过程。

如果想要回答好这道题,一定要对这三大阶段的过程倒背如流。

  1. 浏览器阶段(DNS 解析)

  2. 网络请求阶段

  3. 前端渲染阶段

3 个赞

:grin: :grin: :grin: :grin: