https://juejin.im/post/6844903665631756295

浏览器缓存机制


如果浏览器中有了缓存数据,浏览器再次向目标URL发送请求时,在数据不过期的情况下,会直接使用浏览器缓存的数据而不需要向服务端请求。

浏览器和服务端的通信方式是应答方式——浏览器发起HTTP请求 - 服务器响应请求**
浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中的HTTP头的
缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存**。
一个URL请求的过程 - 图1

  • 浏览器每次发起请求,都会先在浏览器缓存中查询该请求结果和缓存标识
  • 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存

我们根据是否需要向服务器重新发起HTTP请求将缓存结果分为两个部分,分别是强制缓存(也叫本地缓存)和协商缓存,当然这只是两种叫法,有些人把缓存分为Expires/Cache-controlLast-Modifed/Etag这两种表现,本质上是一样的。

强制缓存/本地缓存

强制缓存就是向浏览器缓存查找缓存结果和缓存标识,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。强制缓存又分为以下几个方面:

  • 不存在该缓存结果和缓存标识,强制缓存失败,则直接向服务器再一次发送请求

一个URL请求的过程 - 图2

  • 存在请求结果和缓存标识,但是该结果已失效过期,强制缓存失败,则使用协商缓存(后续分析)

一个URL请求的过程 - 图3

  • 存在请求结果和缓存标识,而且结果未过期,强制缓存生效,直接返回结果

一个URL请求的过程 - 图4

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否继续使用缓存的过程。主要分为以下两种情况:

  • 缓存生效,返回304

一个URL请求的过程 - 图5
注: 304状态码表示客户端发送附带条件 (附带条件包括If-Match,If-Modified-Since,If-None-Match等字段) 的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。

  • 协商缓存失败,返回200和请求结果

一个URL请求的过程 - 图6

浏览器缓存

  • 内存缓存:快速读取、**时效性(进程关闭则清空)**
  • 硬盘缓存:读取慢、长期性
  • 使用F5,浏览器将绕过本地缓存(强制缓存),但是协商缓存还是有效的
  • 使用Ctrl + F5 强制刷新,浏览器将绕过 本地缓存和协商缓存,让服务器返回最新的资源

    DNS域名解析


互联网都是通过URL来发布和请求资源的,而URL中的域名需要解析成IP地址才能与远程主机建立连接,如何将域名解析成IP地址就属于DNS解析的工作范畴。

DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是将主机名和域名转换为IP地址的工作

分层式DNS域名服务器

  • 根域名服务器

    根域名服务器是最高层次的域名服务器也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。

  • 顶级域名服务器(TLD服务器)

    这些域名服务器负载管理在该顶级域名服务器注册的所有二级域名

  • 权威域名服务器

  • 本地域名服务器

    实际本地域名服务器不属于域名服务器的层次结构,但是他对于域名系统非常重要,当一台主机发出DNS查询请求时,这个查询请求报文首先是发送给本地域名服务器。每个ISP都有一个本地域名服务器

DNS域名解析过程

  1. 检查浏览器缓存中是否有这个域名对应的解析过的IP地址,没有转入下一步
  2. 检查系统缓存中是否有这个域名对应的解析结果,没有转入下一步
  3. 向本地服务器查询(LDNS),没有转入下一步
  4. root server域名服务器请求,,没有转入下一步
  5. 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址
  6. 本地域名服务器再向上一步返回的gTLD服务器发送请求
  7. 接受请求的顶级域名服务器查询并返回此域名对应的权威服务器(Name Server)
  8. 权威服务器会查询存储的域名和IP的映射关系表并返回

    DNS域名解析过程中的查询方式

  • 递归查询

    主机向本地域名服务器的查询一般都是采用递归查询> ,所为递归查询就是:如果主机所访问的本地域名服务器不知道被查询域名的IP地址,那么本地域名就以DNS客户的身份,替代主机,向其他根域名服务器继续发出查询请求报文,而不是让主机自己进行下一步的查询。

  • 迭代查询

    本地域名服务器向根域名服务器的查询通常是采用迭代查询。迭代查询就是:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个域名服务器查询,然后让本地域名服务器进行后续的查询。

DNS缓存

DNS域名解析过程后会缓存解析结果,其中主要在里昂个地方缓存结果,一个是本地域名服务器,一个是用户的本地机器。缓存都是TTL值和本机缓存大小控制。
一个URL请求的过程 - 图7

TCP连接


HTTP请求与响应

浏览器与服务器建立TCP连接以后,然后就可以发起HTTP请求了,客户端按照指定格式开始向服务器发送HTTP请求,服务端接受请求后,解析HTTP请求,处理完业务逻辑,返回一个HTTP响应给客户端,

HTTP的请求报文与响应报文

HTTP的请求报文与响应报文结构一样,都是分为报文首部和报文主体部分,请求报文中的主体部分主要发送给服务端的数据,而响应报文中的主体则是客户端需要的响应数据
一个URL请求的过程 - 图8
而请求报文和响应报文的首部内容又由以下内容组成:

  • 请求行:包含用于请求的方法,请求URI和HTTP版本
  • 状态行: 包含表明响应结果的状态码,原因短语和HTTP版本
  • 首部字段: 包含表示请求和响应的各种条件和属性的各类首部。
  • 其他: 包含HTTP的RFC里未定义的首部(Cookie)等

总结 Web请求

浏览器缓存 —> DNS域名解析 —> TCP连接 —> HTTP请求与响应
事件顺序:
(1) 浏览器获取输入的域名www.baidu.com
(2) 浏览器向DNS请求解析www.baidu.comIP地址浏览器缓存
(3) 域名系统DNS解析出百度服务器的IP地址 (详细介绍DNS)-通过网关出去
(4) 浏览器与该服务器建立TCP连接(默认端口号80)
(5) 浏览器发出HTTP请求,请求百度首页
(6) 服务器通过HTTP响应把首页文件发送给浏览器
(7) TCP连接释放
(8) 浏览器将首页文件进行解析,并将Web页显示给用户。
简单理解:
域名解析 —> 发起TCP的3次握手 —> 建立TCP连接后发起http请求 —> 服务器响应http请求,浏览器得到html代码
—> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) —> 浏览器对页面进行渲染呈现给用户。
涉及到的协议:
(1) 应用层:HTTP(WWW访问协议),DNS(域名解析服务)
DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话,然后通过运输层TCP协议封装数据包,在TCP协议基础上进行传输。
(2) 传输层:TCP(为HTTP提供可靠的数据传输),UDP(DNS使用UDP传输),HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作。
(3)网络层:IP(IP数据数据包传输和路由选择),ICMP(提供网络传输过程中的差错检测),ARP(将本机的默认网关IP地址映射成物理MAC地址)为数据包选择路由,IP协议进行主要工作,相邻结点的可靠传输,ARP协议将IP地址转成MAC地址。