參考資料:
劉望舒的blog
玉剛說
cache-control
木上有水的blog
一炊邦、Http的特性
1.靈活的
可以通過Content-Type和Content-Length傳輸任意類型的數(shù)據(jù)
2.無連接的
一次只完成一個請求羽嫡,服務(wù)端處理完請求后會立即斷開鏈接
3.無狀態(tài)的
Http協(xié)議不會記錄上一次連接的狀態(tài)鞭铆,如果想知道上一個連接的狀態(tài)只能再次發(fā)起請求缤苫。
當(dāng)然可以通過cookie和session來保存上一次連接的信息
二诵叁、URL的請求格式
http://host:port abs_path
host:指主機號
port:端口號,默認(rèn)是80端口
abs_path:請求資源的url
三业栅、報文格式
請求報文的格式通常是請求行,請求報頭歉铝,請求體盈简,請求數(shù)據(jù)
響應(yīng)報文不同的是會攜帶協(xié)議版本,響應(yīng)狀態(tài)碼太示,響應(yīng)的錯誤原因
通用報頭
既可以出現(xiàn)在請求報頭柠贤,也可以出現(xiàn)在響應(yīng)報頭中
- Date:表示消息產(chǎn)生的日期和時間
- Connection:允許發(fā)送指定連接的選項,例如指定連接是連續(xù)的类缤,或者指定“close”選項臼勉,通知服務(wù)器,在響應(yīng)完成后餐弱,關(guān)閉連接
- Cache-Control:用于指定緩存指令宴霸,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請求中未必會出現(xiàn)),且是獨立的(一個消息的緩存指令不會影響另一個消息處理的緩存機制)
請求報頭
請求報頭通知服務(wù)器關(guān)于客戶端求求的信息膏蚓,典型的請求頭有:
- Host:請求的主機名瓢谢,允許多個域名同處一個IP地址,即虛擬主機
- User-Agent:發(fā)送請求的瀏覽器類型驮瞧、操作系統(tǒng)等信息
- Accept:客戶端可識別的內(nèi)容類型列表氓扛,用于指定客戶端接收那些類型的信息
- Accept-Encoding:客戶端可識別的數(shù)據(jù)編碼
- Accept-Language:表示瀏覽器所支持的語言類型
- Connection:允許客戶端和服務(wù)器指定與請求/響應(yīng)連接有關(guān)的選項,例如這是為Keep-Alive則表示保持連接论笔。
- Transfer-Encoding:告知接收端為了保證報文的可靠傳輸采郎,對報文采用了什么編碼方式千所。
響應(yīng)報頭
用于服務(wù)器傳遞自身信息的響應(yīng),常見的響應(yīng)報頭:
- Location:用于重定向接受者到一個新的位置蒜埋,常用在更換域名的時候
- Server:包含可服務(wù)器用來處理請求的系統(tǒng)信息真慢,與User-Agent請求報頭是相對應(yīng)的
實體報頭
實體報頭用來定于被傳送資源的信息,既可以用于請求也可用于響應(yīng)理茎。請求和響應(yīng)消息都可以傳送一個實體,常見的實體報頭為:
- Content-Type:發(fā)送給接收者的實體正文的媒體類型
- Content-Lenght:實體正文的長度
- Content-Language:描述資源所用的自然語言管嬉,沒有設(shè)置則該選項則認(rèn)為實體內(nèi)容將提供給所有的語言閱讀
- Content-Encoding:實體報頭被用作媒體類型的修飾符皂林,它的值指示了已經(jīng)被應(yīng)用到實體正文的附加內(nèi)容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型蚯撩,必須采用相應(yīng)的解碼機制础倍。
- Last-Modified:實體報頭用于指示資源的最后修改日期和時間
- Expires:實體報頭給出響應(yīng)過期的日期和時間
四、Http緩存
我們請求服務(wù)器資源成功后胎挎,可以將請求的資源緩存在本地沟启,當(dāng)下次再使用時,可以使用本地的緩存犹菇,這樣既節(jié)省了帶寬又節(jié)省了時間德迹。但是在使用本地緩存時首先有幾個步驟
1. 新鮮度的檢測
當(dāng)我們想要使用本地緩存時,首先會向服務(wù)器驗證資源是否過期揭芍。這個是通過Cache-Control(Http1.1)或者是Expire(Http1.0)來判斷的胳搞。再第一次請求下數(shù)據(jù)時,服務(wù)器會對響應(yīng)體追加Cache-Control:max-age称杨,它表示這個緩存最多緩存多長時間肌毅。超過了這個時間需要向服務(wù)器驗證請求的新鮮度。要結(jié)合last-modifed的時間:表示從上一次修改的時間+最大緩存時間表示它過期的時間
private 表示只對當(dāng)前用戶緩存
public 對所有用戶緩存
no-cache:強制所有用戶在使用緩存前需要向服務(wù)器再驗證
only-if-cached:如果緩存存在姑原,只使用緩存
2. 驗證
如果已經(jīng)超過了緩存時間悬而,那么需要向服務(wù)器進(jìn)行驗證。如果驗證通過可以使用本地緩存锭汛,服務(wù)端會響應(yīng)304笨奠。,如果沒有通過唤殴,服務(wù)器返回200艰躺,將最新的數(shù)據(jù)返回給客戶端,驗證的方式有:
If-Modified-Since
If-None-Match
If-Unmodified-Since
If-Range
If-Match
1.If-Modified-Since
將我們緩存的last-modifed時間取出來眨八,并添加到If-Modified-Since中傳遞給服務(wù)器腺兴。告訴服務(wù)器我們緩存數(shù)據(jù)的這段時間,數(shù)據(jù)是否有更改廉侧。
2.If-None-Match和Etag
在首次請求一個url時页响,服務(wù)器會返回一個Etag標(biāo)志篓足,表示這個數(shù)據(jù)的版本,再下一次請求這個url時闰蚕,我們會將這個Etag的值放到If-None-Match中栈拖,然后服務(wù)器會取出這個值和服務(wù)器緩存的值是否一致,如果一致代表緩存沒有過期没陡。
四涩哟、實例:
模擬刷新了一個網(wǎng)頁,可以看到瀏覽器類型是:Chrom 系統(tǒng)是Window盼玄。
請求類型是get贴彼,上一次修改的時間和服務(wù)器返回的修改時間一致,所以返回的是304埃儿,使用本地緩存器仗。