在浏览器地址栏键入URL按下回车之后主要会经历以下7个步骤
1.查找浏览器缓存:如果查找到缓存中有我们URL对应的文件,则判断是否命中强缓存,如果命中直接读取使用即可,如果强缓存没有命中,
判断协商缓存是否命中,但协商缓存不论是否命中都会发送请求,所以都会走下面的步骤
2.DNS域名解析:将输入的URL解析成对应的IP地址
3.生成HTTP请求报文:请求报文包括起始行,首部,主体
4.TCP连接:客户端与服务端进行TCP三次握手,建立连接
5.发送HTTP请求:握手成功后,客户端向服务端发送http请求,请求数据
6.服务器收到请求并返回数据:客户端根据返回的结果进行渲染展示,同时判断是否需要将文件存入缓存
7.TCP断开连接:客户端与服务端进行TCP四次挥手,断开连接
每个步骤具体做了什么事情呢?
1.查找浏览器缓存
如果是第一次请求肯定在缓存找不到文件啦(先在memory cache也就是内存中找,再在disk cache也就是磁盘中找),那之后的请求为什么能找到呢
因为第一次请求时如果服务器端在对应的请求接口中设置了响应头里的Cache-Control:max-age或者Expires,Last-Modified(最后修改时间) 或者etag
(其实就是一个比文件最后修改时间判断是否修改更精确的一个标识,通常会用文件的md5值),浏览器第一次请求到之后就会将文件及这些信息缓存下来,
再次请求的时候就会先判断max-age有没有过期(没有max-age就找Expires,两者同时存在前者优先级更高),如果没有过期,则强缓存命中,
返回200(from disk cache或者from memory cache);如果已经过期,则会发起一个请求,请求头中带上If-None-Match(值就是上一次服务器返回的
Last-Modified ),去比对服务器中要请求的文件的etag或者last-modified(注意如果两者同时存在,前者的优先级会更高),判断文件到底有没有修改,
如果没有修改,则使用本地缓存的就好了,返回304(from disk cache或者from memory cache),如果修改过了,再从服务器中重新请求,
并修改etag或者last-modified。返回200。
2.DNS域名解析
2.1首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表;
2.2若没有命中,则继续搜索操作系统的 DNS 缓存;
2.3若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,
查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式是递归查询);
2.4若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行迭代查询
(注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):
首先本地域名服务器向根域名服务器发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,
而是返回顶级域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案
本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址,
本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
2.5本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
2.6操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
2.7至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
3-7 参考http的工作流程