HTTP通信過程包括從客戶端發(fā)送服務(wù)器端的請求及從服務(wù)器端返回客戶端的響應(yīng)蹋偏。此篇簡單了解請求和響應(yīng)是怎樣運(yùn)作的。
一愚屁、HTTP報文
用于HTTP協(xié)議交互的信息被稱為HTTP報文死宣。請求端的HTTP報文叫做請求報文,響應(yīng)端的叫做響應(yīng)報文惋啃。HTTP報文本身是由多行(用CR+LF作換行符)數(shù)據(jù)構(gòu)成的字符串文本哼鬓。
HTTP報文大致可分為報文首部和報文主體兩塊。兩者由最初出現(xiàn)的空行(CR+LF)來劃分边灭。通常异希,并不一定要有報文主體。
二绒瘦、請求報文及響應(yīng)報文的結(jié)構(gòu)
請求報文和響應(yīng)報文的首部內(nèi)容由以下數(shù)據(jù)組成〕撇荆現(xiàn)在出現(xiàn)的各種首部字段及狀態(tài)碼稍后會進(jìn)行闡述。
請求行:包含用于請求的方法惰帽,請求URI和HTTP版本
狀態(tài)行:包含表明響應(yīng)結(jié)果的狀態(tài)碼予跌,原因短語和HTTP版本
首部字段:包含表示請求和響應(yīng)的各種條件和屬性的各類首部
一般有4種首部,分別是:通用首部善茎,請求首部券册,響應(yīng)首部和實(shí)體首部。
其他垂涯,可能包含HTTP的RFC里未定義的首部(Cookie等)烁焙。
三、編碼提升傳輸速率
HTTP再傳輸數(shù)據(jù)時可以按照數(shù)據(jù)原貌直接傳輸耕赘,但也可以再傳輸過程中通過編碼提成傳輸速率骄蝇。通過在傳輸時的編碼,能有效地處理大量的訪問請求操骡。但是九火,編碼的操作需要計算機(jī)來完成,因此會消耗更多的CPU資源册招。
1.報文主體和實(shí)體主體的差異
報文(message)
是HTTP通信中的基本單位岔激,由8位字節(jié)流(octet sequence ,其中octet為8個比特)組成,通過HTTP通信是掰。
實(shí)體(entity)
作為請求或響應(yīng)的有效載荷數(shù)據(jù)被傳輸虑鼎,其內(nèi)容由實(shí)體首部和實(shí)體主體組成。
HTTP報文的主體用于傳輸請求或響應(yīng)的實(shí)體主體。
通常炫彩,報文主體等于實(shí)體主體匾七。只有當(dāng)傳輸中進(jìn)行編碼操作時,實(shí)體主體的內(nèi)容發(fā)生變化江兢,才導(dǎo)致它和報文主體產(chǎn)生差異昨忆。
2.壓縮傳輸?shù)膬?nèi)容編碼
相待發(fā)送郵件內(nèi)增加附件時,為了使郵件容量變小杉允,我們會先用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)椎壓縮)、deflate(zlib)署穗、identity(不進(jìn)行編碼)
3.分割發(fā)送的分塊傳輸編碼
再HTTP通信過程中寥裂,請求的編碼實(shí)體資源尚未全部傳輸完成之前,瀏覽器無法顯示請求頁面。再傳輸大容量數(shù)據(jù)時案疲,通過把數(shù)據(jù)分割成多塊封恰,能夠讓瀏覽器逐步顯示頁面。
把這種實(shí)體主體分塊的功能稱為分塊傳輸編碼(Chunked Transfer Coding)
分塊傳輸編碼會將實(shí)體主體分成多個部分褐啡。每一塊都會用十六進(jìn)制來標(biāo)記塊的大小诺舔,而實(shí)體主體的最后一塊會使用“0(CR+LF)”來標(biāo)記。
使用分塊傳輸編碼的實(shí)體主體會由接收的客戶端負(fù)責(zé)解碼备畦,恢復(fù)到編碼前的實(shí)體主體低飒。
HTTP/1.1中存在一種稱為傳輸編碼(Transfer Coding)的機(jī)制,它可以在通信時按某種編碼方式傳輸懂盐,但只定義作用于分塊傳輸編碼中褥赊。
四、發(fā)送多種數(shù)據(jù)的多部分對象集合
發(fā)送郵件時莉恼,我們可以在郵件里寫入文字并添加到多份附件拌喉。這是因為采用了MIME(Multipurpose Internet Mail Extensions,多用途因特網(wǎng)郵件擴(kuò)展)機(jī)制俐银,它允許郵件處理文本尿背,圖片,視頻等多個不同類型的數(shù)據(jù)捶惜。例如:圖片等二進(jìn)制數(shù)據(jù)已ASCII碼字符串編碼的方式指明残家,就是利用MIME來描述標(biāo)記數(shù)據(jù)類型。而在MIME擴(kuò)展中會使用一種稱為多部分對象集合(Multipart)的方法售躁,來容納多份不同類型的數(shù)據(jù)坞淮。
響應(yīng)地茴晋,HTTP協(xié)議中也采納了多部分對象集合,發(fā)送的一份報文主體內(nèi)可含有多類型實(shí)體回窘。通常是再圖片或文本文件等上傳時使用诺擅。
多部分對象及合包含的對象如下
1.muItipart/form-data
再web表單文件上傳時使用
2.muItipart/byteranges
狀態(tài)碼206(Partial Content,部分內(nèi)容)響應(yīng)報文包含了多個范圍的內(nèi)容時使用
在HTTP報文中使用多部分對象集合時啡直,需要在首部字段里加上Content-type烁涌,
使用boundary字符串來劃分多部分對象集合指明的各類實(shí)體。在boundary字符串指明的各個實(shí)體的起始行之前插入“--”標(biāo)記(例如:--AaB03x酒觅、--THIS_SRRING_SEPARATES),而在多部分對象集合對應(yīng)的字符串的最后插入“--”標(biāo)記(例如:--AaB03x--撮执、--THIS_STRING_SEPARATES--)作為結(jié)束。
多部分對象集合的每個部分類型中舷丹,都可以包含由首部字段抒钱。另外,可以在某個部分中嵌套使用多部分對象集合
五颜凯、獲取部分內(nèi)容的請求范圍
為了解決大文件下載過程中出現(xiàn)網(wǎng)絡(luò)中斷谋币,而需要重頭下載的情況,需要一種可恢復(fù)的機(jī)制症概,所謂可恢復(fù)是指能從之前下載中斷處恢復(fù)下載蕾额。
要實(shí)現(xiàn)該功能需要指定下載的實(shí)體范圍。指定范圍發(fā)送的請求叫做范圍請求(Range Request)彼城。
針對范圍請求诅蝶,響應(yīng)會返回狀態(tài)碼為 206 Partial Content 的響應(yīng)報文。另外募壕,對于多重范圍的范圍請求秤涩,響應(yīng)會在首部字段 ContentType 標(biāo)明 multipart/byteranges 后返回響應(yīng)報文。
如果服務(wù)器端無法響應(yīng)范圍請求司抱,則會返回狀態(tài)碼 200 OK 和完整的實(shí)體內(nèi)容筐眷。
六、內(nèi)容協(xié)商返回最適合的內(nèi)容
同一個web網(wǎng)站有可能存在著多份相同內(nèi)容的頁面习柠。比如英文版和中文版的web頁面匀谣,它們內(nèi)容上雖然相同,但使用的語言卻不同资溃。
當(dāng)瀏覽器的默認(rèn)語言為英語或中文武翎,訪問相同的URI的web頁面時,則會顯示對應(yīng)的英文版或中文版的web頁面溶锭。這樣的機(jī)制成為內(nèi)容協(xié)商(Content Negotiation)宝恶。內(nèi)容協(xié)商機(jī)制是指客戶端和服務(wù)器端就響應(yīng)的資源內(nèi)容進(jìn)行交涉,然后提佛那個給客戶端最為適合的資源。內(nèi)容協(xié)商會議響應(yīng)資源的語言垫毙、字符集霹疫、編碼方式等作為判斷的基準(zhǔn)。
包含在請求報文中的某些首部字段就是判斷的基準(zhǔn)综芥。
Accept Accept-Charset Accept-Encoding Accept-Language Content-Language
內(nèi)容協(xié)商技術(shù)有三種類型
1.服務(wù)器驅(qū)動協(xié)商(Server-drivea Negotiation)
由服務(wù)器端進(jìn)行內(nèi)容協(xié)商丽蝎。已請求的首部字段為參考,在服務(wù)器端自動處理膀藐。但對用戶來說屠阻,以瀏覽器發(fā)送的信息作為判定的依據(jù),并不一定能篩選出最優(yōu)內(nèi)容额各。
2.客戶端驅(qū)動協(xié)商(Agent-driven Negotiation)
由客戶端進(jìn)行內(nèi)容協(xié)商的方式国觉,用戶從瀏覽器顯示的可選項列表中手動選擇,還可以利用JavaScript腳本在web頁面上自動進(jìn)行上述選擇虾啦,比如按OS的類型或瀏覽器類型麻诀,自動切換成PC版頁面或手機(jī)版頁面。
3.透明協(xié)商(Transparent Negotiation)
是服務(wù)器驅(qū)動和客戶端驅(qū)動的結(jié)合體缸逃,是由服務(wù)器端和客戶端各自進(jìn)行內(nèi)容協(xié)商的一種方法。