当我们输入网址并回车时,浏览器会检查网址,首先判断网址格式,比如ftphttped2k等,我们假设网址为http://hellocassie.cn,那么浏览器会对这个URL进行安全检查,然后浏览器内核会先检查缓存,然后决定是发起请求,下载页面,还是从缓存中获取页面。如果是第一次访问,没有Cache,所以会向服务器发起网络请求。要下载一个页面,我们必须先确定服务器的网络地址,然后才能向它发送请求。因此,我们需要将这个URL转换成对应的IP地址。浏览器会依次从浏览器缓存、系统缓存、路由器缓存、本地DNS服务器中获取一个IP地址。递归查询,如果本地DNS服务器没有对应IP地址的记录,则向13台根域名服务器发送请求。根域名服务器收到请求后,会判断谁有权管理该域名,然后返回一个负责TLD服务器的IP。本地DNS服务器收到IP信息后,会联系顶级域名服务器。顶级域名服务器收到请求后,如果无法解析,则返回下一级域名服务器的IP。如此反复查询后,再到子域名服务器。这个时候有两种情况。首先是子域名服务器返回URL对应的IP地址。二是已经被CDN调度。如果目标网站使用CDN服务,需要在CDN服务商的平台上进行设置。对应的CNAME记录,这条记录是CDN服务商的一个DNS服务器的域名,子域名服务器会返回这条CNAME记录,本地DNS服务器得到这条记录后,会查询该CDN服务商的DNS服务器CDN服务商,然后CDN服务商的DNS服务器返回CDN服务商的一个GSLB设备(全局负载均衡设备)的IP。本地DNS服务器携带自己的IP地址和需要查询的域名向GSLB设备发起请求。GSLB设备使用IP地址和域名进行查询。选择用户所属区域的区域负载均衡设备,区域负载均衡设备会根据一定的算法和策略,将最合适的CDN节点的IP地址返回给GSLB设备,例如返回一个CDN节点离用户最近,因为CDN服务器缓存了网站源服务器的数据,像源服务器一样响应用户的请求。而且离用户更近,所以可以获得更快的响应速度。最后本地DNS服务器获取到CDN节点的IP地址。获取IP后,会建立TCP连接。如果URL以https开头,则会建立SSL连接,并进行申请证书和生成会话密钥的过程。然后开始HTTP请求,浏览器首先会生成一个HTTP数据包,里面包含了这次请求的信息,主要是请求方法、请求的描述和请求附带的数据。这个HTTP数据包经过传输层,在头部加上双方的端口信息,封装成一个TCP数据包,再通过网络层,在头部加上双方的IP地址信息,这封装成IP数据包,然后通过数据链路层,在包头中设置双方的MAC地址,封装成以太网包,最后变成二进制数据,发送给服务器。然后服务器响应并向浏览器返回一个HTTP消息。此HTTP消息包括状态行、消息头和消息文本(即HTML)。缓存获取页面然后我们看第二种情况。如果本地有缓存,浏览器会先判断缓存是否过期,通过Expires和Cache-Control字段判断是否命中强制缓存。Expires是服务器返回的缓存结果。Cache-Control的max-age会返回一个相对时间,因为无法判断client的时间是否与server的时间同步,所以当两者都存在时,Cache-Control的优先级更高。如果强制缓存无效,则进行协商缓存过程,浏览器向服务器发送带有缓存标识的请求,服务器根据缓存标识决定是否使用本地缓存。在解析HTML的过程中,渲染后的页面开始构建DOM树。当遇到CSS/JS等外部资源时,浏览器会并行下载CSS和JavaScript。阻塞渲染,JS会阻塞对HTML的解析,需要等待脚本下载执行完毕后才能继续解析HTML,并且由于JS可能会查询CSSOM,所以必须在下载CSS文件前阻塞,然后JavaScript才可以执行。img图片资源会被异步下载,不会阻塞解析。下载完成后,原来的src会直接替换成图片。然后合并DOM树和CSSOM树生成渲染树,从DOM树的根节点开始遍历每一个可见节点,忽略script标签、meta标签、display:none节点,为每个可见节点找一个合适的CSSOM规则并应用它们。然后开始布局,从渲染树的根节点开始遍历,计算出每个节点在网页中的准确位置和大小。布局完成后,渲染树被翻译成屏幕上的像素来显示页面。
