一文带你了解什么是浏览器缓存,DNS,CDN及域名解析类型
浏览器的缓存机制
当我们使用ctrl+f5组合键刷新一个页面时,在http的请求头中会增加一些请求头,
它告诉服务端我们要获取最新的数据而不是缓存。
cache-control
这个http head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。
可选值 | 说明 |
---|---|
public | 所有内容都将被缓存,在响应头中设置 |
private | 内容只缓存到私有缓存中,在响应头中设置 |
no-cache | 所有内容都不会被缓存,在请求头和响应头中设置 |
no-store | 所有内容都不会被缓存到缓存或internet临时文件中,在响应头中设置 |
must-revalidation/proxy-revalidation | 如果缓存的内容失败,请求必须发送到服务器/代理以进行重新验证,在请求头中设置 |
max-age=xxx | 缓存的内容将在xxx秒后失效,这个选项只在http 1.1中可用,和last-modified一起使用时优先级较高,在响应头中设置 |
cache-control请求字段被各个浏览器支持的较好,而且它的优先级也比较高,
它和其他一些请求字段(如expires)同时出现时,cache-control会覆盖掉其他字段。
expires
expires通常的使用格式是expires: sat, 25 feb 2012 12:22:17 gmt
,
后面跟着一个日期和时间,超过这个时间后,缓存的内容将失效。
last-modidified/etag
last-modified字段一般用于表示一个服务器上的资源的最后修改时间,
资源可以是静态(静态内容自动加上last-modified字段),
或者动态的内容(如servlet提供了一个getlastmodified方法,用于检查某个动态内容是否已经更新),
通过这个最后修改时间可以判断当前请求的资源是否是最新的。
一般服务器端在响应头中返回一个last-modified子弹,告诉浏览器这个页面的最后修改时间,
如last-modified: sat, 25 feb 2012 12:55:04 gmt
,浏览器再次请求时,
在请求头中增加一个if-modified-since: sat, 25 feb 2012 12:55:04 gmt
字段,
询问当前缓存的页面是否是最新的,如果是最新的就返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据。
与last-modified字段有类似功能的还有一个etag字段,
这个字段的作用是让服务器给每个页面分配一个唯一的编号,
然后通过这个编号来区分当前这个页面是否最新的。
这种方式比使用last-modified更加灵活,但是在后端的web服务器有多台时比较难处理,
因为每个web服务器都要记住网站的所有资源,
否则浏览器返回这个编号就没有意义了。
dns域名解析过程
当一个用户在浏览器中输入www.jb51.net
时,dns解析将会有将近10个步骤,这个过程大体描述如下。
浏览器
浏览器会检查缓存中有没有这个域名对应的解析过的ip地址,
如果缓存中有,这个解析过程就将结束。
浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,
通常情况下为几分钟到几小时不等,
域名被缓存的时间限制可以通过ttl属性来设置。
操作系统
如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的dns解析结果。
其实操作系统也会有一个域名解析的过程,
在windows中可以通过c:\windows\system32\drivers\etc\hosts
文件来设置,
你可以将任何域名解析到任何能够访问的ip地址。
在linux中这个配置文件是/etc/hosts
,
当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,
缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。
本地区的域名服务器
如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
在我们的网络配置中都会有“dns服务器地址”这一项,
操作系统会把这个域名设置为本地区的域名服务器(lnds)。
这个dns通常都提供给你本地互联网接入的一个dns解析服务,
例如,你是在学校接入互联网,那么你的dns服务器肯定在你的学校,
如果你是在一个小区接入互联网,那这个dns就是提供给你接入互联网的应用提供商,即电信或者联通。
这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,
当然缓存时间是受域名的失效时间控制的。
root server域名服务器
如果ldns仍然没有命中,就直接到root server域名服务器请求解析。
返回主域名服务器地址
根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gtld server)地址。
gtld是国际*域名服务器,如.com
,.cn
,.org
等,全球只有13台左右。
向主域名服务器发送请求
本地域名服务器(local dns server)再向上一步返回的gtld服务器发送请求。
域名提供商的服务器
接受请求的gtld服务器查找并返回此域名对应的name server域名服务器的地址,
这个name server通常就是你注册的域名服务器。
例如,你在某个域名服务器提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
映射关系表
name server域名服务器会查询存储在域名和ip的映射关系表,
在正常情况下会根据域名得到目标ip记录,连同一个ttl值返回给dns server域名服务器。
local dns server缓存
返回该域名对应的ip和ttl值,local dns server会缓存这个域名和ip的对应关系,
缓存的时间由ttl值控制。
本地系统缓存
把解析的结果返回给用户,用户根据ttl值缓存在本地系统缓存中,域名解析过程结束。
注:在实际的dns解析过程中,可能还不止这10个步骤,
如name server也可能有很多级,或者有一个gtm来负载均衡控制,
这都有可能会影响域名解析的过程。
几种域名解析方式
域名解析记录主要分为a记录,mx记录,cname记录,ns记录,和txt记录。
a记录
a代表address,用来指定域名对应的ip地址,
a记录可以将多个域名解析到一个ip地址,但是不能将一个域名解析到多个ip地址。
mx记录
mx表示mail exchange,就是可以将某个域名下的邮件服务器指向自己的mail server,
dns会将邮件发送到mx记录的服务器,而正常通过web请求的话,仍然解析到a记录的ip地址。
cname记录
cname全称为canonial name(别名解析)。
所谓别名解析就是可以为一个域名设置一个或者多个别名。
ns记录
ns记录,为某个域名指定dns解析服务器,也就是这个域名由指定的ip地址的dns服务器去解析。
txt记录
为某个主机名或域名设置说明。
cdn工作机制
cdn也就是内容分布网络(content delivery network),它是构筑在现有internet上的一种先进的流量分配网络。
其目的是通过在现有的internet中增加一层新的网络架构,
将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,
提高用户访问网站的响应速度。
目前cdn都以缓存网站中的静态数据为主,如css,js,图片和静态页面等数据。
用户在先从主站服务器请求到动态内容后,再从cdn上下载这些静态资源,从而加速网页数据内容的下载速度。
cdn架构
一个用户访问某个静态文件(如css文件),这个静态文件的域名假如是cdn.jb51.net
,
那么首先要向local dns服务器发起请求,
一般经过迭代解析后回到这个域名的注册服务器去解析,一般每个公司都会有一个dns解析服务器。
这时这个dns解析服务器通常会把它重新cname解析到另一个另外一个域名,
而这个域名最终会被指向cdn全局中的dns负载均衡服务器,再由这个gtm来最终分配是哪个地方的访问用户,
返回给离这个访问用户最近的cdn节点。
拿到dns解析结果,用户就直接去这个cdn节点访问这个静态资源文件了,
如果这个节点中所请求的文件不存在,就会再回到源站去获取这个文件,然后再返回给用户。
本文介绍的内容作为一名站长来说是必须要知道的知识,更多关于这方面的知识请查看下面的相关链接