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

HTTP通信過(guò)程包括從客戶端發(fā)送服務(wù)器端的請(qǐng)求及從服務(wù)器端返回客戶端的響應(yīng)。此篇簡(jiǎn)單了解請(qǐng)求和響應(yīng)是怎樣運(yùn)作的。

一、HTTP報(bào)文

用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文。請(qǐng)求端的HTTP報(bào)文叫做請(qǐng)求報(bào)文,響應(yīng)端的叫做響應(yīng)報(bào)文。HTTP報(bào)文本身是由多行(用CR+LF作換行符)數(shù)據(jù)構(gòu)成的字符串文本。

HTTP報(bào)文大致可分為報(bào)文首部和報(bào)文主體兩塊。兩者由最初出現(xiàn)的空行(CR+LF)來(lái)劃分。通常,并不一定要有報(bào)文主體。

image.png

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

image.png
image.png

請(qǐng)求報(bào)文和響應(yīng)報(bào)文的首部?jī)?nèi)容由以下數(shù)據(jù)組成?,F(xiàn)在出現(xiàn)的各種首部字段及狀態(tài)碼稍后會(huì)進(jìn)行闡述。

請(qǐng)求行:包含用于請(qǐng)求的方法,請(qǐng)求URI和HTTP版本

狀態(tài)行:包含表明響應(yīng)結(jié)果的狀態(tài)碼,原因短語(yǔ)和HTTP版本

首部字段:包含表示請(qǐng)求和響應(yīng)的各種條件和屬性的各類首部

一般有4種首部,分別是:通用首部,請(qǐng)求首部,響應(yīng)首部和實(shí)體首部。

其他,可能包含HTTP的RFC里未定義的首部(Cookie等)。

三、編碼提升傳輸速率

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

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

報(bào)文(message)

是HTTP通信中的基本單位,由8位字節(jié)流(octet sequence ,其中octet為8個(gè)比特)組成,通過(guò)HTTP通信。

實(shí)體(entity)

作為請(qǐng)求或響應(yīng)的有效載荷數(shù)據(jù)被傳輸,其內(nèi)容由實(shí)體首部和實(shí)體主體組成。

HTTP報(bào)文的主體用于傳輸請(qǐng)求或響應(yīng)的實(shí)體主體。

通常,報(bào)文主體等于實(shí)體主體。只有當(dāng)傳輸中進(jìn)行編碼操作時(shí),實(shí)體主體的內(nèi)容發(fā)生變化,才導(dǎo)致它和報(bào)文主體產(chǎn)生差異。

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é)解碼。

image.png

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

gzip(GNU zip)、compress(UNIX 系統(tǒng)的標(biāo)椎壓縮)、deflate(zlib)、identity(不進(jìn)行編碼)

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

再HTTP通信過(guò)程中,請(qǐng)求的編碼實(shí)體資源尚未全部傳輸完成之前,瀏覽器無(wú)法顯示請(qǐng)求頁(yè)面。再傳輸大容量數(shù)據(jù)時(shí),通過(guò)把數(shù)據(jù)分割成多塊,能夠讓瀏覽器逐步顯示頁(yè)面。

把這種實(shí)體主體分塊的功能稱為分塊傳輸編碼(Chunked Transfer Coding)

image.png

分塊傳輸編碼會(huì)將實(shí)體主體分成多個(gè)部分。每一塊都會(huì)用十六進(jìn)制來(lái)標(biāo)記塊的大小,而實(shí)體主體的最后一塊會(huì)使用“0(CR+LF)”來(lái)標(biāo)記。

使用分塊傳輸編碼的實(shí)體主體會(huì)由接收的客戶端負(fù)責(zé)解碼,恢復(fù)到編碼前的實(shí)體主體。

HTTP/1.1中存在一種稱為傳輸編碼(Transfer Coding)的機(jī)制,它可以在通信時(shí)按某種編碼方式傳輸,但只定義作用于分塊傳輸編碼中。

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

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

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

多部分對(duì)象及合包含的對(duì)象如下

1.muItipart/form-data

再web表單文件上傳時(shí)使用

image.png

2.muItipart/byteranges

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

image.png

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

使用boundary字符串來(lái)劃分多部分對(duì)象集合指明的各類實(shí)體。在boundary字符串指明的各個(gè)實(shí)體的起始行之前插入“--”標(biāo)記(例如:--AaB03x、--THIS_SRRING_SEPARATES),而在多部分對(duì)象集合對(duì)應(yīng)的字符串的最后插入“--”標(biāo)記(例如:--AaB03x--、--THIS_STRING_SEPARATES--)作為結(jié)束。

多部分對(duì)象集合的每個(gè)部分類型中,都可以包含由首部字段。另外,可以在某個(gè)部分中嵌套使用多部分對(duì)象集合

五、獲取部分內(nèi)容的請(qǐng)求范圍

為了解決大文件下載過(guò)程中出現(xiàn)網(wǎng)絡(luò)中斷,而需要重頭下載的情況,需要一種可恢復(fù)的機(jī)制,所謂可恢復(fù)是指能從之前下載中斷處恢復(fù)下載。

要實(shí)現(xiàn)該功能需要指定下載的實(shí)體范圍。指定范圍發(fā)送的請(qǐng)求叫做范圍請(qǐng)求(Range Request)。

image.png

針對(duì)范圍請(qǐng)求,響應(yīng)會(huì)返回狀態(tài)碼為 206 Partial Content 的響應(yīng)報(bào)文。另外,對(duì)于多重范圍的范圍請(qǐng)求,響應(yīng)會(huì)在首部字段 ContentType 標(biāo)明 multipart/byteranges 后返回響應(yīng)報(bào)文。

如果服務(wù)器端無(wú)法響應(yīng)范圍請(qǐng)求,則會(huì)返回狀態(tài)碼 200 OK 和完整的實(shí)體內(nèi)容。
六、內(nèi)容協(xié)商返回最適合的內(nèi)容
同一個(gè)web網(wǎng)站有可能存在著多份相同內(nèi)容的頁(yè)面。比如英文版和中文版的web頁(yè)面,它們內(nèi)容上雖然相同,但使用的語(yǔ)言卻不同。
當(dāng)瀏覽器的默認(rèn)語(yǔ)言為英語(yǔ)或中文,訪問(wèn)相同的URI的web頁(yè)面時(shí),則會(huì)顯示對(duì)應(yīng)的英文版或中文版的web頁(yè)面。這樣的機(jī)制成為內(nèi)容協(xié)商(Content Negotiation)。內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然后提佛那個(gè)給客戶端最為適合的資源。內(nèi)容協(xié)商會(huì)議響應(yīng)資源的語(yǔ)言、字符集、編碼方式等作為判斷的基準(zhǔn)。
包含在請(qǐng)求報(bào)文中的某些首部字段就是判斷的基準(zhǔn)。
Accept Accept-Charset Accept-Encoding Accept-Language Content-Language
內(nèi)容協(xié)商技術(shù)有三種類型
1.服務(wù)器驅(qū)動(dòng)協(xié)商(Server-drivea Negotiation)
由服務(wù)器端進(jìn)行內(nèi)容協(xié)商。已請(qǐng)求的首部字段為參考,在服務(wù)器端自動(dòng)處理。但對(duì)用戶來(lái)說(shuō),以瀏覽器發(fā)送的信息作為判定的依據(jù),并不一定能篩選出最優(yōu)內(nèi)容。
2.客戶端驅(qū)動(dòng)協(xié)商(Agent-driven Negotiation)
由客戶端進(jìn)行內(nèi)容協(xié)商的方式,用戶從瀏覽器顯示的可選項(xiàng)列表中手動(dòng)選擇,還可以利用JavaScript腳本在web頁(yè)面上自動(dòng)進(jìn)行上述選擇,比如按OS的類型或?yàn)g覽器類型,自動(dòng)切換成PC版頁(yè)面或手機(jī)版頁(yè)面。
3.透明協(xié)商(Transparent Negotiation)
是服務(wù)器驅(qū)動(dòng)和客戶端驅(qū)動(dòng)的結(jié)合體,是由服務(wù)器端和客戶端各自進(jìn)行內(nèi)容協(xié)商的一種方法。

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

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

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