圖解HTTP總結(3)——HTTP報文內的HTTP資訊
HTTP通訊過程包括從客戶端發往服務端的請求及從伺服器端返回客戶端的響應。
用於HTTP協議互動的資訊被稱為HTTP報文。客戶端的HTTP報文叫做請求報文,伺服器端的叫做響應報文。HTTP報文字身是多行(CR+LF作換行符)資料構成的字元文字。
HTTP報文大致可分為報文首部和報文主體兩塊。兩者由最初出現的空行(CR+LF)來劃分。通常,並不一定要有報文主體。
請求報文及響應報文的結構
報文主體和實體主體的差異
報文:是HTTP通訊中的基本單位,由8位組位元組流(octet sequence,其中octet為8個位元)組成,通過HTTP通訊傳輸。
實體:作為請求或響應的有效載荷資料(補充項)被傳輸,其內容由實體首部和實體主體組成。
HTTP報文的主體用於傳輸請求或響應的實體主體。
通常,報文主體等於實體主體。只有當傳輸中進行編碼操作時,實體主體的內容傳送變化,才導致它和報文主體產生差異。
壓縮傳輸的內容編碼
向待發送郵件內增加附件時,為了使郵件容量變小,我們會先用ZIP壓縮檔案之後再新增附件傳送。HTTP協議中有一種被稱為內容編碼的功能也能進行類似的操作。
內容編碼指明應用在實體內容上的編碼格式,並保持實體資訊原樣壓縮。內容編碼後的實體由客戶端接收並負責解碼。
分割傳送的分塊傳輸編碼
在HTTP通訊過程中,請求的編碼實體資源尚未全部傳輸完成之前,瀏覽器無法顯示請求頁面。在傳輸大容量資料時,通過把資料分割成多塊,能夠讓瀏覽器逐步顯示頁面。這種把實體主體分塊的功能稱為分塊傳輸編碼(Chunked Transfer Coding)。
在HTTP報文中使用多部分物件集合時,需要在首部欄位里加上Content-type。
獲取部分內容的範圍請求
以前下載一個尺寸稍大的圖片或檔案很吃力,如果下載過程遇到網路中斷的情況,那就必須從頭開始。為了解決上述問題,需要一種可恢復的機制。所謂恢復是指能從之前下載中斷處恢復下載。
要實現該功能需要指定下載的實體範圍。像這樣,指定範圍傳送的請求叫做範圍請求(Range Request)。
對一份10000位元組大小的資源,如果使用範圍情況,可以只請求5001-10000位元組內的資源。
執行範圍請求時,會用到首部欄位Range來指定資源的byte範圍。
內容協商返回最合適的內容
同一Web網站有可能存在著多份相同內容的頁面,比如英文版和中文版,當瀏覽器的預設語言為英文或中文,訪問相同URI的Web頁面時,則會顯示對應的英文版或中文版的Web頁面。這樣的機制稱為內容協商(Content Negotiation)。
內容協商機制是指客戶端和伺服器端就響應的資源內容進行交涉,然後提供給客戶端最為適合的資源。內容協商會以響應資源的語言、字符集、編碼方式等作為判斷的基準。
包含在請求報文中的某些首部欄位就是判斷的基準。
欄位為:Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language
內容協商技術有以下3種類型。
伺服器驅動協商(Server-driven Negotiation)
由伺服器端進行內容協商。以請求的首部欄位為參考,在伺服器端自動處理。但對使用者來說,以瀏覽器傳送的資訊作為判定的依據,並不一定能篩選出最優內容。
客戶端驅動協商(Agent-driven Negotiation)
由客戶端進行內容協商的方式。使用者從瀏覽器顯示的可選項列表中手動選擇。還可以利用JavaScript指令碼在Web頁面上自動進行上述選擇。比如按os的型別或瀏覽器型別,自動切換成PC版頁面或手機版頁面。
透明協商(Transparent Negotiation)
是伺服器驅動和客戶端驅動的結合體,是由伺服器端和客戶端各自進行內容協商的一種方法。