1.浏览器的地址栏输入URL并按下回车。
2.浏览器查找当前URL是否存在缓存,并比较缓存是否过时。
3.DNS解析URL对应的IP。
4.根据IP创建TCP链接(三次握手)。
5.HTTP发起请求。
6.服务器处理请求,浏览器接收HTTP响应。
7.渲染页面,构建DOM树。
8.关闭TCP链接(四次挥手)。css
强制缓存:
cache-control:中的max-age保存一个相对时间。表示浏览器接收到文件以后,缓存在相对应的时间内均有效。若是同时存在cache-control和Expires,浏览器优先使用cache-control
Expires:是一个绝对时间,即服务器时间。浏览器检查当前时间,若是尚未失效就直接用缓存文件。该方法有一个问题,服务器可能和客户端时间不一致,所以该字段不多使用。
对比缓存:
last-modified是第一次请求资源时,服务器返回的字段,表示最后一次更新时间。下次浏览器请求资源时就发送if-modified-since字段。服务器用本地last-modified时间与if-modified-since时间比较,若是不一致则认为缓存已过时并返回新的资源给浏览器,若是时间一致则返回304状态码,让浏览器继续使用缓存。
Etag:资源的实体标识(哈希字符串),当资源内容更新时,Etag会改变。服务器会判断Etag是否变化,若是变化返回新资源,不然返回304。
复制代码
在地址栏输入域名并非最后资源所在的真实位置,域名只是一个IP地址的一个映射。html
1.首先浏览器会先查找本地hosts文件是否有这个网址映射关系,若是有就调用这个IP地址映射,完成域名解析。
2.若是没有找到则会查找本地的DNS解析器缓存,若是找到则返回。
3.若是仍是没有找到则会查找本地DNS服务器,若是找到则返回。
4.最后迭代查询,按根域服务器->顶级域名.cn->第二层域名->子域名的顺序找到IP地址
复制代码
在解析域名以后,获取了服务器的IP地址,开始创建链接,这是由TCP协议完成的,主要经过三次握手进行链接。web
第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
第二层握手:服务器接收到syn包,必须确认客户端的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN_ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP链接成功)状态,完成三次握手。
复制代码
完整的HTTP请求包含请求行,请求头部,请求主体三个部分。(具体就不一一讲述了)
复制代码
服务器在收到浏览器发送的HTTP请求以后,会收到HTTP报文封装成HTTP的Request对象,并经过不一样的web服务器进行处理,处理完的结果以HTTP的Response对象返回,主要包括状态码,响应头,响应报文三个部分。
状态码主要包括如下部分:
1xx:指示信息-表示请求已接收,继续处理
2xx:成功-表示请求已被成功接收,理解,接收
3xx:重定向-要完成请求必须进行更进一步的操做
4xx:客户端错误-请求语法错误或请求没法实现
5xx:服务器端错误:服务器未能合法实现请求
响应头主要由:cache-control、connection、date、pragma等组成。
复制代码
在浏览器还没接收到完整的HTML文件时,它就开始渲染页面了,在遇到外部链入的脚本或图片时,会再次发生HTTP请求重复上述步骤。在收到css文件后对已经渲染的页面从新渲染,加入它们对应的样式,图片文件加载完马上显示在相应的位置。在这一过程当中可能会触发重绘或重排。浏览器
reflow:也称做layout,中文叫回流,通常意味着元素的内容、结构、位置或尺寸发生了变化,须要从新计算样式和渲染树,这个过程称为reflow。
repaint:中文重绘,意味着元素发生的改变只是影响了元素的一些外观之类的时候(例如:背景色,边框颜色,文字颜色等),此时只须要应用新样式绘制这个元素就能够了。
复制代码
经过四次挥手关闭链接(FIN ACK、ACK、FIN ACK、ACK)。缓存
第一次挥手:浏览器发完数据后,发生FIN请求断开链接
第二次挥手:服务器发送ACK表示赞成断开链接
第三次挥手:服务器发送FIN请求断开链接
第四次挥手:浏览器须要返回ACK表示赞成断开
复制代码