http1、http1.1和http2的區(qū)別

1. HTTP的基本優(yōu)化方向

影響一個(gè)HTTP網(wǎng)絡(luò)請(qǐng)求的因素主要有2個(gè):帶寬和延遲

  • 帶寬,如果我們還在撥號(hào)上網(wǎng)的時(shí)代,那么帶寬是一個(gè)比較重要的制約因素。但是現(xiàn)在的網(wǎng)絡(luò)建設(shè)使得帶寬得到很大的提升,我們不會(huì)擔(dān)心帶寬而影響網(wǎng)速。
  • 延遲
    • 瀏覽器阻塞(HOL blocking):瀏覽器會(huì)因?yàn)橐恍┰蜃枞?qǐng)求。瀏覽器對(duì)于同一個(gè)域名,只能同時(shí)有4個(gè)連接(這個(gè)根據(jù)瀏覽器內(nèi)核不同可能會(huì)有所差異),超過(guò)瀏覽器最大連接數(shù)限制,后續(xù)請(qǐng)求就會(huì)被阻塞
    • DNS查詢(xún)(DNS lookup):瀏覽器需要知道目標(biāo)服務(wù)器的IP才能建立鏈接。將域名解析為IP的這個(gè)系統(tǒng)就是DNS。這個(gè)通??梢岳肈NS緩存來(lái)達(dá)到減少時(shí)間的目的。
    • 建立連接(Initial connection):HTTP是基于TCP來(lái)寫(xiě)一的,瀏覽器最快要再第三次握手時(shí)才能捎帶HTTP請(qǐng)求報(bào)文,達(dá)到真正的建立連接,但是這些連接無(wú)法復(fù)用會(huì)導(dǎo)致每次請(qǐng)求都經(jīng)歷三次握手和慢啟動(dòng)。三次握手在高延遲的情況下影響比較明顯,而慢啟動(dòng)對(duì)文件類(lèi)大請(qǐng)求影響較大

2. http1.0和http1.1的區(qū)別

主要區(qū)別體現(xiàn)在緩存處理:
1??緩存處理。
在http1.0中主要使用header的if-modified-since/expires來(lái)做緩存的判斷依據(jù)。
http1.1引入了更多的緩存策略控制策略。比如Entity tag,If-Unmodified-Since,If-match,If-None-Match等更多可供選擇的緩存頭來(lái)控制緩存。
2??帶寬優(yōu)化及網(wǎng)絡(luò)連接的使用。
HTTP1.0中存在一些浪費(fèi)帶寬的現(xiàn)象。例如客戶(hù)端只需要某個(gè)對(duì)象中的一部分,服務(wù)器端卻把整個(gè)對(duì)象送過(guò)來(lái)了,并且不能支持?jǐn)帱c(diǎn)續(xù)傳的功能。
HTTP1.1在請(qǐng)求頭中引入了range頭域,它允許只請(qǐng)求資源中的某一部分,即返回碼是206(partial content)。方便開(kāi)發(fā)者的自由選擇、節(jié)省帶寬。
3??錯(cuò)誤通知的管理。
在HTTP1.1中新增了24個(gè)錯(cuò)誤狀態(tài)響應(yīng)碼。如409(conflict)表示請(qǐng)求的資源與資源當(dāng)前的狀態(tài)發(fā)生沖突,401(gone)表示服務(wù)器上的資源被永久的刪除。
4??host頭處理。
在HTTP1.0中認(rèn)為每一個(gè)服務(wù)器都綁定一個(gè)ip地址,因此請(qǐng)求消息頭中并沒(méi)有傳遞主機(jī)名(hostname)。
但是隨著虛擬主機(jī)技術(shù)的發(fā)展,在一臺(tái)物理服務(wù)器上可以存在多臺(tái)虛擬主機(jī),并且他們共享一個(gè)ip地址。
HTTP1.1中請(qǐng)求和響應(yīng)都支持host頭域,且請(qǐng)求消息中如果沒(méi)有host頭域會(huì)報(bào)錯(cuò)(400bad request)
5??長(zhǎng)鏈接
HTTP1.1支持長(zhǎng)鏈接和請(qǐng)求的流水線處理,在一個(gè)TCP連接上可以傳送多個(gè)HTTP請(qǐng)求和響應(yīng),減少了建立多個(gè)連接的消耗和延遲。在HTTP1.1中默認(rèn)打開(kāi)onnection:keep-alive,在一定程度上彌補(bǔ)了http1.0每次請(qǐng)求都要重新連接的缺陷。

3. HTTPS和HTTP的區(qū)別

  • HTTPS需要到CA申請(qǐng)證書(shū),免費(fèi)證書(shū)很少,一般需要收費(fèi)
  • HTTP協(xié)議運(yùn)行TCP之上,所有傳輸?shù)膬?nèi)容都是明文的,HTTPS運(yùn)行在SSL/TLS上,SSL/TLS運(yùn)行在tcp上,所有傳輸?shù)膬?nèi)容都是加密的。
  • HTTP和HTTPS用的是完全不同的連接方式,端口也不同。前者是80,后者是443。
  • HTTPS可以有效的防止運(yùn)營(yíng)商劫持,解決了防劫持的一大問(wèn)題。
    HTTPS與HTTP最大的差距就是,HTTPS是運(yùn)行在SSL/TLS之上,而SSL/TLS運(yùn)行在tcp上。

4. SPDY:HTTP1.x的優(yōu)化

SPDY優(yōu)化了HTTP1.x的請(qǐng)求延遲,解決了HTTP1.x的安全性

  1. 降低延遲
    針對(duì)HTTP高延遲的問(wèn)題,SPDY采取了多路復(fù)用(multiplexing)。多路復(fù)用通過(guò)多個(gè)請(qǐng)求stream共享一個(gè)tcp連接的方式,解決了HOL blocking問(wèn)題,降低了延遲同時(shí)提高了帶寬的利用率。
  2. 請(qǐng)求優(yōu)先級(jí)
    多路復(fù)用帶來(lái)一個(gè)新的問(wèn)題是,在連接共享的基礎(chǔ)之上有可能導(dǎo)致關(guān)鍵請(qǐng)求被阻塞。SPDY允許給每個(gè)請(qǐng)求設(shè)置優(yōu)先級(jí),重要的請(qǐng)求就會(huì)優(yōu)先得到響應(yīng)。
  3. header壓縮
    HTTP1.x的header很多都是重復(fù)多余的。選擇合適的壓縮算法可以減少包的大小和數(shù)量。
  4. 基于HTTPS的加密協(xié)議傳輸
    提高傳輸數(shù)據(jù)的可靠性
  5. 服務(wù)端推送(server push)
    采用了SPDY的網(wǎng)頁(yè),例如網(wǎng)頁(yè)中有一個(gè)style.css的請(qǐng)求,愛(ài)客戶(hù)端收到style.css數(shù)據(jù)的同時(shí),服務(wù)端會(huì)將style.js的文件推給客戶(hù)端。當(dāng)客戶(hù)端收到再次嘗試style.js的時(shí)候就可以直接讀取緩存,不用再發(fā)送請(qǐng)求。

SPDY的構(gòu)成圖


SPDY的構(gòu)成圖

SPDY位于HTTP之下,TCP和SSL之上,這樣就可以輕松兼容老版本的HTTP協(xié)議,同時(shí)可以使用已有的SSL功能

5. HTTP2.0性能驚人

HTTP2的性能比HTTP1.1好很多,這里是Akamai公司的一個(gè)官方演示

demo展示的效果

6. HTTP2.0: SPDY的升級(jí)版

HTTP2.0可以說(shuō)是SPDY的升級(jí)版(原本也是基于SPDY設(shè)計(jì)的),但是兩者還是有一些區(qū)別:

  1. HTTP2.0支持明文HTTP傳輸,而SPDY強(qiáng)制使用HTTPS(加密傳輸)
  2. HTTP2.0消息頭的壓縮算法才有HPACK, SPDY采用的是DEFLATE

7. HTTP2.0和HTTP1.X相比的新特性

  • 解析格式不同,http2.0是采用二進(jìn)制格式
    HTTP1.X的解析是基于文本,基于文本協(xié)議的格式解析存在天然缺陷,文本的表現(xiàn)形式有多樣性,要做到健壯要考慮的場(chǎng)景必然很多。
    HTTP2.0采用的是二進(jìn)制格式,只認(rèn)0和1的組合。實(shí)現(xiàn)方便且健壯
  • 多路復(fù)用,即連接共享
    HTTP2.0每一個(gè)request都是用作連接共享機(jī)制的。一個(gè)request對(duì)應(yīng)一個(gè)id,這樣一個(gè)連接上可以有多個(gè)request,每個(gè)連接的request可以隨機(jī)的混雜在一起,接收方可以根據(jù)request的id將request再歸屬到不同的服務(wù)端請(qǐng)求里面、
    -- header壓縮
    HTTP1.X的header里面帶有大量的信息,每次請(qǐng)求都要重復(fù)發(fā)送。
    HTTP2.0使用encoder來(lái)減少需要傳輸?shù)膆eader大小,通訊雙方各自cache一份header fields表,即避免了重復(fù)header的傳輸,又減少了需要傳輸?shù)拇笮 ?/li>
  • 服務(wù)端推送(server push)

8. HTTP2.0的升級(jí)改造

  • 前文說(shuō)了HTTP2.0其實(shí)可以支持非HTTPS的,但是現(xiàn)在主流的瀏覽器像chrome、firefox表示還是只支持基于TLS部署的HTTP2.0協(xié)議,所以想升級(jí)成HTTP2.0還是先升級(jí)成HTTPS
  • 當(dāng)網(wǎng)站升級(jí)成HTTPS之后,升級(jí)成HTTP2.0就簡(jiǎn)單很多,如果使用nginx只要在配置文件中啟用相應(yīng)的協(xié)議即可。
  • 使用了HTTP2.0之后原本的HTTP1.X不用擔(dān)心。因?yàn)镠TTP2.0完全兼容HTTP1.X的語(yǔ)義,對(duì)于不支持HTTP2.0的瀏覽器。nginx會(huì)自動(dòng)向下兼容。

HTTP2.0的多路復(fù)用和HTTP1.X的長(zhǎng)連接復(fù)用有什么區(qū)別

  • HTTP/1.X一次請(qǐng)求-響應(yīng),建立一個(gè)連接,用完關(guān)閉;每一個(gè)請(qǐng)求都要建立一個(gè)連接。
  • HTTP1.1 pipeling解決方式為,若干個(gè)請(qǐng)求排隊(duì)串行化單線程處理,后面的請(qǐng)求等待前面請(qǐng)求的返回才能獲得執(zhí)行機(jī)會(huì),一旦有某請(qǐng)求超時(shí),后續(xù)請(qǐng)求只能被阻塞,毫無(wú)辦法,也就是人們常說(shuō)的線頭阻塞。
  • HTTP/2多個(gè)請(qǐng)求可能在同一個(gè)連接上并行執(zhí)行。某個(gè)請(qǐng)求任務(wù)耗時(shí)嚴(yán)重,不會(huì)影響到其他連接的正常執(zhí)行、


    HTTP1.1和HTTP2.0

服務(wù)器推送是什么?

服務(wù)器推送能把客戶(hù)端所需要的資源伴隨index.html一起發(fā)送到客戶(hù)端,省去了客戶(hù)端重復(fù)請(qǐng)求的步驟。正因?yàn)闆](méi)有發(fā)起請(qǐng)求,建立連接等操作,所以靜態(tài)資源通過(guò)服務(wù)器推送的方式可以極大地提升速度。

為什么需要頭部壓縮

假定一個(gè)頁(yè)面有100個(gè)資源需要加載,每一次請(qǐng)求都有1kb的消息頭,則至少需要消耗100kb來(lái)獲取這些請(qǐng)求頭。HTTP2.0維護(hù)一個(gè)字典,差量更新HTTP頭部,大大降低因頭部傳輸產(chǎn)生的流量。

HTTP2.0多路復(fù)用

HTTP優(yōu)化的性能并不在于高帶寬,而是低延遲。TCP連接會(huì)隨著時(shí)間進(jìn)行自我調(diào)諧,起初會(huì)限制連接的最大速度,如果數(shù)據(jù)傳輸成功,會(huì)隨著時(shí)間的推移提高傳輸?shù)乃俣?。這種調(diào)諧叫做TCP的慢啟動(dòng)。由于這種原因,讓原本就具有突發(fā)性和短時(shí)性的HTTP連接變得十分低效。
HTTP/2讓所有的數(shù)據(jù)流共用同一個(gè)連接,可以更有效地使用TCP連接,讓高帶寬也能真正的服務(wù)于HTTP的性能提升。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容