一、什么是web缓存器
web缓存器,又叫代理服务器,往往作为客户端(浏览器)和服务器之间的“中间人”。web缓存器有自己的磁盘,并会在其中缓存最近请求过的资源。
可以将浏览器和web缓存器进行配置,配置后浏览器发送请求时会先发送到web缓存器,如果web缓存器中有请求需要的资源则直接返回;如果没有,web缓存器会和服务器建立TCP连接,并代理浏览器向其发送请求,然后将结果缓存在本地后,返回给浏览器。
web缓存器往往由ISP购买并安装。
为什么要使用web缓存器呢?
当客户端距离服务器较远,特别是客户端与服务器之间的瓶颈带宽低于客户端与web缓存器之间的瓶颈带宽时,web缓存器可以大大降低响应时间。通过web缓存器,可以大大减少机构接入到网络中的通信量,这样就不必急于增加带宽,从而降低了费用。而web缓存器的成本往往是很低的,因为其使用了运行在廉价PC上的公共域软件。
二、web缓存器带来的问题
既然是缓存,就肯定会有数据不一致的问题。
看这样一种情况:当浏览器发出请求时,web缓存器收到请求并将其缓存的资源发送给浏览器,可这个资源是最新的还是已经被修改了的呢?我们无从得知。
为了解决这个问题,HTTP协议提供了一种机制,来让web缓存器证实他的对象是最新的。这种机制就是条件GET方法。一个请求报文是一个条件GET请求报文需要达到以下两个要求:
- 请求报文使用GET方法。
- 请求报文中包含“If-Modified-Since:”的首部行。
接下来通过一个实际例子来看看以上机制是如何实现的。
1.web缓存器代表浏览器向服务器发送一个请求报文:
2.服务器向web缓存器发送响应报文(对象)如下:
Last-Modified表示最后修改日期。
3.过了一段时间,另一个用户也要请求同一个对象时,web缓存器会向服务器发送一个条件GET请求报文判断当前数据是不是最新的:
该条件报文告诉服务器,如果该对象在指定日期后被修改过,则重新发送该对象。否则执行第4步
4.服务器向web缓存器发送一个响应报文:
注意数据部分是空的!
在该响应报文中,状态码为304 Not Modified,意味着服务器告诉web缓存器可以使用该对象,并向请求的浏览器转发web缓存器缓存的对象副本!
三、CDN
1.什么是CDN?
CDN,也叫内容分发网络,是服务商依靠部署在各地的边缘服务器节点,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取资源,提高用户访问速度。
简单点来说就是,通过CDN服务器,可以加快服务器对用户请求的响应速度。
举个例子,某个网站的服务器在北京,现在有深圳的用户想要访问网站,那么由于距离、传输速度、路由转发等原因,会导致访问十分缓慢。但假如现在在深圳建立一个CDN服务器,上面缓存了一些源站服务器(北京的服务器)上的资源,那么深圳的用户只用访问该CDN服务器就可以获取相关资源,而不必再去请求源站服务器。这样不仅减轻了源站服务器的压力,也提高了对用户请求的响应速度。
这里就不难看出CDN和web缓存器的关系了,CDN其实是web缓存器的一种。
2.CDN是如何工作的?
作为普通用户,我们只管发送请求,可不管从哪里获取数据。那么服务器是如何将我们的请求定位到距离我们最近的CDN服务器呢?这就需要用到DNS了。
当我们访问网站时,需要通过DNS服务器对网站的域名进行解析,而网站的服务器就会对我们使用的DNS服务器的ip地址进行定位,从而为我们分配最佳的CDN节点。但是这样会出现一个问题,如果用户的ip地址所在地和DNS的ip地址所在地不一致怎么办(对于访问的DNS服务器可以自行配置)?这就会产生错误的调度。
针对这个问题,有另一种解决的办法就是http调度,它是这样实现的:
当用户访问服务器时,先对用户的ip地址进行分析,然后服务器给用户返回一个302状态码(表示临时重定向),于是浏览器会重定向到最佳CDN节点进行资源的访问。
3.CDN存在的问题?
既然CDN服务器也是缓存的一种,那么当源服务器更新数据之后,如何将数据同步到CDN节点呢?有以下两种方式:
(1)源服务器上的数据更新后,主动对CDN节点的缓存进行更新,CDN节点被动接收。但是这样会很容易产生404(请求的资源未找到),所以往往采用第二种方法。
(2)只有当用户请求的资源不存在时,CDN会向源服务器发送请求,将请求到的数据更新到缓存中,然后将数据返回给用户。