1、在浏览器地址栏输入URL
2、浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤
- 如果资源未缓存,发起新请求
- 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。
- 检验新鲜通常有两个
HTTP
头进行控制Expires
和·Cache-control
:- HTTP1.0提供
Expires
,值为一个绝对时间表示缓存新鲜日期。 - HTTP1.1增加了
Cache-control:max-age=time
,值为以秒为单位的最大新鲜时间。
- HTTP1.0提供
3、浏览器解析URL协议获取协议,主机,端口,path
4、浏览器组装一个HTTP(GET)请求报文
5、浏览器获取主机ip
地址,过程如下:
- 浏览器缓存
- 本机缓存
hosts
文件- 路由器缓存
ISR
DNS
缓存DNS
递归查询(可能存在负载均衡导致每次IP
不一致)
6、打开一个socket
与目标IP
地址,端口建立TCP
链接,三次握手如下:
- 客户端发送一个
TCP
的SYN=1, Seq=X的包到服务器端口 - 服务端发回SYN=1, ACK=X+1, Seq=Y的响应包
- 客户端发送ACK=Y+1, Seq=Z
7、TCP
软连接建立后发送HTTP
请求
8、服务器接收请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Host
头部判断请求的服务程序。
9、服务器检查 HTTP
请求头是否包含缓存验证信息,如果验证缓存新鲜,返回304(未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源)等对应状态码。
10、处理程序读取完成请求并准备HTTP
响应,可能需要查询数据库等操作。
11、服务器将响应报文通过TCP
链接发送回浏览器。
12、浏览器接收HTTP
响应,然后根据情况选择关闭TCP
连接或者保留重用,关闭TCP
链接的四次握手如下:
- 主动方发送
Fin=1,ACk=Z,Seq=x
报文 - 被动方发送
ACK=X+1,Seq=Z
报文 - 被动方发送
Fin=1, ACK=X, Seq=Y
报文 - 主动方发送
ACK=Y, Seq=X
报文
13、浏览器检查响应状态码:是否为1XX(服务器收到请求,需要请求者继续执行操作),3XX(重定向,需要进一步的操作已完成请求),4XX(客户端错误,请求包含语法错误或无法完成请求),5XX(服务器错误,服务器在处理请求的过程中发生错误),这些情况处理与2XX(成功,操作被成功接收并处理)不同。
14、如果资源可以缓存,进行缓存
。
15、对响应进行解码(例如gzip压缩)。
16、根据资源类型决定如何处理(假定资源未HTML文档)。
17、解析HTML文档,构建DOM树,下载资源,构造CSDDOM树,执行js脚本,无先后顺序
18、构建DOM树
- Tokenizing:根据
HTML
规范将字符流解析为标记 - Lexing:词法分析将标记转换为对象并定义属性和规则
- DOM construction:根据HTML标记关系将对象组成
DOM
树
19、解析过程中遇到图片、样式表、js文件,启动下载
20、构建CSSOM树:
- Tokenizing:字符流准换为标记流
- Node:根据标记创建节点
- CSSOM:节点创建
CSSOM
树
21、根据DOM树和CSSOM树构建渲染树:
- 从DOM树的根节点变流所有课件节点,不可见节点包括:
script,meta
这种本身不可见的标签- 被
css
隐藏的节点,如display: none
- 对每一个可见节点,找到恰当的
CSSOM
规则并应用 - 发布可视节点的内容和计算样式
22、js
解析如下:
- 浏览器创建
Document
对象并解析HTML
,将解析到的元素和文本节点添加到文档中,此时document.readystate
为loading
- TML解析器遇到没有
async
和defer
的script
时,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执⾏时解析器会暂停。这样就可以⽤document.write()
把⽂本插⼊到输⼊流中。同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script
和他们之前的文档内容。 - 当解析器遇到设置了
async
属性的script
时,开始下载脚本并继续解析⽂档。脚本会在它下载完成后尽快执行,但是解析器不会停下来等它下载。异步脚本禁止使⽤document.write()
,它们可以访问自己script
和之前的⽂档元素。 - 当⽂档完成解析,
document.readState
变成interactive
- 所有
defer
脚本会按照在⽂档出现的顺序执⾏,延迟脚本能访问完整⽂档树,禁止使⽤document.write()
- 浏览器在
Document
对象上触发DOMContentLoaded
事件
此时⽂档完全解析完成,浏览器可能还在等待如图⽚等内容加载,等这些内容完成载⼊ 并且所有异步脚本完成载入和执行,document.readState
变为complete
,window
触发 load
事件。
21、显示⻚⾯(HTML解析过程中会逐步显示页面)
简略流程图如下: