1. 瀏覽器的緩存機(jī)制
當(dāng)我們使用Ctrl+F5組合鍵刷新一個(gè)頁(yè)面時(shí)真仲,在HTTP的請(qǐng)求頭中會(huì)增加一些請(qǐng)求頭袋马,
它告訴服務(wù)端我們要獲取最新的數(shù)據(jù)而不是緩存。
1.1 Cache-Control
這個(gè)HTTP Head字段用于指定所有緩存機(jī)制在整個(gè)請(qǐng)求/響應(yīng)鏈中必須服從的指令秸应。
可選值 | 說(shuō)明 |
---|---|
Public | 所有內(nèi)容都將被緩存虑凛,在響應(yīng)頭中設(shè)置 |
Private | 內(nèi)容只緩存到私有緩存中碑宴,在響應(yīng)頭中設(shè)置 |
no-cache | 所有內(nèi)容都不會(huì)被緩存,在請(qǐng)求頭和響應(yīng)頭中設(shè)置 |
no-store | 所有內(nèi)容都不會(huì)被緩存到緩存或Internet臨時(shí)文件中桑谍,在響應(yīng)頭中設(shè)置 |
must-revalidation/proxy-revalidation | 如果緩存的內(nèi)容失敗延柠,請(qǐng)求必須發(fā)送到服務(wù)器/代理以進(jìn)行重新驗(yàn)證,在請(qǐng)求頭中設(shè)置 |
max-age=xxx | 緩存的內(nèi)容將在xxx秒后失效锣披,這個(gè)選項(xiàng)只在HTTP 1.1中可用贞间,和Last-Modified一起使用時(shí)優(yōu)先級(jí)較高,在響應(yīng)頭中設(shè)置 |
Cache-Control請(qǐng)求字段被各個(gè)瀏覽器支持的較好雹仿,而且它的優(yōu)先級(jí)也比較高增热,
它和其他一些請(qǐng)求字段(如Expires)同時(shí)出現(xiàn)時(shí),Cache-Control會(huì)覆蓋掉其他字段胧辽。
1.2 Expires
Expires通常的使用格式是Expires: Sat, 25 Feb 2012 12:22:17 GMT
钓葫,
后面跟著一個(gè)日期和時(shí)間,超過(guò)這個(gè)時(shí)間后票顾,緩存的內(nèi)容將失效础浮。
1.3 Last-Modidified/Etag
Last-Modified字段一般用于表示一個(gè)服務(wù)器上的資源的最后修改時(shí)間,
資源可以是靜態(tài)(靜態(tài)內(nèi)容自動(dòng)加上Last-Modified字段)奠骄,
或者動(dòng)態(tài)的內(nèi)容(如Servlet提供了一個(gè)getLastModified方法豆同,用于檢查某個(gè)動(dòng)態(tài)內(nèi)容是否已經(jīng)更新),
通過(guò)這個(gè)最后修改時(shí)間可以判斷當(dāng)前請(qǐng)求的資源是否是最新的含鳞。
一般服務(wù)器端在響應(yīng)頭中返回一個(gè)Last-Modified子彈影锈,告訴瀏覽器這個(gè)頁(yè)面的最后修改時(shí)間,
如Last-Modified: Sat, 25 Feb 2012 12:55:04 GMT
蝉绷,瀏覽器再次請(qǐng)求時(shí)鸭廷,
在請(qǐng)求頭中增加一個(gè)If-Modified-Since: Sat, 25 Feb 2012 12:55:04 GMT
字段,
詢問(wèn)當(dāng)前緩存的頁(yè)面是否是最新的熔吗,如果是最新的就返回304狀態(tài)碼辆床,告訴瀏覽器是最新的,服務(wù)器也不會(huì)傳輸新的數(shù)據(jù)桅狠。
與Last-Modified字段有類似功能的還有一個(gè)Etag字段讼载,
這個(gè)字段的作用是讓服務(wù)器給每個(gè)頁(yè)面分配一個(gè)唯一的編號(hào),
然后通過(guò)這個(gè)編號(hào)來(lái)區(qū)分當(dāng)前這個(gè)頁(yè)面是否最新的中跌。
這種方式比使用Last-Modified更加靈活咨堤,但是在后端的Web服務(wù)器有多臺(tái)時(shí)比較難處理,
因?yàn)槊總€(gè)Web服務(wù)器都要記住網(wǎng)站的所有資源漩符,
否則瀏覽器返回這個(gè)編號(hào)就沒(méi)有意義了一喘。
參考
深入分析Java Web技術(shù)內(nèi)幕 p9-p12
2. DNS域名解析過(guò)程
當(dāng)一個(gè)用戶在瀏覽器中輸入www.abc.com
時(shí),DNS解析將會(huì)有將近10個(gè)步驟嗜暴,這個(gè)過(guò)程大體描述如下凸克。
2.1 瀏覽器
瀏覽器會(huì)檢查緩存中有沒(méi)有這個(gè)域名對(duì)應(yīng)的解析過(guò)的IP地址铝侵,
如果緩存中有,這個(gè)解析過(guò)程就將結(jié)束触徐。
瀏覽器緩存域名也是有限制的咪鲜,不僅瀏覽器緩存大小有限制,而且緩存的時(shí)間也有限制撞鹉,
通常情況下為幾分鐘到幾小時(shí)不等疟丙,
域名被緩存的時(shí)間限制可以通過(guò)TTL屬性來(lái)設(shè)置。
2.2 操作系統(tǒng)
如果用戶的瀏覽器緩存中沒(méi)有鸟雏,瀏覽器會(huì)查找操作系統(tǒng)緩存中是否有這個(gè)域名對(duì)應(yīng)的DNS解析結(jié)果享郊。
其實(shí)操作系統(tǒng)也會(huì)有一個(gè)域名解析的過(guò)程,
在Windows中可以通過(guò)C:\Windows\System32\drivers\etc\hosts
文件來(lái)設(shè)置孝鹊,
你可以將任何域名解析到任何能夠訪問(wèn)的IP地址炊琉。
在Linux中這個(gè)配置文件是/etc/hosts
,
當(dāng)解析到這個(gè)配置文件中的某個(gè)域名時(shí)又活,操作系統(tǒng)會(huì)在緩存中緩存這個(gè)解析結(jié)果苔咪,
緩存的時(shí)間同樣是受這個(gè)域名的失效時(shí)間和緩存的空間大小控制的。
2.3 本地區(qū)的域名服務(wù)器
如果在本機(jī)中仍然無(wú)法完成域名的解析柳骄,就會(huì)真正請(qǐng)求域名服務(wù)器來(lái)解析這個(gè)域名了团赏。
在我們的網(wǎng)絡(luò)配置中都會(huì)有“DNS服務(wù)器地址”這一項(xiàng),
操作系統(tǒng)會(huì)把這個(gè)域名設(shè)置為本地區(qū)的域名服務(wù)器(LNDS)耐薯。
這個(gè)DNS通常都提供給你本地互聯(lián)網(wǎng)接入的一個(gè)DNS解析服務(wù)舔清,
例如,你是在學(xué)校接入互聯(lián)網(wǎng)曲初,那么你的DNS服務(wù)器肯定在你的學(xué)校体谒,
如果你是在一個(gè)小區(qū)接入互聯(lián)網(wǎng),那這個(gè)DNS就是提供給你接入互聯(lián)網(wǎng)的應(yīng)用提供商臼婆,即電信或者聯(lián)通抒痒。
這個(gè)專門的域名解析服務(wù)器性能都會(huì)很好,它們一般都會(huì)緩存域名解析結(jié)果目锭,
當(dāng)然緩存時(shí)間是受域名的失效時(shí)間控制的评汰。
2.4 Root Server域名服務(wù)器
如果LDNS仍然沒(méi)有命中纷捞,就直接到Root Server域名服務(wù)器請(qǐng)求解析痢虹。
2.5 返回主域名服務(wù)器地址
根域名服務(wù)器返回給本地域名服務(wù)器一個(gè)所查詢的主域名服務(wù)器(gTLD Server)地址。
gTLD是國(guó)際頂級(jí)域名服務(wù)器主儡,如.com
奖唯,.cn
,.org
等糜值,全球只有13臺(tái)左右丰捷。
2.6 向主域名服務(wù)器發(fā)送請(qǐng)求
本地域名服務(wù)器(Local DNS Server)再向上一步返回的gTLD服務(wù)器發(fā)送請(qǐng)求坯墨。
2.7 域名提供商的服務(wù)器
接受請(qǐng)求的gTLD服務(wù)器查找并返回此域名對(duì)應(yīng)的Name Server域名服務(wù)器的地址,
這個(gè)Name Server通常就是你注冊(cè)的域名服務(wù)器病往。
例如捣染,你在某個(gè)域名服務(wù)器提供商申請(qǐng)的域名,那么這個(gè)域名解析任務(wù)就由這個(gè)域名提供商的服務(wù)器來(lái)完成停巷。
2.8 映射關(guān)系表
Name Server域名服務(wù)器會(huì)查詢存儲(chǔ)在域名和IP的映射關(guān)系表耍攘,
在正常情況下會(huì)根據(jù)域名得到目標(biāo)IP記錄,連同一個(gè)TTL值返回給DNS Server域名服務(wù)器畔勤。
2.9 Local DNS Server緩存
返回該域名對(duì)應(yīng)的IP和TTL值蕾各,Local DNS Server會(huì)緩存這個(gè)域名和IP的對(duì)應(yīng)關(guān)系,
緩存的時(shí)間由TTL值控制庆揪。
2.10 本地系統(tǒng)緩存
把解析的結(jié)果返回給用戶式曲,用戶根據(jù)TTL值緩存在本地系統(tǒng)緩存中,域名解析過(guò)程結(jié)束缸榛。
注:
在實(shí)際的DNS解析過(guò)程中吝羞,可能還不止這10個(gè)步驟,
如Name Server也可能有很多級(jí)内颗,或者有一個(gè)GTM來(lái)負(fù)載均衡控制脆贵,
這都有可能會(huì)影響域名解析的過(guò)程。
參考
深入分析Java Web技術(shù)內(nèi)幕 p12-p15
3. 幾種域名解析方式
域名解析記錄主要分為A記錄起暮,MX記錄卖氨,CNAME記錄,NS記錄负懦,和TXT記錄筒捺。
3.1 A記錄
A代表Address,用來(lái)指定域名對(duì)應(yīng)的IP地址纸厉,
A記錄可以將多個(gè)域名解析到一個(gè)IP地址系吭,但是不能將一個(gè)域名解析到多個(gè)IP地址。
3.2 MX記錄
MX表示Mail Exchange颗品,就是可以將某個(gè)域名下的郵件服務(wù)器指向自己的Mail Server肯尺,
DNS會(huì)將郵件發(fā)送到MX記錄的服務(wù)器,而正常通過(guò)Web請(qǐng)求的話躯枢,仍然解析到A記錄的IP地址则吟。
3.3 CNAME記錄
CNAME全稱為Canonial Name(別名解析)。
所謂別名解析就是可以為一個(gè)域名設(shè)置一個(gè)或者多個(gè)別名锄蹂。
3.4 NS記錄
NS記錄氓仲,為某個(gè)域名指定DNS解析服務(wù)器,也就是這個(gè)域名由指定的IP地址的DNS服務(wù)器去解析。
3.5 TXT記錄
為某個(gè)主機(jī)名或域名設(shè)置說(shuō)明敬扛。
參考
深入分析Java Web技術(shù)內(nèi)幕 p19-p20
4. CDN工作機(jī)制
CDN也就是內(nèi)容分布網(wǎng)絡(luò)(Content Delivery Network)晰洒,它是構(gòu)筑在現(xiàn)有Internet上的一種先進(jìn)的流量分配網(wǎng)絡(luò)。
其目的是通過(guò)在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu)啥箭,
將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)“邊緣”谍珊,使用戶可以就近取得所需的內(nèi)容,
提高用戶訪問(wèn)網(wǎng)站的響應(yīng)速度急侥。
目前CDN都以緩存網(wǎng)站中的靜態(tài)數(shù)據(jù)為主抬驴,如CSS,JS缆巧,圖片和靜態(tài)頁(yè)面等數(shù)據(jù)布持。
用戶在先從主站服務(wù)器請(qǐng)求到動(dòng)態(tài)內(nèi)容后,再?gòu)腃DN上下載這些靜態(tài)資源陕悬,從而加速網(wǎng)頁(yè)數(shù)據(jù)內(nèi)容的下載速度题暖。
CDN架構(gòu)
一個(gè)用戶訪問(wèn)某個(gè)靜態(tài)文件(如CSS文件),這個(gè)靜態(tài)文件的域名假如是cdn.taobao.com
捉超,
那么首先要向Local DNS服務(wù)器發(fā)起請(qǐng)求胧卤,
一般經(jīng)過(guò)迭代解析后回到這個(gè)域名的注冊(cè)服務(wù)器去解析,一般每個(gè)公司都會(huì)有一個(gè)DNS解析服務(wù)器拼岳。
這時(shí)這個(gè)DNS解析服務(wù)器通常會(huì)把它重新CNAME解析到另一個(gè)另外一個(gè)域名枝誊,
而這個(gè)域名最終會(huì)被指向CDN全局中的DNS負(fù)載均衡服務(wù)器,再由這個(gè)GTM來(lái)最終分配是哪個(gè)地方的訪問(wèn)用戶惜纸,
返回給離這個(gè)訪問(wèn)用戶最近的CDN節(jié)點(diǎn)叶撒。
拿到DNS解析結(jié)果,用戶就直接去這個(gè)CDN節(jié)點(diǎn)訪問(wèn)這個(gè)靜態(tài)資源文件了耐版,
如果這個(gè)節(jié)點(diǎn)中所請(qǐng)求的文件不存在祠够,就會(huì)再回到源站去獲取這個(gè)文件,然后再返回給用戶粪牲。