第 3 章 HTTP 報(bào)文內(nèi)的 HTTP 信息

HTTP 通信過程包括從客戶端發(fā)往服務(wù)器端的請求及從服務(wù)器端返回 客戶端的響應(yīng)

3.1 HTTP 報(bào)文

用于 HTTP 協(xié)議交互的信息被稱為 HTTP 報(bào)文。請求端(客戶端)的 HTTP 報(bào)文叫做請求報(bào)文,響應(yīng)端(服務(wù)器端)的叫做響應(yīng)報(bào)文。 HTTP 報(bào)文本身是由多行(用 CR+LF 作換行符)數(shù)據(jù)構(gòu)成的字符串文 本。
HTTP 報(bào)文大致可分為報(bào)文首部和報(bào)文主體兩塊。兩者由最初出現(xiàn)的 空行(CR+LF)來劃分。通常,并不一定要有報(bào)文主體。

3.2 請求報(bào)文及響應(yīng)報(bào)文的結(jié)構(gòu)

請求報(bào)文和響應(yīng)報(bào)文的首部內(nèi)容由以下數(shù)據(jù)組成。
請求行。包含用于請求的方法,請求 URI 和 HTTP 版本。
狀態(tài)行。包含表明響應(yīng)結(jié)果的狀態(tài)碼,原因短語和 HTTP 版本。
首部字段。包含表示請求和響應(yīng)的各種條件和屬性的各類首部。一般有 4 種首部,分別是:通用首部、請求首部、響應(yīng)首部和實(shí)體首部。
其他??赡馨?HTTP 的 RFC 里未定義的首部(Cookie 等)

3.3 編碼提升傳輸速率

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

3.3.1 報(bào)文主體和實(shí)體主體的差異

報(bào)文(message) 是 HTTP 通信中的基本單位,由 8 位組字節(jié)流(octet sequence, 其中 octet 為 8 個(gè)比特)組成,通過 HTTP 通信傳輸。 實(shí)體(entity)
作為請求或響應(yīng)的有效載荷數(shù)據(jù)(補(bǔ)充項(xiàng))被傳輸,其內(nèi)容由實(shí) 體首部和實(shí)體主體組成。
HTTP 報(bào)文的主體用于傳輸請求或響應(yīng)的實(shí)體主體。

通常,報(bào)文主體等于實(shí)體主體。只有當(dāng)傳輸中進(jìn)行編碼操作時(shí),實(shí)體 主體的內(nèi)容發(fā)生變化,才導(dǎo)致它和報(bào)文主體產(chǎn)生差異。
報(bào)文和實(shí)體這兩個(gè)術(shù)語在之后會(huì)經(jīng)常出現(xiàn),請事先理解兩者的差異。

3.3.2 壓縮傳輸?shù)膬?nèi)容編碼

向待發(fā)送郵件內(nèi)增加附件時(shí),為了使郵件容量變小,我們會(huì)先用 ZIP 壓縮文件之后再添加附件發(fā)送。HTTP 協(xié)議中有一種被稱為內(nèi)容編碼 的功能也能進(jìn)行類似的操作。
內(nèi)容編碼指明應(yīng)用在實(shí)體內(nèi)容上的編碼格式,并保持實(shí)體信息原樣壓縮。內(nèi)容編碼后的實(shí)體由客戶端接收并負(fù)責(zé)解碼。

常用的內(nèi)容編碼有以下幾種。
gzip(GNU zip)

compress(UNIX 系統(tǒng)的標(biāo)準(zhǔn)壓縮)

deflate(zlib)

identity(不進(jìn)行編碼)

3.3.3 分割發(fā)送的分塊傳輸編碼

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

分塊傳輸編碼會(huì)將實(shí)體主體分成多個(gè)部分(塊)。每一塊都會(huì)用十六 進(jìn)制來標(biāo)記塊的大小,而實(shí)體主體的最后一塊會(huì)使用“0(CR+LF)”來標(biāo) 記。
使用分塊傳輸編碼的實(shí)體主體會(huì)由接收的客戶端負(fù)責(zé)解碼,恢復(fù)到編 碼前的實(shí)體主體。
HTTP/1.1 中存在一種稱為傳輸編碼(Transfer Coding)的機(jī)制,它可 以在通信時(shí)按某種編碼方式傳輸,但只定義作用于分塊傳輸編碼中。

3.4 發(fā)送多種數(shù)據(jù)的多部分對象集合

發(fā)送郵件時(shí),我們可以在郵件里寫入文字并添加多份附件。這是因?yàn)?采用了 MIME(Multipurpose Internet Mail Extensions,多用途因特網(wǎng)郵 件擴(kuò)展)機(jī)制,它允許郵件處理文本、圖片、視頻等多個(gè)不同類型的數(shù)據(jù)。例如,圖片等二進(jìn)制數(shù)據(jù)以 ASCII 碼字符串編碼的方式指明, 就是利用 MIME 來描述標(biāo)記數(shù)據(jù)類型。而在 MIME 擴(kuò)展中會(huì)使用一 種稱為多部分對象集合(Multipart)的方法,來容納多份不同類型的 數(shù)據(jù)。

相應(yīng)地,HTTP 協(xié)議中也采納了多部分對象集合,發(fā)送的一份報(bào)文主 體內(nèi)可含有多類型實(shí)體。通常是在圖片或文本文件等上傳時(shí)使用。
多部分對象集合包含的對象如下。

multipart/form-data 在 Web 表單文件上傳時(shí)使用。

multipart/byteranges 狀態(tài)碼 206(Partial Content,部分內(nèi)容)響應(yīng)報(bào)文包含了多個(gè)范 圍的內(nèi)容時(shí)使用。
multipart/form-data

multipart/byteranges

在 HTTP 報(bào)文中使用多部分對象集合時(shí),需要在首部字段里加上 Content-type。

使用 boundary 字符串來劃分多部分對象集合指明的各類實(shí)體。在 boundary 字符串指定的各個(gè)實(shí)體的起始行之前插入“--”標(biāo)記(例如:-AaB03x、--THIS_STRING_SEPARATES),而在多部分對象集合對 應(yīng)的字符串的最后插入“--”標(biāo)記(例如:--AaB03x--、-THIS_STRING_SEPARATES--)作為結(jié)束。
多部分對象集合的每個(gè)部分類型中,都可以含有首部字段。另外,可 以在某個(gè)部分中嵌套使用多部分對象集合。有關(guān)多部分對象集合更詳 細(xì)的解釋,請參考 RFC2046。

3.5 獲取部分內(nèi)容的范圍請求

以前,用戶不能使用現(xiàn)在這種高速的帶寬訪問互聯(lián)網(wǎng),當(dāng)時(shí),下載一 個(gè)尺寸稍大的圖片或文件就已經(jīng)很吃力了。如果下載過程中遇到網(wǎng)絡(luò) 中斷的情況,那就必須重頭開始。為了解決上述問題,需要一種可恢 復(fù)的機(jī)制。所謂恢復(fù)是指能從之前下載中斷處恢復(fù)下載。
要實(shí)現(xiàn)該功能需要指定下載的實(shí)體范圍。像這樣,指定范圍發(fā)送的請 求叫做范圍請求(Range Request)。 對一份 10 000 字節(jié)大小的資源,如果使用范圍請求,可以只請求 5001~10 000 字節(jié)內(nèi)的資源。

3.6 內(nèi)容協(xié)商返回最合適的內(nèi)容

同一個(gè) Web 網(wǎng)站有可能存在著多份相同內(nèi)容的頁面。比如英語版和 中文版的 Web 頁面,它們內(nèi)容上雖相同,但使用的語言卻不同。 當(dāng)瀏覽器的默認(rèn)語言為英語或中文,訪問相同 URI 的 Web 頁面時(shí), 則會(huì)顯示對應(yīng)的英語版或中文版的 Web 頁面。這樣的機(jī)制稱為內(nèi)容 協(xié)商(Content Negotiation)。

內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然 后提供給客戶端最為適合的資源。內(nèi)容協(xié)商會(huì)以響應(yīng)資源的語言、字 符集、編碼方式等作為判斷的基準(zhǔn)。

包含在請求報(bào)文中的某些首部字段(如下)就是判斷的基準(zhǔn)。這些首 部字段的詳細(xì)說明請參考下一章。
Accept

Accept-Charset

Accept-Encoding

Accept-Language

Content-Language

內(nèi)容協(xié)商技術(shù)有以下 3 種類型。

服務(wù)器驅(qū)動(dòng)協(xié)商(Server-driven Negotiation)
由服務(wù)器端進(jìn)行內(nèi)容協(xié)商。以請求的首部字段為參考,在服務(wù)器端自 動(dòng)處理。但對用戶來說,以瀏覽器發(fā)送的信息作為判定的依據(jù),并不 一定能篩選出最優(yōu)內(nèi)容。

客戶端驅(qū)動(dòng)協(xié)商(Agent-driven Negotiation)
由客戶端進(jìn)行內(nèi)容協(xié)商的方式。用戶從瀏覽器顯示的可選項(xiàng)列表中手 動(dòng)選擇。還可以利用 JavaScript 腳本在 Web 頁面上自動(dòng)進(jìn)行上述選 擇。比如按 OS 的類型或?yàn)g覽器類型,自行切換成 PC 版頁面或手機(jī) 版頁面。

透明協(xié)商(Transparent Negotiation)
是服務(wù)器驅(qū)動(dòng)和客戶端驅(qū)動(dòng)的結(jié)合體,是由服務(wù)器端和客戶端各自進(jìn) 行內(nèi)容協(xié)商的一種方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • HTTP報(bào)文 用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文。HTTP報(bào)文本身是由多行(用CR+LF作換行符)數(shù)據(jù)構(gòu)...
    Megamind_China閱讀 607評論 2 4
  • HTTP報(bào)文大致分為報(bào)文首部和報(bào)文主體兩塊。兩者通過空行(CR+LF)來劃分。 編碼提升傳輸速率 報(bào)文主體和實(shí)體的...
    陳_振閱讀 572評論 0 0
  • Web 頁面的實(shí)現(xiàn) Web 基于 HTTP 協(xié)議通信 客戶端(Client)的 Web 瀏覽器從 Web 服務(wù)器端...
    毛圈閱讀 1,316評論 0 2
  • HTTP通信過程包括從客戶端發(fā)送服務(wù)器端的請求及從服務(wù)器端返回客戶端的響應(yīng)。此篇簡單了解請求和響應(yīng)是怎樣運(yùn)作的。 ...
    趙玉華_ac38閱讀 275評論 0 0
  • 每天早上,定的7點(diǎn)的鬧鐘,叫不醒我,非得再睡個(gè)十分鐘。然后,晃晃悠悠地起床穿衣,上廁所,洗漱。胡亂吃點(diǎn)東西后急急忙...
    竹閒閱讀 1,008評論 9 39

友情鏈接更多精彩內(nèi)容