Http的演进
Http的演進
Http在1.1版本之前具有無狀態(tài)的特點,每次請求都需要通過TCP三次握手四次揮手與服務器重新建立連接。比如某個客戶端在短時間多次請求同一個資源,服務器并不能區(qū)別是否已經(jīng)響應過用戶請求,所以每次需要重新響應請求、耗費不必要的時間和流量。為了節(jié)省資源消耗,Http也進行了發(fā)展和演進,通過持久連接的方法來進行連接復用。
Http的1.0版本
? 第一個版本的Http是Http0.9,組成極其簡單,只允許客戶端發(fā)送Get這一種請求,且不支持請求頭。由于沒有協(xié)議頭,因此Http0.9協(xié)議只支持一種內(nèi)容,即純文本。不過網(wǎng)頁依然支持用html語言格式化,同時無法插入圖片。
? http的第二個版本為1.0版本,也是第一個在通信中指定版本號的Http版本,至今依然被廣泛采用。相對于Http0.9版本,Http1.0版本增加了如下主要特性:
? (1) 請求與響應支持頭部字段
(2) 響應對象以一個響應狀態(tài)行開始。
(3) 響應對象不只限于超文本。
(4) 開始支持客戶端通過Post方法向web服務器提交數(shù)據(jù),支持GET、Head、Post方法
(5) 支持長連接,但默認使用短連接,緩存機制,以及身份認證。
(6) 請求行必須在尾部添加協(xié)議版本字段(Http1.0),必須包含頭部消息。
? http請求訪問的資源不再局限上一個版本的Html格式,可以根據(jù)Content-Type設置訪問的格式;同時也開始支持Cache。當客戶端在規(guī)定時間內(nèi)訪問同一URL資源時,直接訪問Cache即可。
http請求訪問的資源不再局限上一個版本的Html格式,可以根據(jù)Content-Type設置訪問的格式;同時也開始支持Cache。當客戶端在規(guī)定時間內(nèi)訪問同一URL資源時,直接訪問Cache即可。
MIME類型的每個值包括一級類型和二級類型,之間用斜杠分隔。除了預定義的類型,廠商也可以自定義類型,例如下面是一個自定義類型的例子:
application/vnd.debian.binary-package
上面的自定義MIME類型表明發(fā)送的是Debian系統(tǒng)的二進制數(shù)據(jù)包。
MIME類型值還可以在尾部使用分號、添加參數(shù),下面是一個添加參數(shù)的例子:
Content-type: text/html;charset=utf-8
上面的類型值表面Http報文中的報文中的內(nèi)容是文本網(wǎng)頁數(shù)據(jù),并且文本編碼為utf-8
客戶端在發(fā)送請求時可以使用Accept頭部字段聲明自己可以接受哪些數(shù)據(jù)格式。下面是一個Accept的例子:
Accept: */*
上面的Accept頭部字段表明客戶端聲明自己可以接受來自服務端的任何格式的數(shù)據(jù)。
由于文本數(shù)據(jù)發(fā)送的時候往往可以通過壓縮大大節(jié)省帶寬,因此Http1.0版本協(xié)議可以支持把數(shù)據(jù)壓縮后發(fā)送,其報文Content-Encoding頭部用于說明數(shù)據(jù)的壓縮格式。
http的1.1版本
Http1.1版本引入了許多關鍵技術:持久連接、管道機制、分塊傳輸編碼、字節(jié)范圍請求等。
持久連接:即下層的TCP連接默認不關閉,可以被多個請求復用。
管道機制:在同一個tcp連接里允許多個請求同時發(fā)送,但是服務器還是按照順序依次處理。(類似于前端同時發(fā)送兩個請求給后端)
http1.1新增了put、patch、options、delete等多種請求方法。
http1.1版本客戶端請求的頭部信息新增了host字段,用來指定服務器的域名,還加了一個新的狀態(tài)碼100.(比如404之類的)
分塊傳輸編碼:該機制允許服務端將數(shù)據(jù)分成多個部分發(fā)送到客戶端。普通的服務器響應會將響應數(shù)據(jù)的長度通過Content-Length字段告訴客戶端。它主要是用Transfer-Encoding字段
Transfer-Encoding:chunked
每個分塊包含十六進制的長度值和數(shù)據(jù),其中長度值獨占一行。長度不包括分塊長度和(\r\n)的長度,也不包括分塊數(shù)據(jù)后面結(jié)尾(\r\n)的長度。
最后一個分塊的長度值必須為0,對應的分塊數(shù)據(jù)沒有內(nèi)容,表示所有的body數(shù)據(jù)傳輸完成。
Http的2.0版本
它是一個二進制協(xié)議,傳輸效率明顯提高,但是這樣需要客戶端和服務端都要引入新的二進制編碼和解碼的機制。
Protobuf,各位可以去了解一下。
好了,感興趣的話,可以看看寶寶之前的博客嗎0.0
參考文獻:java高并發(fā)核心編程 Nio、netty、redis、zookeeper 作者:尼恩
總結(jié)
- 上一篇: AR9271无线网卡Win10配置热点
- 下一篇: 提升生产力:是时候升级你的命令行工具了