文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

网红面试题:从输入 Url 到看到页面发生了什么

2024-12-02 02:43

关注

以下就是从输入 url 到看到页面的整个流程图。

从url输入到页面渲染

前言

了解"开始导航"之前,需要先知道浏览器架构,简单来说,现代浏览器由1个浏览器主进程、1个GPU进程、多个渲染进程、多个插件进程、网络进程、音频进程、存储进程组成。

下图是李兵在《浏览器工作原理与实践》中所示,展示 Chrome 浏览器的架构。

目前的浏览器架构

以及未来现代浏览器架构示意图:

未来现代chrome浏览器架构

文章现代浏览器内部揭秘中有一张图,是这样描述的。

现代浏览器内部解密

图中表明浏览器主进程包含了 UI 线程、网络线程、存储线程,与李兵的观点有所不同。那以谁为准呢?以时间为准,李兵的专栏是19年所写,而《现代浏览器内部解密》是 18 年的文章,站在 2022 年的背景,现代浏览器,UI、网络、存储等都已升级为进程,而非是浏览器主进程中的线程。

用户输入

当用户在地址栏中输入一个字符串时,地址栏会判断输入的关键字是搜索内容,还是请求的URL。

当用户输入关键字并键入回车之后,意味着当前页面将替换为新的页面,此时浏览器中有个 API——beforeunload,它允许页面在离开之前触发是否一个确认对话框。这里使用此API,可让浏览器不再导航。

// 监听离开页面前的事件
window.addEventListener('beforeunload', (event) => {
event.preventDefault();
event.returnValue = '';
})

可在这里看看 beforeunload 的demo。

从浏览器架构分工上讲,当用户输入字符串时是 UI 进程(老一点的浏览器是浏览器主进程)在运作。

开始导航

当敲下 Enter 键时,UI 进程将指挥权交接给了网络进程。网络进程接受请求指令前,会先查找本地缓存是否有缓存。如果有缓存该资源,那么直接返回资源给浏览器进程;如果在缓存中没找到该资源,那么则正式进入HTTP请求阶段。

关于HTTP缓存方面的知识可以看看这篇——面试常客:HTTP 缓存。

HTTP请求

之前写过一篇TCP/IP 协议及网络分层模型,讲述了 TCP/IP 网络分层协议,它就像搭积木一样,每一层需要下一层的支撑,我们的 HTTP 请求是其 HTTP 协议的应用,需要先连接传输层(TCP)以及更底层网络互连层(IP)。

TCP/IP 网络分层模型

而IP从哪里来,通过 DNS, 使其域名 和 IP 做映射。

我们使用倒推法可以理清“路线”:

HTTP 请求 —— HTTP 协议连接 —— TCP 协议连接 —— IP 协议连接 —— 需要知道 IP——DNS 做域名/IP映射。

所以进入 HTTP 请求的第一步是 DNS 解析。

DNS 解析

这里对 DNS 不做过多概述,简单来说,它的作用是用域名代替 IP 地址,符合人的记忆。输入du.azhubaby.com ,表示 IP 地址 47.102.152.19 ,你可以在命令行中 ping 一个域名,来求证一下结果。

ping域名

HTTP 请求之前的第一步是判断 DNS 中是否有缓存,如果有,直接返回 IP 地址;如果没有,则进行 DNS 解析,并把结果 IP 缓存到 DNS。

有了 IP 地址后,IP 层连接成功,接下来就是 TCP 传输层。

TCP 连接

这里要看HTTP协议的版本,如果是 HTTP/1.1 的话,就要考虑TCP队列否饱满,因为 HTTP/1.1 最多允许一个域名连接 6 条TCP,太多了就要在等待TCP队列中排队;如果是 HTTP/2 的话,那就没事,它允许TCP并发。

这里还要考虑到如果协议是 HTTPS 协议的话,还需要建立一条 TLS 连接。

等真正 TCP 连接时,就联想到网红面试题:三次握手、四次挥手。

三次握手、四次挥手

为什么是三次握手和四次挥手,因为只有这样才能让双方(客户端和服务端)知道彼此的接收能力和发送能力是没问题的。

http-tcp-three-handshakes

步骤为:

可以理解为男女双方确认关系,男女双方要结婚,怎么办?先见父母得到父母认同,之前听过这样一句话:得不到父母祝福的婚姻是不幸福的(当然,不见父母直接结婚的也有,但不主流)。

这个叫确定关系。所以要又来又回三次,双方都确保知道对方的诚意和自己的诚意。

那什么是四次挥手呢?

在断开之前,需要进行四次挥手。

http-tcp-four-handshakes

为什么要有四次挥手?

主要是为了确保双方都知道对方断开连接。

具体步骤为:

主要是为了确认双方的接收能力和发送能力是否正常、制定自己的初始化序列号为后面的可靠性传送做准备。

可以理解为一对男女要分手。

于是乎,它们就断了,分手手续完成。具体详细的信息可看猿人谷的面试官,不要再问我三次握手和四次挥手,一个字:细。

发送HTTP请求

TCP连接已经通了,现在正式发送 HTTP 请求,这里又有的聊了,如 HTTP 的报文内容、请求头、响应头、请求方法、状态码等知识点。

首先 HTTP 的报文结构由 起始行 + 头部 + 空行 + 实体组成,简单来说就是 header+body,HTTP 的报文可以没有body(get方法),但必须要有 header。

请求头由请求行 + 头部字段构成,响应头由状态行 + 头部字段构成。

请求行有三部分:请求方法、请求目标和版本号。

状态行也有三部分:版本号、状态码和原因字符串。

在浏览器中,打开F12,在 NetWork 中任何一个请求中,你都会看到这样的结构。

报文结构

这里我们也常会遇到一些例如 GET 和 POST 请求方式的区别、HTTP 状态码等相关的衍生问题。

GET 和 POST 请求方式的区别

HTTP 状态码

RFC 标准把状态码分成了五类 ,用数字的第一位表示分类,而 0~99 不用,这样状态码的实际可用范围就大大缩小了,由 000~999 变成了 100~599。

这五类的具体含义是:

目前 RFC 标准里总共有 41 个状态码。

这里要对 304 做一下说明,当请求头 If-Modified-Since 或 If-None-Match 中判断修改时间是否一致(或唯一标识是否一致),是,则返回304,使用浏览器内存中的本地缓存;不一致则说明要更新,继续请求资源放回给客户端,并带上 Last-Modified 或 ETag。

请求方式

HTTP/1.1 规定了八种方法,都必须是大写形式。

浏览器渲染

当HTTP 请求完毕后,断开 TCP 连接,将资源返回给客户端(浏览器)。此时浏览器要判断是否与打开的网站是同一个站点。因为如果是同一个站点的话,则可使用同站点的渲染进程渲染页面,如果不是,浏览器则打开新的渲染进程解析资源。

浏览器渲染的大致流程如下图所示:

浏览器渲染大致流程

我们可以将页面渲染分为三个步骤:

解析

渲染

绘制

其中,衍生出重绘和回流的问题,提高性能的方法之一就是减少浏览器的渲染时间,其中的一个优化点就是减少重绘和回流。

减少回流和重绘的方法

  1. 不要一条条修改 DOM 样式,与其这样,不如预定义好CSS的class,然后修改DOM的样式。
  2. 把DOM“离线”后修改 使用 documentFragment 对象在内存里操作 DOM先把 DOM 给 display:none(有一次 。 Reflow),然后你想怎么改就怎么改,再把它显示出来clone 一个 DOM 节点到内存里,然后想怎么改就怎么改,改完后和在线的那个交换一下。
  3. 不要把 DOM 节点的属性值放在一个循环中当作循环的变量,不然这会导致大量地读写这个节点的属性
  4. 尽可能地修改层级比较低的DOM。
  5. 不要使用 table 布局。

造成回流的属性:

width、height、padding、margin、border、position、top、left、bottom、right、float、clear、text-align、vertical-align、line-height、font-weight、font-size、font-family、overflow、white-space

造成重绘的属性:

color、border-style、border-radius、text-decoration、box-shadow、outline、background

记住一点,回流是与几何大小相关,重绘与大小无关。

如此,从输入 url 到看到页面的整个流程就走完了。

总结

这道题能衍生很多问题,从一题可以测试出面试者的HTTP、浏览器相关知识。正所谓”鹏怒而飞,其翼若垂天之云;水击三千里,碧空九万丈;好风凭借力,送我上青云。“。这道题之所以能成为经典题,不是没有它的原因的。

笔者这里做一个总结,把这题可以衍生的知识点逐一列出,待君思索。

浏览器方面

HTTP方面

TCP/IP 连接 三次握手、四次挥手

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯