HTTP 通信過程包括從客戶端發(fā)往服務(wù)器端的請求以及從服務(wù)器端返回客戶端的響應(yīng)。
什么是 HTTP 報文
用于 HTTP 協(xié)議交互(客戶端和服務(wù)器端)的信息被成為 HTTP 報文执解。
請求端的 HTTP 報文叫做請求報文谣辞,響應(yīng)端報文被叫做響應(yīng)報文。
HTTP 報文本身是由多行(用 CR+LF 作為換行符)構(gòu)成的字符串文本。
HTTP 報文大致可分為報文首部和報文主體兩部分。通常皇型,并不一定要有報文主體诬烹。
請求報文和響應(yīng)報文的結(jié)構(gòu)
請求行:包含用于請求的方法,請求的路徑和 HTTP 版本弃鸦。
狀態(tài)行:包含表明響應(yīng)結(jié)果的狀態(tài)碼绞吁,原因短語和 HTTP 版本。
首部字段:包含請求和響應(yīng)的各種條件和屬性的各類首部唬格。
其他:可能包含 HTTTP 的 RFC 里未定義的首部(Cookie 等)家破。
一般有 4 中首部:
- 通用首部
- 請求首部
- 響應(yīng)首部
- 實體首部
對報文編碼
編碼可以提升傳輸速率。
報文主體和實體主體的差異
-
報文(message)
是 HTTP 通信中的基本單位购岗,由 8 位組字節(jié)流組成汰聋,通過 HTTP 通信傳輸。
-
實體(entity)
作為請求或響應(yīng)的有效載荷數(shù)據(jù)被傳輸喊积。內(nèi)容由實體首部和實體主體構(gòu)成烹困。
什么是實體?
通常乾吻,報文主體等于實體主體髓梅。只有在傳輸中進(jìn)行編碼操作時拟蜻,實體主體的內(nèi)容發(fā)生變化,才導(dǎo)致它和報文主體產(chǎn)生差異枯饿。
壓縮傳輸?shù)膬?nèi)容
由服務(wù)器端對響應(yīng)進(jìn)行壓縮酝锅,后由客戶端進(jìn)行解碼。
常用的內(nèi)容編碼有以下幾種:
- gzip(GNU zip)
- compress(UNIX 系統(tǒng)的標(biāo)準(zhǔn)壓縮)
- deflate(zlib)
- identity(不進(jìn)行編碼)
將大數(shù)據(jù)分塊
在 HTTP 通信過程中奢方,請求的編碼實體資源尚未完全傳輸完成之前搔扁,瀏覽器無法顯示請求頁面。在傳輸大容量數(shù)據(jù)時袱巨,通過把數(shù)據(jù)分成多塊阁谆,能夠讓瀏覽器逐步顯示頁面。
這種把實體主體分塊的功能成為分塊傳輸編碼愉老。
多部分對象集合
HTTP 協(xié)議中采納了多部分對象集合场绿,發(fā)送的一份報文主體可含有多類型實體。通常在圖片或文本文件等上傳時使用嫉入。
-
multipart/form-data
在 Web 表單文件上傳時使用焰盗。
-
multipart/byteranges
狀態(tài)碼 206(partial Content,部分內(nèi)容)響應(yīng)報文包含了多個范圍的內(nèi)容時使用咒林。
獲取部分內(nèi)容的范圍請求
為了實現(xiàn)因下載中斷而恢復(fù)下載的功能熬拒,需要指定下載的實體范圍。
執(zhí)行請求范圍時垫竞,會用到首部字段 Range 來指定資源的 byte 范圍澎粟。
內(nèi)容協(xié)商
當(dāng)瀏覽器的默認(rèn)語言為英語或中文,訪問相同的 URI 的 WEB 頁面時欢瞪,則會顯示對應(yīng)的英語版或中文版的 WEB 頁面活烙。這樣的機(jī)制成為內(nèi)容協(xié)商。
內(nèi)容協(xié)商技術(shù)的 3 中類型:
-
服務(wù)器驅(qū)動協(xié)商
由服務(wù)器進(jìn)行內(nèi)容協(xié)商
-
客戶端驅(qū)動協(xié)商
由客戶端進(jìn)行內(nèi)容協(xié)商
-
透明協(xié)商
是服務(wù)器驅(qū)動和客戶端驅(qū)動的結(jié)合體