HTTP協(xié)議各版本的區(qū)別,你知道嗎?
引子
HTTP協(xié)議已經(jīng)有多個(gè)版本了,一般情況我們?cè)L問(wèn)的網(wǎng)站要是HTTP1.1要么是HTTP2,它們有什么區(qū)別呢? 為什么各個(gè)網(wǎng)站不統(tǒng)一使用同一種協(xié)議呢?
版本
截止到現(xiàn)在,IETF已經(jīng)發(fā)布了5個(gè)HTTP協(xié)議了,包括HTTP0.9、HTTP1.0、HTTP1.1、HTTP2、HTTP3.下面講一下各個(gè)版本的區(qū)別:
HTTP0.9
1991年發(fā)布, 沒(méi)有header,功能非常簡(jiǎn)單,只支持GET。
HTTP1.0
1996年發(fā)布,明文傳輸安全性差,header特別大。它相對(duì)0.9有以下增強(qiáng):
- 增加了header(使用元數(shù)據(jù)與數(shù)據(jù)解耦)
- 增加了status code,用于聲明請(qǐng)求的結(jié)果。
- content-type可以傳輸其它文件。
- 請(qǐng)求頭增加了http/1.0版本號(hào)。
缺點(diǎn):每請(qǐng)求一次資源就新建一次tcp連接
HTTP1.1
1997發(fā)布,是現(xiàn)在使用最廣泛的版本。它相對(duì)1.0有以下增強(qiáng):
- 可以設(shè)置keepalive讓http重用tcp連接(請(qǐng)求必需串行發(fā)送)
- 支持pipeline傳輸,請(qǐng)求發(fā)出后可以繼續(xù)發(fā)送請(qǐng)求
- 增加了HOST頭,讓服務(wù)端知道用戶請(qǐng)求的是哪個(gè)域名
- 增加了type、language、encoding等header
2014年更新了內(nèi)容:
- 增加了TLS支持,即https傳輸
- 支持四種模型:短連接,可重用tcp的長(zhǎng)鏈接,服務(wù)端push模型(服務(wù)端主動(dòng)將數(shù)據(jù)推送到客戶端cache中),websocket模型
缺點(diǎn):還是文本協(xié)議,客戶端服務(wù)端都需要利用cpu解壓縮
HTTP2
2015年發(fā)布,主要是提升安全性與性能。它相對(duì)1.1的增強(qiáng)有:
- 頭部壓縮(合并同時(shí)發(fā)出請(qǐng)求的相同部分)
- 二進(jìn)制分幀傳輸,更方便頭部只傳輸差異部分
- 流多路復(fù)用,同一服務(wù)下只需要用一個(gè)連接,節(jié)省了連接
- 服務(wù)器推送,一次客戶端請(qǐng)求服務(wù)端可以多次響應(yīng)。
- 可以在一個(gè)tcp連接中并發(fā)發(fā)送請(qǐng)求
缺點(diǎn):基于tcp傳輸,會(huì)有隊(duì)頭阻塞問(wèn)題(丟包停止窗口滑動(dòng)),tcp會(huì)丟包重傳。tcp握手延時(shí)長(zhǎng),協(xié)議僵化問(wèn)題。
HTTP3
2018年發(fā)布,基于谷歌的QUIC,底層使用udp代碼tcp協(xié)議,
這樣解決了隊(duì)頭阻塞問(wèn)題,同樣無(wú)需握手,性能大大地提升,默認(rèn)使用tls加密。