从浏览器地址栏输入URL后,到页面渲染出来,整个过程都发生了什么?
这个是关于前端页面性能优化的一道经典面试题,本人在面试过程中也有遇到过这个问题,当时被问到感觉很懵逼。过后自己查找了一下资料,并学习了一下,最近又看到这个面试题,所以记个笔记吧。
首先这个面试题可以回答的非常细致,能从信号与系统,计算机原理,操作系统聊到网络通信,浏览器内核再到DNS解析,负载均衡,页面渲染等。 为了后面表述更清楚,就先将整个过程划分以下几个阶段:
-
DNS解析(如果IP直接访问则此过程省略)
-
客户端与服务端进行TCP三次握手连接
-
客户端发送HTTP请求
-
服务器处理请求并返回HTTP报文
-
浏览器解析渲染页面
-
连接结束
也可以这么说 从输入URL到页面加载的主干流程如下:
1、浏览器的地址栏输入URL并按下回车。
2、浏览器查找当前URL的DNS缓存记录。
3、DNS解析URL对应的IP。
4、根据IP建立TCP连接(三次握手)。
5、HTTP发起请求。
6、服务器处理请求,浏览器接收HTTP响应。
7、渲染页面,构建DOM树。
8、关闭TCP连接(四次挥手)。
或者简单来说就是: 查找强缓存,DNS解析,建立TCP连接,发送HTTP请求,网络响应,页面渲染,解析过程,渲染
1网络请求线程开启
浏览器接收到我们输入的url到开启网络请求线程,这个阶段是在浏览器内部完成的,通过解析url之后,如果是http协议,则浏览器会新建一个网络请求线程去下载所需资源,
2 建立HTTP请求
这时候,主要工作分为:DNS解析和通信链路的建立 简单来说就是,首先发起请求的客户段浏览器要明确知道所要访问的服务器地址,然后建立通往该服务器地址的路径。
2.1-DNS解析
URL解析其实就是将url拆分为代表具体含义的字段,然后以参数的形式传入网络请求线程进一步处理,其中第一步就是DNS解析:我们知道在地址输入的域名并不是最后资源所在的真实位置,域名只是和ip地址的一个映射。网络服务器的IP地址那么多,不可能去记一串串数字,因此域名就产生了,域名解析的过程就是将域名还原为IP地址的过程: 首先浏览器先检查本地hosts文件是否有这个网址映射关系,如果有就调用这个IP地址映射,完成域名解析。
如果没找到则会查找本地DNS解析器缓存,如果查找到则返回。
如果还是没有找到则会查找本地DNS服务器,如果查找到则返回。
最后迭代查询,按根域服务器 ->顶级域,.cn->第二层域,hb.cn ->子域,www.hb.cn的顺序找到IP地址。
DNS域名解析: 浏览器向DNS服务器发起请求,解析该URL中的域名对应的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议。
3--建立TCP连接
解析出IP地址后,根据IP地址和默认80端口,和服务器建立TCP连接
发起HTTP请求: 浏览器发起读取文件的HTTP请求,该请求报文作为TCP三次握手的第三次数据发送给服务器,服务器响应请求并返回结果:服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
关闭TCP连接 : 通过四次挥手释放TCP连接
简单一句话总结:输入url 然后交给DNS进行域名解析 获得IP地址确定的那台服务器建立TCP的链接,从而向服务器发起http请求 服务器处理完成后 返回数据(http响应返回)浏览器对加载到的资源进行语法分析,渲染页面