《圖解HTTP》讀書筆記三:HTTP 報文內的 HTTP 資訊

衣舞晨風發表於2018-02-15

3.1 HTTP 報文

      用於 HTTP 協議互動的資訊被稱為 HTTP 報文。請求端(客戶端)的HTTP 報文叫做請求報文,響應端(伺服器端)的叫做響應報文。HTTP 報文字身是由多行(用 CR+LF 作換行符)資料構成的字串文字。

      HTTP 報文大致可分為報文首部和報文主體兩塊。兩者由最初出現的空行(CR+LF)來劃分。通常,並不一定要有報文主體。
這裡寫圖片描述

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

請求報文(上)和響應報文(下)的例項:
這裡寫圖片描述
請求報文和響應報文的首部內容由以下資料組成。現在出現的各種首
部欄位及狀態碼稍後會進行闡述。

請求行

包含用於請求的方法,請求 URI 和 HTTP 版本。

狀態行

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

首部欄位

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

其他

可能包含 HTTP 的 RFC 裡未定義的首部(Cookie 等)。

3.3.3 分割傳送的分塊傳輸編碼

      在 HTTP 通訊過程中,請求的編碼實體資源尚未全部傳輸完成之前,瀏覽器無法顯示請求頁面。在傳輸大容量資料時,通過把資料分割成多塊,能夠讓瀏覽器逐步顯示頁面。
    這種把實體主體分塊的功能稱為分塊傳輸編碼(Chunked Transfer Coding)。
分塊傳輸編碼:
這裡寫圖片描述

      分塊傳輸編碼會將實體主體分成多個部分(塊)。每一塊都會用十六進位制來標記塊的大小,而實體主體的最後一塊會使用“0(CR+LF)”來標記。
      使用分塊傳輸編碼的實體主體會由接收的客戶端負責解碼,恢復到編碼前的實體主體。
      HTTP/1.1 中存在一種稱為傳輸編碼(Transfer Coding)的機制,它可以在通訊時按某種編碼方式傳輸,但只定義作用於分塊傳輸編碼中。

3.4 傳送多種資料的多部分物件集合

      傳送郵件時,我們可以在郵件裡寫入文字並新增多份附件。這是因為採用了MIME(Multipurpose Internet Mail Extensions,多用途因特網郵件擴充套件)機制,它允許郵件處理文字、圖片、視訊等多個不同型別的資料。例如,圖片等二進位制資料以 ASCII 碼字串編碼的方式指明,就是利用 MIME 來描述標記資料型別。而在 MIME 擴充套件中會使用一種稱為多部分物件集合(Multipart)的方法,來容納多份不同型別的資料。

      相應地,HTTP 協議中也採納了多部分物件集合,傳送的一份報文主體內可含有多型別實體。通常是在圖片或文字檔案等上傳時使用。
      多部分物件集合包含的物件如下:

  • multipart/form-data
    在 Web 表單檔案上傳時使用。
  • multipart/byteranges
    狀態碼 206(Partial Content,部分內容)響應報文包含了多個範圍的內容時使用。
  • multipart/form-data
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="field1"
Joe Blow
--AaB03x
Content-Disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain
...(file1.txt的資料)...
--AaB03x--
  • multipart/byteranges
HTTP/1.1 206 Partial Content
Date: Fri, 13 Jul 2012 02:45:26 GMT
Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 500-999/8000
...(範圍指定的資料)...
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 7000-7999/8000
...(範圍指定的資料)...
--THIS_STRING_SEPARATES--

      在 HTTP 報文中使用多部分物件集合時,需要在首部欄位里加上Content-type。

      使用 boundary 字串來劃分多部分物件集合指明的各類實體。在boundary 字串指定的各個實體的起始行之前插入“–”標記(例如:–AaB03x、–THIS_STRING_SEPARATES),而在多部分物件集合對
應的字串的最後插入“–”標記(例如:–AaB03x–、–THIS_STRING_SEPARATES–)作為結束。

      多部分物件集合的每個部分型別中,都可以含有首部欄位。另外,可以在某個部分中巢狀使用多部分物件集合。

3.5 獲取部分內容的範圍請求

      以前,使用者不能使用現在這種高速的頻寬訪問網際網路,當時,下載一個尺寸稍大的圖片或檔案就已經很吃力了。如果下載過程中遇到網路中斷的情況,那就必須重頭開始。為了解決上述問題,需要一種可恢復的機制。所謂恢復是指能從之前下載中斷處恢復下載。
      要實現該功能需要指定下載的實體範圍。像這樣,指定範圍傳送的請求叫做範圍請求(Range Request)。

《圖解HTTP》下載地址:
http://download.csdn.net/download/xunzaosiyecao/10252084
個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章