本文為學(xué)習(xí)總結(jié)篇秘案,原文出自公眾號(hào):Hollis砰苍,感謝閱讀~
一潦匈、HTTP協(xié)議簡介
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式赚导、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議茬缩。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。通過HTTP或者HTTPS協(xié)議請(qǐng)求的資源由統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers吼旧,URI)來標(biāo)識(shí)凰锡。
HTTP 協(xié)議是以 ASCII 碼傳輸,基于請(qǐng)求與響應(yīng)模式的圈暗、無狀態(tài)的掂为,建立在 TCP/IP 協(xié)議之上的應(yīng)用層規(guī)范。它不涉及數(shù)據(jù)包(packet)傳輸(不直接傳輸數(shù)據(jù)報(bào))员串,主要規(guī)定了客戶端和服務(wù)器之間的通信格式勇哗,默認(rèn)使用80端口。
HTTP協(xié)議主要的版本有3個(gè)昵济,分別是HTTP/1.0智绸、HTTP/1.1和HTTP/2。HTTPS是另外一個(gè)協(xié)議访忿,簡單講是HTTP的安全版瞧栗。
二、HTTP/1.0與HTTP/1.1
1996年5月海铆,HTTP/1.0 版本發(fā)布迹恐,為了提高系統(tǒng)的效率,HTTP/1.0規(guī)定瀏覽器與服務(wù)器只保持短暫的連接卧斟,瀏覽器的每次請(qǐng)求都需要與服務(wù)器建立一個(gè)TCP連接殴边,服務(wù)器完成請(qǐng)求處理后立即斷開TCP連接,服務(wù)器不跟蹤每個(gè)客戶也不記錄過去的請(qǐng)求。
請(qǐng)注意上面提到的HTTP/1.0中瀏覽器與服務(wù)器只保持短暫的連接,連接無法復(fù)用合呐。也就是說每個(gè)TCP連接只能發(fā)送一個(gè)請(qǐng)求。發(fā)送數(shù)據(jù)完畢是偷,連接就關(guān)閉,如果還要請(qǐng)求其他資源募逞,就必須再新建一個(gè)連接蛋铆。
我們知道TCP連接的建立需要三次握手,是很耗費(fèi)時(shí)間的一個(gè)過程放接。所以刺啦,HTTP/1.0版本的性能比較差。現(xiàn)在纠脾,隨便打開一個(gè)網(wǎng)頁玛瘸,上面都會(huì)有很多圖片蜕青、視頻等資源,HTTP/1.0顯然無法滿足性能要求捧韵。
為了解決HTTP/1.0存在的缺陷市咆,HTTP/1.1于1999年誕生。相比較于HTTP/1.0來說再来,最主要的改進(jìn)就是引入了持久連接。所謂的持久連接就是:在一個(gè)TCP連接上可以傳送多個(gè)HTTP請(qǐng)求和響應(yīng)磷瘤,減少了建立和關(guān)閉連接的消耗和延遲芒篷。
引入了持久連接之后,在性能方面采缚,HTTP協(xié)議有了明顯的提升针炉,基本可以用于日常使用,這也是這一版本一直延用至今的原因扳抽。當(dāng)然還是有些力不從心的篡帕,后面會(huì)詳細(xì)介紹。
三贸呢、HTTP/2.0
下圖是Akamai 公司建立的一個(gè)官方的演示镰烧,主要用來說明在性能上HTTP/1.1和HTTP/2在性能升的差別。同時(shí)請(qǐng)求 379 張圖片楞陷,HTTP/1.1加載用時(shí)4.54s怔鳖,HTTP/2加載用時(shí)1.47s。
HTTP/2 是 HTTP 協(xié)議自 1999 年 HTTP 1.1 發(fā)布后的首個(gè)更新固蛾,主要基于 SPDY 協(xié)議结执。由互聯(lián)網(wǎng)工程任務(wù)組(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小組進(jìn)行開發(fā)。該組織于2014年12月將HTTP/2標(biāo)準(zhǔn)提議遞交至IESG進(jìn)行討論艾凯,于2015年2月17日被批準(zhǔn)献幔。HTTP/2標(biāo)準(zhǔn)于2015年5月以RFC 7540正式發(fā)表。
HTTP/2相對(duì)于HTTP/1.1的改進(jìn)主要如下:
二進(jìn)制分幀
在HTTP/2中趾诗,在應(yīng)用層(HTTP2.0)和傳輸層(TCP或者UDP)之間加了一層:二進(jìn)制分幀層蜡感。這是HTTP2中最大的改變。HTTP2之所以性能會(huì)比HTTP1.1有那么大的提高沧竟,很大程度上正是由于這一層的引入铸敏。
在二進(jìn)制分幀層中, HTTP/2 會(huì)將所有傳輸?shù)男畔⒎指顬楦〉南⒑蛶╢rame),并對(duì)它們采用二進(jìn)制格式的編碼悟泵。
這種單連接多資源的方式杈笔,減少了服務(wù)端的壓力,使得內(nèi)存占用更少糕非,連接吞吐量更大蒙具。而且球榆,TCP連接數(shù)的減少使得網(wǎng)絡(luò)擁塞狀況得以改善,同時(shí)慢啟動(dòng)時(shí)間的減少禁筏,使擁塞和丟包恢復(fù)速度更快持钉。
多路復(fù)用
多路復(fù)用允許同時(shí)通過單一的HTTP/2.0連接發(fā)起多重的請(qǐng)求-響應(yīng)消息。在HTTP1.1協(xié)議中篱昔,瀏覽器客戶端在同一時(shí)間每强,針對(duì)同一域名下的請(qǐng)求有一定數(shù)量的限制,超過了這個(gè)限制的請(qǐng)求就會(huì)被阻塞州刽。而多路復(fù)用允許同時(shí)通過單一的 HTTP2.0 連接發(fā)起多重的“請(qǐng)求-響應(yīng)”消息空执。
HTTP2的請(qǐng)求的TCP的connection一旦建立,后續(xù)請(qǐng)求以stream的方式發(fā)送穗椅。每個(gè)stream的基本組成單位是frame(二進(jìn)制幀)辨绊。客戶端和服務(wù)器可以把 HTTP 消息分解為互不依賴的幀匹表,然后亂序發(fā)送门坷,最后再在另一端把它們重新組合起來。
也就是說袍镀, HTTP2.0 通信都在一個(gè)連接上完成默蚌,這個(gè)連接可以承載任意數(shù)量的雙向數(shù)據(jù)流流椒。就好比,請(qǐng)求一個(gè)頁面 http://www.hollischuang.com 宣虾。頁面上所有的資源請(qǐng)求都是客戶端與服務(wù)器上的一條 TCP 上請(qǐng)求和響應(yīng)的惯裕!
header壓縮
HTTP/1.1的header帶有大量信息,而且每次都要重復(fù)發(fā)送绣硝。HTTP/2 為了減少這部分開銷蜻势,采用了HPACK 頭部壓縮算法對(duì)Header進(jìn)行壓縮。
服務(wù)端推送
簡單來講就是當(dāng)用戶的瀏覽器和服務(wù)器在建立連接后鹉胖,服務(wù)器主動(dòng)將一些資源推送給瀏覽器并緩存起來的機(jī)制握玛。有了緩存,當(dāng)瀏覽器想要訪問已緩存的資源的時(shí)候就可以直接從緩存中讀取了甫菠。
備注:更多關(guān)于HTTP協(xié)議的資料請(qǐng)參考網(wǎng)上其他博文喔~