HTTP協議的大部分功能其實通過其協議包頭來實現。因爲HTTP協議包頭作用如此重要,因此需要單獨列出一節來詳細講解。協議包頭大體上分爲4類,分別爲通用包頭,請求包頭,回覆包頭,和實體包頭。
先看看通用包頭的主要作用。第一就是緩存控制,在協議包頭中存有很多類型的指令,這些指令用於控制發送數據的設備執行指定操作,這裏我們舉出關於緩存指令的集中常見情況來說明:
緩存控制指令 | HTTP消息類型 | 具體描述 |
---|---|---|
no-cache | 在請求和回覆數據包中使用 | 當頭部存在該指令時,他要求接收數據包的設備將後續接收到的數據包要及時發送出去不得扣留,如果要緩存數據的話,設備必須與服務器溝通以便確保緩存的數據保持有效性 |
public | 回覆數據包中 | 它表明該數據包可以被任何設備緩存 |
private | 回覆數據包中 | 它表明數據發送給指定接收者因此不能用於緩存 |
no-store | 在請求或回覆數據包中 | 它表明當前數據包不可以被緩存,這是爲了防止敏感信息被緩存後造成泄漏 |
max-age | 在請求或回覆數據包中 | 如果出現在請求數據包中,它表明設備只會接收時間不超過指定日期的緩存數據回覆。如果出現在回覆數據包中,它表明返回數據的“有效期”。 |
s-massage | 回覆數據包 | 它出現在回覆數據包裏,告訴所有接收該數據包的設備在緩存該數據包內數據的時長不要超過給定時期。 |
min-fresh | 請求數據包 | 它是客戶端告訴服務器,要它返回的數據有效性要在給定時期內給予保證 |
max-stale | 請求數據包 | 如果該指令不附帶參數的話說明客戶端不擔心服務器返回過期的數據,如果該指令包含了數字參數,它則告訴服務器確保返回的數據過了有效期不要超過給定時間 |
only-if-cache | 請求數據包 | 它只在特殊情況下使用,它要求回覆的內容必須來自特定的緩存,這個特定緩存的數據甚至可以不是來自於目標服務器 |
must-revalidate | 回覆數據包 | 它告訴中間緩存設備對某些特定回覆包在數據過了有效期後要及時從服務器那裏獲得有效數據。 |
proxy-revalidate | 回覆數據包 | 該指令與上一條相同,但它只針對特定的緩存服務器 |
no-transform | 請求或回覆數據包 | 有些時候被緩存的數據其格式會發生變化,一旦格式改變了,如果設備還接收改變前的數據就可能出現錯誤。客戶端或服務器會發生包含該指令的數據包要求對方不要修改數據格式 |
通用包頭還用於控制連接的指令。例如當包頭中含有指令Connection:close時,即使雙方使用HTTP1.1版本的協議,該協議能支持持久連接,但一旦看到該指令,那麼一次數據傳輸結束後,連接會被強行中斷。在通用包頭中經常包含Date指令,它用於表明該消息發送時間,例如Date:Wed,06 Aug 2003 16:43:50 GMT。指令Pragma用於啓動某種特定功能,例如Pragma: no-cache就告訴所有收發路徑上的設備不要緩存數據。還有Transfor-Encoding也是常有指令,該指令要求數據的發送或接收方採用特定格式編碼或解碼數據,該指令在後面還會具體說明。Upgrade指令用於客戶端去表明自己還能支持哪種協議,如果服務器也支持客戶端支持的協議,那麼雙方就能使用該指令將HTTP連接轉換爲特定協議的連接。
Via指令常被中間設備使用,以便用於通知接收數據的客戶端,它當前接收的數據包到底經過了哪幾種設備,Warning指令用於提供多餘的關於當前數據包狀態的信息,該指令經常作用與緩存,它的格式跟返回碼一樣,也是三位數值後面跟着字符串說明,例如下表列出了常用的Warning指令信息:
警告指令數字碼 | 描述符串 | 具體描述 |
---|---|---|
110 | Response is stale | 如果回覆給客戶端的數據來自緩存而且已經過了指定有效期那麼就必須包含該指令 |
111 | Revalidation failed | 緩存服務器試圖更新緩存信息但是失敗了,因此只能返回已經過期的數據 |
112 | Disconnected operation | 當前緩存已經脫離了其他網絡 |
113 | Heuristic expiration | 當緩存設定的有效期多餘24個小時,而且超過了24小時候客戶端請求該緩存時要發送該指令 |
199 | Miscellaneous warning | 該指令沒有具體含義 |
214 | Transformation applied | 它警告接收方,緩存服務器對數據的格式進行了修改 |
299 | Miscellaneous persistent warning | 同199一樣,它沒有表示具體含義 |
我們再看HTTP請求包頭的內容,顧名思義這樣的包頭只出現在請求數據包中。請求包頭一來可以讓客戶端將其自身信息發送給服務器,第二,能夠展現當前請求包的特性;第三,它能給客戶端用於控制服務器如何處理它的請求。請求包頭時四種包頭中格式和類型最爲複雜的一種。我們看看幾種常用的包頭類型,第一種叫Accept,它允許客戶端告訴服務器它能接受怎樣的媒體類型,通常它會列舉出可以接受的MIME類型;第二種是Accept-Charset,它告訴服務器客戶端可以解讀的字符集;第三種是Accept-Encoding,該指令是客戶端告訴服務器可以使用那種編碼方式對數據進行編碼;
第四種叫Accept-Language,它表示客戶端支持的語言類型;5,Authorization,它用於讓客戶端給服務器提交認證信息,當服務器返回401回覆碼時,客戶端才需要使用該請求包頭。包頭中包含類似於"WWW-Authenticate"的指令,其中說明了客戶端用於認證的重要數據和方法。6:Expect,它表明客戶端期待服務器會採取的幾種行動,如果服務器不支持該指令中列舉的行爲就會回覆417.7:From,它包含了發送該消息包的人的郵件地址,該指令基本沒什麼作用;8:Host,該指令能讓多個域名對應的服務器都可以被認爲是當前請求包的接收對象;9:If-Match,該指令是客戶端告訴服務器,它返回的數據只有滿足給定條件才能被接收;10:If-Modified-Since, 客戶端通過該指令要求服務器返回的信息必須在指定時間後修改過才能返回,它主要用於客戶端檢測所需數據是否更新以避免沒有必要的數據傳輸。
其他兩種類型的數據包頭和相關指令將在後續章節進行解讀。
更詳細的講解和代碼調試演示過程,請點擊鏈接
更多技術信息,包括操作系統,編譯器,面試算法,機器學習,人工智能,請關照我的公衆號: