HTTP封包首部
HTTP協定的請求和響應封包中必定包含HTTP首部。首部内容為用戶端和伺服器分别處理請求和響應提供所需要的資訊。
HTTP請求封包
在請求中,HTTP封包首部由以下幾部分構成:
- 請求行:方法、URI、HTTP版本
- HTTP首部字段:
- 請求首部字段
- 通用首部字段
- 實體首部字段
HTTP響應封包
在響應中,HTTP封包首部由以下幾個部分構成:
- 狀态行:HTTP版本、狀态碼
- HTTP首部字段
- 響應首部字段
- 通用首部字段
- 實體首部字段
首部字段同時存在與請求和響應封包内,并涵蓋HTTP封包相關的内容資訊。
HTTP首部字段
HTTP首部字段是由首部字段名和字段值構成的,中間用冒号分隔。
HTTP首部字段根據實際用途被分為以下4種類型:
-
通用首部字段
請求封包和響應封包兩方都會使用的首部
-
請求首部字段
從用戶端向伺服器端發送請求封包時使用的首部。
補充了請求的附加内容、用戶端資訊、響應内容相關優先級等資訊。
-
響應首部字段
從伺服器端向用戶端傳回響應封包時使用的首部。
補充了響應的附加内容,也會要求用戶端附加額外的内容資訊。
-
實體首部字段
針對請求封包和響應封包的實體部分使用的首部。
補充了資源内容更新時間等與實體有關的資訊。
通用首部字段
請求封包和響應封包兩方都會使用的首部。
Cache-Control
用于操作HTTP緩存。多個指令之間通過“,”分隔。
表示是否能緩存的指令
- public指令
當指定使用public指令時,則明确表明其他使用者也可以利用緩存。
- private指令
當指定private指令後,響應隻以特定的使用者作為對象,這與public指令的行為相反。
緩存伺服器會對該特定使用者提供資源緩存的服務,對其他使用者發送過來的請求則不會傳回緩存。
- no-cache指令
使用no-cache指令的目的是為了防止從緩存中傳回過期的資源。每次在使用緩存之前都強制發送請求給源伺服器進行驗證,檢查檔案該沒改變
從字面上了解很容易以為no-cache表示不緩存,但事實上no-cache代表不緩存過期的資源,緩存會向伺服器進行有效性确認後處理資源。
後面提到的no-store才是不緩存資源。
- no-store指令
該指令規定緩存不能在本地存儲請求或者響應。
與到期時間相關的指令
- s-maxage指令
Cache-Control:s-maxage=(機關:秒)
s-maxage指令的功能和max-age指令相同,它們的不同點是s-maxage指令隻适用于供多位使用者使用的公共緩存伺服器(即一般代理)。
也就是說,對于向同一使用者重複傳回響應的伺服器來說,這個指令沒有任何作用。
另外,使用s-maxage指令後,則直接忽略對Expires首部字段及max-age指令的處理。
-
max-age指令
設定緩存存儲的最大周期,超過這個時間緩存被認為過期
Cache-Control:max-age=(機關:秒)
當用戶端發送的請求中包含max-age時,如果判定緩存資源的緩存時間比指定時間的數值更小,那麼用戶端就接受緩存的資源。
如果max-age指定為0,那麼緩存伺服器通常需要将請求轉發給源伺服器。
當伺服器傳回的響應中包含max-age時,緩存伺服器将不對資源的有效性再做确認,max-age代表資源儲存為緩存的最長時間。
在同時遇到Expires首部字段和max-age時,會優先處理max-age指令而忽略掉Expires首部字段。
- min-fresh
min-fresh指令要求緩存伺服器傳回還未過指定時間的緩存資源。
- max-stale指令
表示用戶端願意接收一個已經過期的資源。 可選的設定一個時間(機關秒),表示響應不能超過的過期時間。
如果指令未指定參數值,那麼無論經過多久用戶端都會接受緩存。
如果指令中指定了具體數值,那麼隻接受過期時間處于指定數值内的緩存。
- only-if-cached
表示不要去擷取新資料。用戶端隻希望擷取緩存的響應,并且不去聯系伺服器去檢查是否存在較新的副本。
與驗證相關的指令
- must-revalidate
使用這個指令,代理會向源伺服器再次驗證緩存是否有效。
另外,使用這條指令會忽略max-stale指令。
- proxy-revalidate
與must-revalidate相同,但它僅适用于共享緩存(例如代理),并被私有緩存忽略。
- no-transform
表示無論是在請求還是響應中,緩存都不能改變實體主體的媒體類型。
這樣做可以防止緩存或代理壓縮圖檔等類似操作。
Connection
這個首部具備以下兩個作用:
控制不再轉發
Connection:不再轉發的首部字段名
在代理向伺服器進行轉發時,将會删除指定的首部字段。
管理持久連接配接
HTTP 1.1版本的預設連接配接都是持久連接配接。當伺服器想明确斷開連接配接時則指定Connection首部字段為Close。
之前舊版本的HTTP預設連接配接都是非持久連接配接,為此如果想在舊版本的HTTP協定上維持持續連接配接,則需要指定為keep-alive。
用戶端發送請求給伺服器時,伺服器端傳回的響應中的首部字段會加上Keep-Alive和Connection後傳回。
Date
表明建立HTTP封包的日期和時間。
Trailer
這個字段會事先說明在封包主體後記錄了哪些首部字段。
這個字段可應用在分塊傳輸編碼。
HTTP/1.1 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Trailer: Expires
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT
可以看到在首部中Trailer指定了Expires字段。這個字段在封包主體的後面也出現了。
Transfer-Encoding
規定了傳輸封包主體時采用的編碼方式。
Upgrade
用于檢測HTTP協定及其他協定是否可使用更高的版本進行通信,其參數值可以用來指定一個完全不同的通信協定。
Via
為了追蹤用戶端與伺服器之間的封包傳輸路徑。
封包經過代理或者網關時,會現在首部字段Via中附加該伺服器的資訊然後再進行轉發。
Via不僅用于追蹤封包的轉發,還可以避免請求回環的發生,是以必須在經過代理時附加該首部字段内容。
Via首部用于追蹤傳輸路徑,是以經常和TRACE方法一起使用。
Warning
會告知使用者一些與緩存相關的問題的警告。