天天看點

HTTP學習筆記:HTTP首部字段(1)HTTP封包首部HTTP首部字段

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=(機關:秒)
           
HTTP學習筆記:HTTP首部字段(1)HTTP封包首部HTTP首部字段

當用戶端發送的請求中包含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

會告知使用者一些與緩存相關的問題的警告。

繼續閱讀