HTTP通信過程包括從客戶端發(fā)往服務器端的請求以及從服務端返回客戶端的響應。
1搀继、HTTP報文
就是一大串通信過程里經(jīng)過HTTP處理后添加的報文。
其大致分為報文首部和報文主體兩塊翠语。兩者由最初出現(xiàn)的空行(CR+LF)來劃分叽躯,通常并不一定要有報文主體。
2、編碼提升傳輸速率
a>報文主體和實體主體的差異
報文:HTTP通信的基本單位,8位組字節(jié)流組成性雄,通過HTTP通信傳輸横媚。
實體:請求或響應的有效載荷數(shù)據(jù)被傳輸拧揽,內容由實體首部和實體主體組成。
HTTP報文主體用于傳輸請求或響應的實體主體。
一般情況,報文主體等于實體主體袁辈,但是傳輸中進行編碼操作的時候,實體主體內容發(fā)生變化珠漂。
b>壓縮傳輸?shù)膬热菥幋a
HTTP協(xié)議中的內容編碼功能就像用壓縮軟件壓縮東西一樣晚缩,對實體內容進行編碼壓縮,內容編碼后的實體由客戶端接受并解碼媳危。這可以壓縮傳輸內容荞彼,加快傳輸速度。
常見的內容編碼有gzip待笑、compress鸣皂、deflate、identity(不編碼)签夭。
c>分割發(fā)送的分塊傳輸編碼
HTTP通信過程中椎侠,請求的編碼實體資源尚未傳輸完成之前,瀏覽器無法顯示請求頁面我纪,傳輸大容量數(shù)據(jù)時候慎宾,通過數(shù)據(jù)分割成多塊,能讓瀏覽器逐步顯示頁面浅悉。這就是分塊傳輸編碼(Chunked Transfer Coding)。它將實體主體分成多個部分术健,每一塊用十六進制來標記,最后一塊使用0(CR+LF)
來標記荞估。傳輸給客戶端咳促,由客戶端進行解碼恢復。
3勘伺、發(fā)送多種數(shù)據(jù)的多部分對象集合
MIME(Multipurpose Internet Mail Extensions, 多用途因特網(wǎng)郵件擴展),它允許郵件處理文本飞醉,圖片,視頻等多個不同類型的數(shù)據(jù)轴术,這使我們可以在郵件里寫入文字并添加多分附件成為了現(xiàn)實钦无。例如:圖片等二進制數(shù)據(jù)以ASCII碼字符串編碼方式表名,就是利用MIME來標記數(shù)據(jù)類型铃诬,在MIME擴展中會使用一種稱為多部分對象集合(Multipart)的方法,來容納多份不同類型的數(shù)據(jù)趣席。
相應的,HTTP協(xié)議中也采納了多部分對象集合想罕,發(fā)送的一份報文主體內可含有多類型實體,通常在圖片或文本文件等上傳時使用按价。
多部分對象集合包括:
-
multipart/form-data 在Web表單文件上傳使用
-
multipart/byteranges 狀態(tài)碼206(Partial Content楼镐,部分內容)響應報文包含了多個范圍的內容時使用。
HTTP報文使用這個多部分對象集合的時候凄杯,需要在首部添加Content-type字段秉宿。
使用boundary字符串來劃分多部分
在boundary字符串指定的各個實體的起始行之前插入’--‘標記(--AaB03x、--THis_STRING_SEPARATES)
在多部分對象集合對應的字符串的最后插入’--‘標記(--AaB03x--)
多部分對象集合的每個部分類型中描睦,都可以含有首部字段。另外隔崎,可以在部分中潛逃使用多部分對象集合窑多。
4、獲取部分內容的范圍請求
過去埂息,用戶下載東西中斷了必須要從頭下載,為了解決這問題千康,要實現(xiàn)該功能需要指定下載的實體范圍拾弃,指定范圍發(fā)送的請求叫做范圍請求(Range Request)
對一份10000字節(jié)大小的資源,如果使用范圍請求豪椿,可以只請求5001~10000字節(jié)內的資源。這樣就算中斷了咳秉,也可以向服務端指明自己需要的資源字節(jié)范圍鸯隅,這些需要在首部字段中表名。
形式如下:
Range : bytes = 5001 - 10000
5001到10000的
Range : bytes = 5001 -
5001 到之后全部的
Range : bytes = -3000, 5000 - 7000
從頭到3000, 5000到7000的
針對范圍請求何之,響應會返回狀態(tài)碼為206 Partial Content的響應報文咽筋,另外,對于多重范圍的范圍請求悼潭,響應會在首部字段Content-Type標明multipart/byteranges后返回響應報文舞箍,如果服務器無法響應請求皆疹,返回狀態(tài)碼200 OK 和完整的實體內容。
5略就、內容協(xié)商返回最合適的內容
同一個Web網(wǎng)站可能有存著多分相同內容的頁面,如中文版和英文版窄绒,內容雖然相同崔兴,單語言不同。當瀏覽器默認語言為哪種敲茄,訪問相同的URI的Web頁面時,會對應返回哪種語言的Web頁面掏父,這樣的機制就叫做內容協(xié)商(Content Negotiation)秆剪。
這協(xié)商的請求會包含在首部字段
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
類型:
服務器驅動協(xié)商(Server-driven Negotiation)
服務器通過請求的首部字段為參考自動處理,但以瀏覽器直接發(fā)送的信息不一定能篩選出最優(yōu)的內容陶缺。
客戶端驅動協(xié)商(Agent-driven Negotiation)
用戶從瀏覽器顯示的可選項列表中選擇何什, 還可以利用JS腳本在Web頁面自動進行上述選擇。
透明協(xié)商(Transparent Negotiation)
上兩種方法的結合體。
自我回顧
1蛛砰、HTTP報文是什么黍衙?大致分為哪兩部分?
2琅翻、提升編碼傳輸速率的方法有哪些?
3聂抢、如何發(fā)送多部分對象集合棠众?
4、如何進行斷點傳輸闸拿?
5、內容協(xié)商機制是什么揽趾?