从输入url到页面加载发生了什么?(一)
1、浏览器查找域名的IP地址----DNS解析的过程;
当我们在浏览器的地址栏中输入 url 地址之后,我们并不能直接去访问到我们所要访问的服务器(虚拟主机)上的资源的,因为互联网的每一台虚拟主机也就是服务器的标识是它的IP,但是IP并不方便记忆,因此我们就需要DNS先去解析,根据我们输入的 url ,将其转换成IP地址,也就是查找IP地址;DNS的查找过程:
1)、浏览器缓存:浏览器缓存DNS记录一段时间,然而操作系统并没有告诉浏览器每个DNS记录的生存时间,因此浏览器会将其缓存一段固定的时间(一般在2到30分钟之间)
2)、操作系统缓存:如果浏览器缓存不包含所需的记录,则浏览器进行系统调用(Windows中的gethostbyname)。操作系统有自己的缓存。
3)、路由器缓存:请求继续到您的路由器,路由器通常具有自己的DNS缓存。
4)、ISP DNS缓存:检查的下一个是ISP的DNS缓存,这里自然也会有一个缓存。
5)、递归搜索:ISP的DNS服务器开始递归搜索,从根名称服务器通过.com顶级名称服务器到Facebook的名称服务器。通常来讲,DNS服务器将在缓存中具有.com名称服务器的名称,因此对根名称的服务器的命中是不必要的
2、浏览器采用三次握手与服务器建立TCP连接;
3、浏览器向服务器发送http请求报文;
4、服务器向浏览器发送http响应报文;
无论是请求报文或者响应报文一般由三部分组成:“起始行”、“头部”、“主体”;请求报文的起始行说明要做些什么,而响应报文的起始行则说明发生了什么;头部字段向请求报文或者响应报文中添加一些附加信息,这些信息都是一些键/值对应的列表,主体部分可选,它是HTTP真正要传输的内容,服务器在响应报文的主体部分携带HTML代码,用于浏览器进行页面渲染;
5、释放TCP连接;
6、浏览器解析渲染页面
浏览器在解析页面的时候是一个边解析边渲染的过程;首先浏览器解析HTML文件构建DOM树,然后解析css文件构建渲染树,等到渲染树构建完毕后,浏览器开始布局渲染树并将其绘制到屏幕上;这个过程比较复杂,设计到两个概念:reflow(回流)和repain(重绘)。DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程成为relow;当盒模型的位置、大小以及其他属性,如颜色、字体等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。页面在首次加载时必然会经历reflow和repain。relow和repain过程是非常消耗性能的,尤其是在移动设备上,它会破坏用户体验,有时候会造成页面的卡顿,所以要尽可能的减少reflow和repain.。
浏览器依据服务器传来的响应报文(主体部分)数据从上到下解析HTML代码,在<head>部分获取到css,然后开始渲染页面;如果link标签引入的外部样式表放在<body>底部,由于从上倒下解析,一开始不会显示元素样式,直到解析到link部分的css才会重新渲染页面;
当浏览器在HTML代码中发现对一些资源的引用时,比如img等,浏览器向服务器发出异步请求获取这些资源,此时浏览器不会等到资源下载完,而是继续渲染后面的代码,服务器返回浏览器需要的资源,浏览器回过头来重新渲染该部分代码;
当浏览器发现包含javascipt代码的<script>标签是,它立即执行它;如果javascript脚本命令改变前面的布局或者样式,浏览器不得不重新渲染这部分代码;