浏览器输入URL会做哪些事情

1、浏览器输入URL后会检查缓存

检查资源是否在缓存中并且新鲜,如果有跳到转码步骤,

        1.1 检查是否新鲜的方法:

                        ---------HTTP1.0中提供的 Expires,储存的值是绝对时间表示缓存日期;

                        ---------HTTP1.1中提供Cache-Control:,储存以秒单位的最大新鲜时间;

如果未缓存新鲜资源,发起新请求

2、浏览器解析URL获取协议、主机、端口号、path

3、浏览器组装一个HTTP(GET)请求报文

4、浏览器获取主机IP地址:

   浏览器缓存---本机缓存---hosts文件-----路由器缓存-------ISP DNS缓存-------DNS递归查询(可能存在负载均衡导致每次IP不一样)

5、打开一个socket与目标IP地址,端口建立TCP连接(三次握手)

         5.1 客户端发送一个ACK报文,SYN=1,Seq=X 等待状态

         5.2 服务器接收后返回一个ACK报文,SYN=1, ACK=X+1 ,Seq=Y 半连接状态

         5.3 客户端接收后返回一个ACK报文,ACK=Y+1,Seq=Z  确定连接状态

        为什么要三次?

                  因为需要确定客户端和服务器的发送、接收、接收发送 功能,从而建立连接的可靠性。

6、 TCP连接后发送HTTP请求

7、服务器接收并解析,将请求发送到服务程序 ,如虚拟主机,用HTTP Host 头部判断请求的服务程序

8、服务器检查HTTP请求头是否包含缓存验证信息返回对应状态码

9、处理程序读取完整请求准备HTTP响应,访问数据库

10、服务器响应发送给浏览器 

 11、浏览器接收响应,根据情况关闭TCP连接或者保留(四次挥手)

        11.1主动方发送FIN报文,Fin=1,ACK=Z,Seq=X 半关闭状态

        11.2 被动方接收并发送ACK报文,ACK=X+1,Seq=Z 确认状态

        11.3 被动方发送FIN报文,Fin=1,ACK=X,Seq =Y 半关闭状态

        11.4 主动方接受并发送ACK报文,ACK=Y,Seq=X 关闭状态

为什么要四次?

                  其实是客户端和服务器各自释放连接的过程,在进入这个阶段时,主动方发送FIN报文告诉被动方不再发送数据了,被动方接收到之后先应答返回ACK报文,但是如果被动方还需要数据推送,就要等待推送完成后再返回一个FIN报文表示同意关闭。

12、浏览器检查响应状态码

13、缓存资源

14、对响应进行解码

15、 解析HTML构建DOM树,下载资源构建CSS树,执行JS脚本

         15.1构建DOM树

                        1.Tokenizing:根据HTML规范将字符流解析为标记流

                         2、Lexing:词法分析将标记转坏为对象并定义属性和规则

                          3、DOM construction:根据HTML标记关系及那个对象组成DOM树

        15.1解析过程遇到图片、样式、js文件,启动下载      

         15.1构建CSS树

                        1、Tokenizing:将字符流转换为标记流

                         2、Node :根据标记创建节点

                         3、CSSOM:节点创建CSS树

          15.1构建渲染树

                        1、从DOM树的根节点遍历所有可见节点,

                                        不可见节点:meta 、 scritp 、隐藏

                         2、对每个可见节点找到对应的CSSOM规则应用

                          3、发布可见节点内容和计算样式

          15.1执行JS脚本

                1、浏览器创建Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading

                2、HTML解析遇到没有async和defer的script时,将他们添加到文档中,然后执行行内或外部脚本,同步执行,并且脚本下载或执行时解析器会暂停,这样就可以用document.write()方法将文本插入文件流,同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script和他们之前的文档内容

                3、当解析器遇到设置了async属性的script时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行,但是解析器不会停下来等它下载。异步脚本禁止使用document.write(),它们可以访问自己script和之前的文档元素

                4、当文档完成解析,document.readState变成interactive

                5、所有defer脚本会按照在文档出现的顺序执行,延迟脚本能访问完整文档树,禁止使用document.write()

                6、浏览器在Document对象上触发DOMContentLoaded事件

                7、此时文档完全解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入并且所有异步脚本完成载入和执行,document.readState变为complete,window触发load事件

16、显示页面 

猜你喜欢

转载自blog.csdn.net/css_javascrpit/article/details/130234921