从输入URL到页面展示,这中间发生了什么?

269 阅读3分钟

1.(url解析)用户输入关键词,地址栏判断是搜索内容还是url地址。 如果是搜索内容,会使用浏览器默认搜索引擎加上搜索内容合成url; 如果是域名会加上协议(如https)合成完整的url。

2.(缓存检查)在本地缓存中查找是否有缓存文件,如果有,拦截请求,直接200返回;否则,进入网络请求过程

3.(DNS解析)返回域名对应的IP和端口号,如果之前DNS数据缓存服务缓存过当前域名信息,就会直接返回缓存信息;否则,发起请求获取根据域名解析出来的IP和端口号,如果没有端口号,http默认80,https默认443。如果是https请求,还需要建立TLS连接。

4.(TCP三次握手建立连接)

juejin.cn/post/692942…

5.(发送HTTP请求)

6.(服务器处理请求)

1)应用层HTTP解析请求头和请求体,如果需要重定向,
HTTP直接返回HTTP响应数据的状态code301或者302,
同时在响应头的Location字段中附上重定向地址,
浏览器会根据code和Location进行重定向操作;
(2)如果不是重定向,首先服务器会根据请求头中的If-None-Match 的值来判断请求的资源是否被更新,
如果没有更新,就返回304状态码,相当于告诉浏览器之前的缓存还可以使用,
就不返回新数据了,返回304状态码;否则,返回新数据,200的状态码
(3)并且如果想要浏览器缓存数据的话,
就在相应头中加入字段:Cache-Control:Max-age=2000

7.(TCP四次挥)数据传输完成,TCP四次挥手断开连接。如果,浏览器或者服务器在HTTP头部加上如下信息,TCP就一直保持连接。保持TCP连接可以省下下次需要建立连接的时间,提升资源加载速度 Connection:Keep-Alive

8.(浏览器加载解析渲染)当浏览器获得一个html文件时,会“自上而下”加载,并在加载过程中进行解析渲染。

(1)处理 HTML 标记,构建 DOM 树
(2)处理 CSS 标记,构建 CSSOM 树
(3)将 DOM 树和 CSSOM 树融合成渲染树
(4)根据生成的渲染树,计算它们在设备视口(viewport)内的确切位置和大小,
这个计算的阶段就是回流 => 布局(Layout)或 重排(reflow)
(5)根据渲染树以及回流得到的几何信息,得到节点的绝对像素 => 绘制(painting)
(6)遇到style内嵌样式,GUI直接渲染即可(同步一步一步的渲染)
(7)遇到link,浏览器开辟一个HTTP线程去请求资源文件信息,同时GUI继续向下渲染「异步」
(8)遇到@import,浏览器也是开辟HTTP线程去请求资源,
但是此时GUI也暂停了(导入式样式会阻碍GUI的渲染),
当资源请求回来之后,GUI才能继续渲染「同步」
(9)遇到 <script src='xxx/xxx.js'>,会阻碍GUI的渲染;
     + defer:和link是类似的机制了,不会阻碍GUI渲染,
     当GUI渲染完,才会把请求回来的JS去渲染;
     + async:请求JS资源是异步的「单独开辟HTTP去请求」,
     此时GUI继续渲染;但是一但当JS请求回来,
     会立即暂停GUI的处理,接下来去渲染JS 

此阶段的优化:

juejin.cn/post/692241…

juejin.cn/post/692385…