1.在浏览器输入URL
2.判断是否有永久重定向(301),如果有则直接跳转到对应URL
3.查询浏览器缓存
3.1 是否有强缓存,强缓存是否过期
3.1.1 强缓存通过两个HTTP请求头进行控制'Expires' 和'Cache-control'
--HTTP1.0提供Expires,值为一个绝对时间表示缓存的有效日期
--HTTP1.1提供Cache-control;max-age=,值为以秒为单位的最大有效时间
3.2 强缓存失效,则转为协商缓存
3.2.1 通过发送资源的if-modified-Since到服务器查询资源是否修改过,未修改则返回304状态码让浏览器取本
地缓存,修改过则返回200状态码及最新资源并更新if-modified-Since的值
3.2.2 特殊的Etag(唯一性的串或者hash值),表示资源内容是否修改过。发送if-none-match查询文件内容(而不是时间)是否改动来决定是否使用缓存
4.浏览器解析URL获取协议、主机、端口、path
5.浏览器组装一个HTTP(TCP)请求报文
6.进行DNS查询
分为两种查询方式
6.1 迭代查询.先查询本地域名服务器依次根域名服务器、本地、顶级域名服务器、本地、权限域名服务器
6.2 递归查询.先查询本地域名服务器依次根域名服务器、顶级域名服务器、权限域名服务器
7.通过DNS查询拿到域名对应IP地址,就可以通过三次握手建立TCP连接了
7.1 客户端发送一个包含SYN=1,seq=x(唯一串,自身数据通讯初始序号)至服务器端口的TCP包,进入SYN-SEND状态
7.2 服务器发出包含SYN=1,ACK = x+1 ,seq=y(唯一串,自身数据通讯初始序号)的响应包,进入SYN-RECEIVED状态
7.3 客户端收到连接同意的应答后,还要向服务端发送确认报文。客户端发完这个报文后进入ESTABLISHED状态,服务端收到确认后也进去ESTABLISHED状态,此时连接成功建立
- 此时客服端可以开始发送HTTP请求,服务端收到请求并解析,此时可能需要检查HTTP请求头是否包含验证缓存验证信息,如有缓存则返回304等状态码。反之处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作。操作完了则将响应报文通过TCP连接发回浏览器
- 浏览器接收HTTP响应,然后根据情况选择关闭TCP连接或者保持重用,关闭连接则需要四次挥手
9.1 第一次挥手:若客户端认为数据发送完成 ,则它需要向服务端发送连接释放请求,标志FIN
9.2 第二次挥手:服务端收到连接释放请求时后,会告诉应用层要释放TCP连接。然后发送ACK包,包含FIN并
进入CLOSE_WAIT状态,表示客户端到服务端的连接已经释放,不接收数据了。但是因为TCP连接是双向
的,所以服务端仍然可以发送数据给客户端。
9.3 第三次挥手:服务端如果此时还有未发送完的数据会继续发送,完毕后会向客户端发送连接释放请求。然
后服务端进入LASE-ACK状态
9.4 客户端收到释放请求后,向服务端发送应答,此时客户端进入TIME_WAIT状态。该状态会持续2MSL(最大
段生存期,指报文在网络中生存的时间,超时会被抛弃)时间,若该时间段内没有服务端的重发请求的话,就进入CLOSED状态。当服务端收到应答后,也进入CLOSED状态
10.浏览器检查响应码,是否为1XX,3XX,4XX,5XX,这些情况处理与200不同
10.1 如果资源可缓存,则进行缓存
10.2 对响应进行解码(如gzip等),然后根据资源类型决定如何处理
10.3 假设为资源为HTML文档,则从上至下开始解析,同时构建DOM树和CSS树,碰到script标签则阻塞,先执行JS代码(渲染引擎与JS引擎互斥),碰到IMG等则开始下载资源。解析完毕将DOM树与CSS树合成渲染树,进行页面的布局及重绘
网友评论