揭開HTTP網絡協(xié)議神秘面紗系列(三)
HTTP首部字段有四種類型:通用首部字段,請求首部字段,響應首部字段,實體首部字段。
通用首部字段:
首部字段 | 說明 |
---|---|
Cache-Control | 控制緩存的行為 |
Connection | 逐跳首部、連接的管理 |
Date | 創(chuàng)建報文的日期時間 |
Pragma | 報文指令 |
Trailer | 報文末端的首部一覽 |
Transfer-Encoding | 指定報文主體的傳輸編碼方式 |
Upgrade | 升級為其他協(xié)議 |
Via | 代理服務器的相關信息 |
Warning | 錯誤通知 |
請求首部字段:
首部字段 | 說明 |
---|---|
Accept | 用戶代理的媒體類型 |
Accept-Charset | 優(yōu)先的字符集 |
Accept-Encoding | 優(yōu)先的內容編碼 |
Accept-Language | 優(yōu)先的語言 |
Authorization | Web認證信息 |
Expect | 期待服務器的特定行為 |
From | 用戶的電子郵件 |
Host | 請求資源所在服務器 |
if-Match | 比較實體標記(ETag) |
if-Modified-Since | 比較資源的更新時間 |
if-None-Match | 比較實體標記(與if-Match相反) |
if-Range | 資源未更新時發(fā)送實體Byte的范圍請求 |
if-Unmodified-Since | 比較資源的更新時間(與if-Modified-Since想法) |
Max-Forwards | 最大傳輸逐跳 |
Proxy-Authorization | 代理服務器要求客戶端的認證信息 |
Range | 實體的字節(jié)范圍請求 |
Refer | 對請求中URI的原始獲取方 |
TE | 傳輸編碼的優(yōu)先級 |
User-Agent | HTTP客戶端的信息 |
響應首部字段:
首部字段 | 說明 |
---|---|
Accept-Ranges | 是否接受字節(jié)范圍請求 |
Age | 推算資源創(chuàng)建經過時間 |
ETag | 資源匹配信息 |
Location | 令客戶端重定向至指定URI |
Proxy-Authenticate | 代理服務器對客戶端的認證信息 |
Retry-After | 對再次發(fā)起請求的時機要求 |
Server | HTTP服務器的安裝信息 |
Vary | 代理服務器緩存的管理信息 |
WWW-Authenticate | 服務器對客戶端的認證信息 |
實體首部字段:
首部字段 | 說明 |
---|---|
Allow | 資源可支持的HTTP方法 |
Content-Encod | 實體主體適用的編碼方式 |
Content-Language | 實體主體的自然語言 |
Content-Length | 實體主體的大小 |
Content-Location | 替代對飲資源的URI |
Content-MD5 | 實體主體的報文摘要 |
Content-Range | 實體主體的位置范圍 |
Content-Type | 實體主體的媒體類型 |
Expires | 實體主體過期的日期時間 |
Last-Modified | 資源的最后修改日期時間 |
#p#
HTTP首部字段將定義成緩存代理和非緩存代理兩種類型:
端到端(End-to-end Header):此類中的首部字段會轉發(fā)給請求/響應對應的最終接受目標,且必須在由緩存生成的響應中,另外規(guī)定它必須被轉發(fā)。
逐跳首部(Hop-by-hop Header):此類中的首部只對單次轉發(fā)有效,會因通過緩存或代理而不再轉發(fā)。如:Connection,Keep-Alive,Upgrade,Proxy-Authenticate,Proxy-Authorization等。
當有多個指令參數時,多個指令之間可通過”,”分隔,例如首部字段Cache-Control:
Cache-Control: private,max-age=0,no-cache
Cache-Control指令一覽:
緩存請求指令:
指令 | 參數 | 說明 |
---|---|---|
no-cache | 無 | 強制向源服務器再次驗證 |
no-store | 無 | 不緩存請求或響應的任何內容 |
max-age=[秒] | 必需 | 響應的最大Age值 |
max-stale=[秒] | 可省略 | 接受已過的響應 |
min-fresh=[秒] | 必需 | 期望在指定時間內的響應仍有效 |
no-transform | 無 | 代理不可更改媒體類型 |
only-if-cache | 無 | 從緩存獲取資源 |
cache-extension | - | 新指令標記 |
緩存響應指令:
指令 | 參數 | 說明 |
---|---|---|
public | 無 | 可向任意方提供響應的緩存 |
private | 可省略 | 僅向特定用戶返回響應 |
no-cache | 可省略 | 緩存前必須先確認其有效性 |
no-store | 無 | 不緩存請求或響應的任何內容 |
no-transform | 無 | 代理不可更改媒體類型 |
msut-revalidate | 無 | 可緩存但必須再向源服務器進行確認 |
proxy-revalidate | 無 | 要求中間緩存服務器對緩存的響應有效性再進行確認 |
max-age=[秒] | 必需 | 響應的最大Age值 |
s-maxage=[秒] | 必需 | 公共緩存服務器響應的最大Age值 |
cache-extension | - | 新指令標記[token] |
Connection首部字段有兩個作用:
控制不再轉發(fā)給代理的首部字段,如:Connection:不再轉發(fā)的首部字段名.
管理持久化連接,HTTP/1.1默認是持久連接,如果想斷開連接,可以用Connection: Close.
首部字段Upgrade用于檢測HTTP協(xié)議及其他協(xié)議是否可使用更高的版本進行通信,其參數值可以用來指定一個完全不同的通信協(xié)議,不過產生對象僅限于客戶端和鄰接服務器之間。
首部字段Warning來告知用戶一些與緩存相關的問題的警告,其格式:Warning:[警告碼][警告的主機:端口號][警告內容]([日期時間])。
警告碼:
警告碼 | 警告內容 | 說明 |
---|---|---|
110 | Response is stale(響應已過期) | 代理返回已過期的資源 |
111 | Revalidation failed(再驗證失?。?/td> | 代理再驗證資源有效性時失敗(服務器無法到達等原因) |
112 | Disconnection operation(斷開連接操作) | 代理與互聯網連接被故意切斷 |
113 | Heuristic expiration(試探性過期) | 響應的使用其超過24小時(有效緩存的設定時間大于24小時的情況下) |
199 | Miscellaneous warning(雜項警告) | 任意的警告內容 |
214 | Transformation applied(使用了轉換) | 代理對內容編碼或媒體類型等執(zhí)行了某些處理時 |
299 | Miscellaneous persistent warning(持久雜項警告) | 任意的警告內容 |
#p#
首部字段Accept可以指定媒體類型以及優(yōu)先級,如:Accept: text/html;q=0.9,text/css;q=0.3.
常見幾種媒體類型:
文件文本:
text/html,text/plain,text/css,application/xhtml+xml,application/xml…
圖片文件:
image/jpeg,image/gif,image/png…
視頻文件:
video/mpeg,video/quicktime…
應用程序使用的二進制文件:
application/octet-stream,application/zip…
若想要給Accept開頭的首部字段的參數增加優(yōu)先級,可以使用q=來額外表示,用分號(;)進行分隔,權重值q的范圍是0~1,默認權重為1,權重越大就越優(yōu)先。
If-Match首部字段它會告知服務器匹配資源所用的實體標記ETag值,只有兩者一致才會執(zhí)行請求,而ETag值會隨服務器資源更新而更新。
If-Modified-Since首部字段指定的日期時間之后,如果請求的資源有更新則接受請求,沒有則返回304狀態(tài)碼。
If-None-Match首部字段指定的標記值若與請求資源的ETag值不一致時,服務器就接受請求。
If-Range首部字段指定的值若是跟ETag值一致時,那么就根據范圍返回請求資源,否則返回全體請求資源(這相當于指定范圍無效)。
If-Unmodified-Since首部字段告知請求資源在其字段指定的值時間之后,為發(fā)生更新的情況下,才能處理請求。
Referer首部字段會告知服務器請求的原始資源的URI,其實就是從某個網站向服務器資源請求的URI,比如:你在百度URIwww.baidu.com點擊鏈接http://blog.csdn.net/xuguoli_beyondboy跳轉到這個頁面,那么Referer首部字段就是指定這個www.baidu.comURI。
Age首部字段告知客戶端,源服務器在多久前創(chuàng)建了響應,單位為秒,但若創(chuàng)建該響應的服務器是緩存服務器,Age就是指緩存后的響應再次發(fā)起認證到認證完成的時間值。
Retry-After首部字段會告知客戶端應該在多久之后再次發(fā)送請求。
Vary首部字段:從代理服務器接收到源服務器返回包含Vary指定項的響應之后,僅對請求中含有相同Vary指定首部字段的請求返回緩存,否則代理服務器需先從源服務器端獲取資源后才能作為響應返回(即使對相同資源發(fā)起請求)。
首部字段WWW-Authenticate用于HTTP訪問認證,它會告知客戶端適用于訪問請求URI所指定資源的認證方案(Basic或Digest)和帶參數提示的質詢。
Content-Loaction首部字段表示的是報文主體返回資源對應的URI。
Content-MD5首部字段在于檢查報文主體在傳輸過程中是否保持完整,以及確認傳輸到達,其過程如下:
服務器對報文主體執(zhí)行MD5算法獲得的128位二進制數,再通過Base64編碼后將結果寫入Content-MD5字段值,為確保報文的有效性,客戶端對報文主體再執(zhí)行一次相同的MD5算法,計算出的值與Content-MD5首部字段的值相比較,即可判斷出報文主體的準確性。
Expires首部字段:如果請求還在Expires字段值指定的時間之前,則會返回緩存的該資源,當超過其時間之后,發(fā)送來的請求將會轉向源服務器請求資源。
Cookie首部字段:
首部字段 | 說明 | 首部類型 |
---|---|---|
Set-Cookie | 開始狀態(tài)管理所使用的Cookie信息 | 響應首部字段 |
Cookie | 服務器接收到的Cookie信息 | 請求首部字段 |
Set-Cookie字段屬性:
屬性 | 說明 |
---|---|
NAME=VALUE | 賦予Cookie的名稱和值(必需項 ) |
expires=DATE | Cookie的有效期(若不明確指定則默認為瀏覽器關閉前為止) |
path=PATH | 將服務器上的文件目錄為Cookie的使用對象(若不指定則默認為文檔所在的文件目錄) |
domain=域名 | 作為Cookie使用對象的域名(若不指定則默認為創(chuàng)建Cookie的服務器的域名) |
Secure | 僅在HTTPS安全通信時才會發(fā)送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript腳本訪問 |
X-Frame-Options首部字段用于控制網站內容在其他Web網站的Frame標簽內的顯示問題,不過目的主要是為了防止點擊劫持攻擊,其兩個屬性:
DENT:拒絕
SAMEORIGN:僅同源域名下的頁面匹配時許可,比如:當指定http:/hackr.jp/sample.html頁面為SAMEORIGN時,那么hackr .jp上所有的頁面的frame都被許可加載該頁面,而example.com等其他域名的頁面就不行了。
X-XSS-Protection首部字段是針對跨站腳本攻擊的一種對策,用于控制瀏覽器XSS防護機制的開關,屬性值如下:
0:將XSS過濾設置成無效狀態(tài)。
1:將XSS過濾設置成有效狀態(tài)。
DNT首部字段用來拒絕個人信息被收集,常表示拒絕被精準廣告追蹤的一種方法,屬性值如下:
0:同意被追蹤
1:拒絕被追蹤
P3P首部字段可用來保護用戶隱私。