从输入URL到页面展示发生了什么(偏前端)

114 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

从输入URL到页面展示发生了什么(偏前端)

相信大家对这个问题也不陌生,或多或少都在面试中遇到过。

这个问题为什么这么经典,是因为这个问题的考察的非常全面,从浏览器原理,到网络协议等等

大家也应该看过其它非常优秀去讲解原理的文章,这里我就不班门弄斧了

我主要从如何帮助大家更好的在面试的过程中去说出自己的理解,当然,大家如果有自己的理解则更佳

考察全面的好与坏

为什么会说考察的全面是有好和坏的呢?

当然,如果你对其中的知识点掌握的非常熟悉,那对于你来说,本文的内容你权当儿戏即可。

对于初学者,非科班出生的朋友来说,知识点太多,范围太大,很难去理解一些不太熟悉的方面,这是考察全面的不好之处,但是你对于其中一个知识点比较了解,再碰上面试官对这个知识点感兴趣,那这其实是你的大优势。

我的回答 (仅供参考)

  1. 在地址栏输入url按下回车之后,首先会进入DNS解析,找到这个url的域名

  2. 检查浏览器是否有缓存,如果命中强缓存,则直接读取本地资源,如果没有命中强缓存的话,会先建立TCP连接,查询是否需要更新资源,也就是协商缓存

  3. 通过三次握手,建立TCP连接,三次握手简单理解:

    客户端发送 -syn报文-> 服务器接收 //客户端对服务器说:听得到吗?

    服务器发送 -syn报文-ack报文-> 客户端接收 //服务器对客户端说:听到了,你能听到我说话吗?

    客户端发送 -ack报文-> 服务器接收 //客户端对服务器说:okok,我们开始聊正事吧

  4. 发送HTTP/HTTPS请求,去获取html页面

  5. 服务器处理请求,返回http报文

  6. 浏览器下载数据,开始解析html,构建DOM树,解析CSS,构建CSS规则树,然后根据DOM树和CSS规则树来构造Render Tree 渲染树,然后进入布局阶段,遍历渲染树,绘制出整个页面

  7. 浏览器开始执行js脚本,发送ajax请求获取数据,处理事件循环等异步逻辑

  8. 最后进行四次挥手,关闭TCP连接,简单理解:

    (客户端 或者服务器先发起都可以,我以客户端发起作为例子)

    客户端发送 -fin报文-> 服务器接收 //客户端对服务器说:再见!

    服务器发送 -ack报文-> 客户端接收 //服务器对客户端说:听到了

    服务器发送 -fin报文-> 客户端接收 //服务器对客户端说:再见!

    客户端发送 -ack报文-> 服务器接收 //客户端对服务器说:ok,听到了

最后

以上这就些就是我在面试中对于这个问题的回答示范,由于自己是对TCP协议,强缓存,协商缓存,事件循环机制,浏览器渲染比较了解,所以个人会在这方面多说一些

大家也可以根据自己的优势的方面多去展示自己的理解

文中如果有不足之处,欢迎指出