前端必知必會HTTP請求系列(三)HTTP報文內的http信息

圖片描述

http報文

用於HTTP協議交互的信息被稱爲HTTP報文。請求端的http報文叫做請求報文,響應端的叫做響應報文,HTTP報文本身有多行數據構成的字符串文本。

http報文大致可分爲報文首部和報文主體兩塊,報文主體兩塊。兩者由最初出租。出現的空行來劃分,通常並不一定要有報文主體。

請求報文及響應報文的結構

我們來看一下請求報文和響應報文的結構。
請求報文和響應報文的首部內容由以下數據組成。現在出現的各種首部字段及狀態碼稍後會闡述。

新浪微博請求示例

請求頭
響應頭

請求行

包含用於請求方法,請求URL和HTTP請求

狀態行

包含表明響應結果的狀態碼,原因短語和HTTP版本

首部字段

包含表示,請求和響應的各種條件和屬性的各類首部
一般有四種首部分別是通用首部,請求首部,響應首部,實體守護

其他

能包含HTTP的RFC,裏面未定義的首部

編碼提升傳輸效率

HTTP在傳輸數據時可以按照數據原貌直接傳輸,但也可以。在傳輸過程,通過編碼提升傳輸效率。通過在傳輸是編碼,能有效地處理大量的訪問請求,但是編碼的操作需要計算機來完成,因此會消耗更多的CPU資源

報文主體和實體主體的差異

  • 報文

是HTTP通信中的基本單位,是由八位組節流。組成通過HTTP通信傳輸

  • 實體

作爲請求或響應的有效載荷,數據被傳輸,其內容有實體守護和出題主體組成
HTTP的主體用於傳輸請求或響應的實體主體。
通常報文主體等於實體主體。只有當天傳輸中進行編碼操作時,實體主體的內容發生變化,才導致他和報文主體產生差異
報文和實體這兩個術語在之後會經常出現,請事先理解兩者的差異

壓縮傳輸的內容編碼

像待發送郵件內增加附件時,爲了使郵件容量變小,我們會先用zip壓縮文件之後再添加附件發送
HTTP協議中有一種被稱爲內容編碼的功能,也能進行類似的操作,內容編碼指明應用在實體內容上的編碼格式,並保持實體信息原樣壓縮,內容編碼後的實體由客戶端接收並負責解碼

常用的內容編碼有以下幾種

  • gzip
  • comperss(UNIX 系統的標準壓縮)
  • deflate(zlib)
  • identity(不進行編碼)

分割發送的分塊傳輸編碼

在HTTP通信過程中,請求的編碼實體資源尚未全部傳輸完成,之前瀏覽器無法顯示請求頁面,在傳輸大容量數據時,通過把數據分割成多塊,能夠讓瀏覽器逐步顯示頁面
這種把實體分塊的功能稱之爲分塊傳輸編碼


分塊傳輸編碼會將實體主體分成多個部分,每一塊都會用16進制來標記塊大小,而實體主體最後一塊會使用“0(CR+LF)”來標記
使用分塊傳輸編碼的實體主題,會有接收的客戶端,負責解碼,恢復到編碼前的實體主體
HTTP1.1中存在一種稱爲傳輸編碼(transfer coding)的機制,他可以在通信時按某種編碼方式傳輸,但指定一多用於分塊傳輸編碼中

發送多種數據的多部分對象集合

發送郵件時,我們可以在郵件裏寫入文字並添加多份附件。這是因爲採用了MIME(Multipurpose Internet Mail Extensions, 多用途因特網郵件擴展)機制。它允許郵件處理文本,圖片,視頻等多個不同類型的數據。例如,圖片等二進制數據以ASCII碼字符串編碼的方式指明,就是利用MIME來描述標記數據類型。而在MIME擴展中會使用一種稱爲多部分對象集合(Multipart)的方法,來容納多份不同類型的數據。
相應的HTTP協議中也採納了多部分對象集合,發送的一份報文主體可含有多類型實體。通常是在圖片或文本文件等上傳時使用。
多部分對象集合包含的對象如下。

  • multipart/form-data

在web表單上傳時使用。

  • multipart/byteranges

狀態碼206響應報文包含了多個範圍的內容使用。
在HTTP報文中使用多部分對象集合時需要在首部字段裏面加Content-type。有關這捨不得知道,我們稍後講解
使用boundary字符串來劃分多部分對象集合指令的各類實體,在boundary字符串指定的各個實體的起始行之前插入“--”標記(例如:--AaB03x、--THIS_STRING_SEPARATES)而在多部分對象集合對應的字符串的最後,插入“--”標記作爲結束
多部分對象集合的每個部分類型中都可以含有首部字段,另外可以在某個部分中嵌套,使用多部分對象汽車。

獲取部分內容的範圍請求

以前,用戶不能使用現在這種高速的帶寬訪問互聯網,當時,下載一個尺寸稍微大的圖片或者文件就已經很吃力了。如果下載過程中遇到網絡中斷的情況。那就必須重頭開始,爲了解決上面的這個問題,需要一種可恢復的機制,所謂恢復是指能從之前下載中斷處恢復下載。
實現該功能需要指定下載實體的範圍。像這樣,指定範圍發送的請求叫做範圍請求(Range Request)。
對一份10000字節大小的資源,如果使用範圍請求,可以之請求5001~10000字節的資源。
執行範圍請求時,會用到首部字段Rang 來指定資源的byte範圍。byte範圍的指定形式如下:

  • 5001-10000字節
Range: bytes=5001-10000
  • 從5001字節之後全部的
Range: bytes=5001-
  • 從一個開始到3000字節和5000~7000字節的多重範圍
Range: bytes=0-3000, 5000-700

針對範圍請求,響應會返回狀態碼爲206 Partial Content 的響應報文。另外,對於多重範圍的範圍請求,響應會在首部字段Content-Type標明multipart/byteranges後返回響應的報文。
如果服務器無法響應範圍請求,則會返回狀態碼200 ok 和完整的實體內容。

內容協商返回最合適的內容

同一個web網站有可能存在着多份相同內容的頁面。比如英語版和中文版的web頁面,他們內容雖然相同,但使用的語言卻不同。
當瀏覽器的默認語言爲英語或者是中文的時候,訪問相同的RUI的web頁面時,則會顯示對應的英語版或中文版的web頁面。這樣的機制稱爲內容協商。
內容協商機制是指客戶端和服務端就響應的資源進行交涉,然後提供給客戶端最爲適合的資源。內容協商會以語言、字符集、編碼方式等爲基準判斷響應的資源。
包含在請求報文中的某些首部字段就是判斷的基準。這些首部字段的詳細說明請參考下一部分的內容

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

內容協商技術有以下三種類型。
服務器協商(Server-driven Negotiation)
由服務器端進行內容協商。以請求的首部字段爲參考,在服務器端自動處理。但對用戶來說,以瀏覽器發送的信息作爲判定的依據,並不一定能篩選出最優的內容。
客戶端驅動協商(Agent-driven Negotiation)
有客戶端進行內容協商的方式。用戶從瀏覽器現實的可選項列表中手動選擇。開可以利用JavaScript腳本在web頁面上自動進行上述選擇。比如按OS得類型或瀏覽器的類型,自行切換成PC版頁面或手機版頁面。
透明協商(Transparent Negotiation)
是服務器驅動和客戶端驅動的結合體,是由服務器端和客戶端各自進行內容協商的一種方法。

前端必知必會HTTP請求系列(一)瞭解Web及網絡基礎
前端必知必會HTTP請求系列(二)簡單一點的HTTP協議
前端必知必會HTTP請求系列(三)HTTP,報文內部的HTTP信息
前端必知必會HTTP請求系列(四)返回結果的HTTP狀態碼
前端必知必會HTTP請求系列(五)與HTTP協作的web服務器
前端必知必會HTTP請求系列(六)HTTP的首部
前端必知必會HTTP請求系列(七)確保Web安全的HTTPS
前端必知必會HTTP請求系列(八)確認訪問用戶身份的認證
前端必知必會HTTP請求系列(九)基於HTTP的功能追加協議
前端必知必會HTTP請求系列(十)構建Web內容的技術
前端必知必會HTTP請求系列(十一)Web攻擊技術
有什麼問題可以到評論區留言,持續關注,不斷更新!

本文作者前端技術小哥,轉載請聲明
新前端技術交流羣召集前端技術人,這裏有Node.js/Vue.js/React.js/React-Native.js/微信小程序 技術問題交流。歡迎加入!羣號:426334209
點擊鏈接加入羣聊【前端技術交流羣】http://qm.qq.com/cgi-bin/qm/q...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章