文章在本人个人博客同步更新
面试题:在浏览器输入url后按下回车发生了什么
1. DNS查找
??先检查本地缓存中是否存在,若不存在就会从最近的DNS服务器开始查找一层一层向上查找,直到找到最终的DNS服务器,找到之后就会返回到浏览器,然后由浏览器进行本地记录缓存,防止下次访问再次多级查找.
2.建立TCP连接(三次握手)
第一次:客户端向服务器发送SYN包 第二次:服务器收到SYN包之后向客户端发送ACK+SYN包 (至此客户端向服务端的单向连接已建立) 第三次:客户端接收到ACK包之后给服务端发送ACK包 (服务端到客户端的连接已经建立)
3.SSL/TLS协议(HTTPS)
超清晰详解见https原理
4.响应
??一旦我们建立了到web服务器的连接,浏览器就代表用户发送一个初始的HTTP GET请求,对于网站来说,这个请求通常是一个HTML文件。 一旦服务器收到请求,它将使用相关的响应头和HTML的内容进行回复。
5.慢开始、14kb原则
??第一个响应包是14kb大小。这是慢开始的一部分,慢开始是一种均衡网络连接速度的算法。慢开始逐渐增加发送数据的数量直到达到网络的最大带宽。在"TCP slow start"中,在收到初始包之后, 服务器会将下一个包的大小加倍到大约28kb。 后续的包依次是前一个包大小的二倍直到达到预定的阈值,或者遇到拥塞。
6.拥塞控制
??服务器通过tcp包来发送数据,客户端接收到数据之后会返回一个确认帧来确认消息的传输。当服务端传输速率过快过多时就会出现确认帧没有返回的情况,所以服务器就么没办法收到数据传输成功的消息,确认帧丢失。解决办法就是通过确认帧来控制数据的发送速率
7.解析
??从收到第一次14kb的数据开始,浏览器就进行推测性解析并尝试根据所拥有的数据进行渲染,对于web性能优化来讲这就是第一次的14kb数据所要包含页面的渲染所需的所有内容或者页面模版的重要性
*在页面渲染之前html、css、js必须全部解析完成
8.构建DOM树
??解析html构建DOM树,遇到非阻塞资源会发出请求并且继续解析(css、img),但是script标签却是可以阻塞解析的进行(这就是为什么script标签总是放在最后的原因),通过预加载扫描器可以缓解阻塞情况(预加载扫描器可以在解析占用浏览器主进程的时候,扫描css、图片、字体等进行高级资源优先请求),当浏览器解析到资源的时候可能已经被请求完或下载完,减少了阻塞的发生。同时进行的是生成cssom树,然后将dom树和cssom树合并成render树,根据render树进行创建真实dom,然后进行计算每个节点的位置大小(重排),最后绘制dom在页面上(重绘)
详情请见MDN官方文档: https://developer.mozilla.org/zh-CN/docs/Web/Performance/How_browsers_work
|