HTTP2协议的发展与使用
簡介
超文本傳輸協(xié)議(HTTP)是管理服務(wù)器與網(wǎng)站訪問者瀏覽器之間連接的協(xié)議,自1999年第一次使用以來,這個協(xié)議承諾為每個人提供更快的網(wǎng)站。
HTTP是一種舊協(xié)議,最初定義于1991年,最后一次主要修訂版 - HTTP /1.1–于1999年發(fā)布。
1999年的網(wǎng)站與我們今天開發(fā)的網(wǎng)站截然不同,在http2解釋中,Daniel Sternberg指出,加載普通網(wǎng)站主頁所需的數(shù)據(jù)量為1.9 MB,顯示頁面需要100多個獨立資源 - “資源”是指來自圖像或字體的任何內(nèi)容到JavaScript或CSS文件。
HTTP1.0和HTTP1.1的一些區(qū)別
HTTP1.0最早在網(wǎng)頁中使用是在1996年,那個時候只是使用一些較為簡單的網(wǎng)頁上和網(wǎng)絡(luò)請求上,而HTTP1.1則在1999年才開始廣泛應(yīng)用于現(xiàn)在的各大瀏覽器網(wǎng)絡(luò)請求中,同時HTTP1.1也是當(dāng)前使用最為廣泛的HTTP協(xié)議。 主要區(qū)別主要體現(xiàn)在:
- 緩存處理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標(biāo)準(zhǔn),HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
- 帶寬優(yōu)化及網(wǎng)絡(luò)連接的使用,HTTP1.0中,存在一些浪費帶寬的現(xiàn)象,例如客戶端只是需要某個對象的一部分,而服務(wù)器卻將整個對象送過來了,并且不支持?jǐn)帱c續(xù)傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發(fā)者自由的選擇以便于充分利用帶寬和連接。
- 錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態(tài)響應(yīng)碼,如409(Conflict)表示請求的資源與資源的當(dāng)前狀態(tài)發(fā)生沖突;410(Gone)表示服務(wù)器上的某個資源被永久性的刪除。
- Host頭處理,在HTTP1.0中認(rèn)為每臺服務(wù)器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機(jī)名(hostname)。但隨著虛擬主機(jī)技術(shù)的發(fā)展,在一臺物理服務(wù)器上可以存在多個虛擬主機(jī)(Multi-homed Web Servers),并且它們共享一個IP地址。HTTP1.1的請求消息和響應(yīng)消息都應(yīng)支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
- 長連接,HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應(yīng),減少了建立和關(guān)閉連接的消耗和延遲,在HTTP1.1中默認(rèn)開啟Connection: keep-alive,一定程度上彌補(bǔ)了HTTP1.0每次請求都要創(chuàng)建連接的缺點。以下是常見的HTTP1.0:
HTTP的基本優(yōu)化
影響一個HTTP網(wǎng)絡(luò)請求的因素主要有兩個:帶寬和延遲。
- 帶寬:如果說我們還停留在撥號上網(wǎng)的階段,帶寬可能會成為一個比較嚴(yán)重影響請求的問題,但是現(xiàn)在網(wǎng)絡(luò)基礎(chǔ)建設(shè)已經(jīng)使得帶寬得到極大的提升,我們不再會擔(dān)心由帶寬而影響網(wǎng)速,那么就只剩下延遲了。
- 延遲:
- 瀏覽器阻塞(HOL blocking):瀏覽器會因為一些原因阻塞請求。瀏覽器對于同一個域名,同時只能有 4 個連接(這個根據(jù)瀏覽器內(nèi)核不同可能會有所差異),超過瀏覽器最大連接數(shù)限制,后續(xù)請求就會被阻塞。
- DNS 查詢(DNS Lookup):瀏覽器需要知道目標(biāo)服務(wù)器的 IP 才能建立連接。將域名解析為 IP 的這個系統(tǒng)就是 DNS。這個通常可以利用DNS緩存結(jié)果來達(dá)到減少這個時間的目的。
- 建立連接(Initial connection):HTTP 是基于 TCP 協(xié)議的,瀏覽器最快也要在第三次握手時才能捎帶 HTTP 請求報文,達(dá)到真正的建立連接,但是這些連接無法復(fù)用會導(dǎo)致每次請求都經(jīng)歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對文件類大請求影響較大。
HTTP1.0和1.1現(xiàn)存的一些問題
- HTTP1.x在傳輸數(shù)據(jù)時,每次都需要重新建立連接,無疑增加了大量的延遲時間,特別是在移動端更為突出。
- HTTP1.x在傳輸數(shù)據(jù)時,所有傳輸?shù)膬?nèi)容都是明文,客戶端和服務(wù)器端都無法驗證對方的身份,這在一定程度上無法保證數(shù)據(jù)的安全性。
- HTTP1.x在使用時,header里攜帶的內(nèi)容過大,在一定程度上增加了傳輸?shù)某杀?#xff0c;并且每次請求header基本不怎么變化,尤其在移動端增加用戶流量。
- 雖然HTTP1.x支持了keep-alive,來彌補(bǔ)多次創(chuàng)建連接產(chǎn)生的延遲,但是keep-alive使用多了同樣會給服務(wù)端帶來大量的性能壓力,并且對于單個文件被不斷請求的服務(wù)(例如圖片存放網(wǎng)站),keep-alive可能會極大的影響性能,因為它在文件被請求之后還保持了不必要的連接很長時間。
HTTPS應(yīng)聲而出
為了解決以上問題,網(wǎng)景在1994年創(chuàng)建了HTTPS,并應(yīng)用在網(wǎng)景導(dǎo)航者瀏覽器中。
最初,HTTPS是與SSL一起使用的;在SSL逐漸演變到TLS時(其實兩個是一個東西,只是名字不同而已),最新的HTTPS也由在2000年五月公布的RFC 2818正式確定下來。簡單來說,HTTPS就是安全版的HTTP,并且由于當(dāng)今時代對安全性要求更高,chrome和firefox都大力支持網(wǎng)站使用HTTPS,蘋果也在ios 10系統(tǒng)中強(qiáng)制app使用HTTPS來傳輸數(shù)據(jù),由此可見HTTPS勢在必行。
HTTPS與HTT
- HTTPS協(xié)議需要到CA申請證書,一般免費證書很少,需要交費。
- HTTP協(xié)議運行在TCP之上,所有傳輸?shù)膬?nèi)容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,所有傳輸?shù)膬?nèi)容都經(jīng)過加密的。
- HTTP和HTTPS使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- HTTPS可以有效的防止運營商劫持,解決了防劫持的一個大問題。
SPDY
2009年,Google的兩名工程師發(fā)布了他們一直在研究的名為SPDY的研究項目,該項目解決了HTTP/1.1中的一些問題。SPDY開始:
-
允許跨單個TCP連接的并發(fā)請求,稱為多路復(fù)用;
-
允許瀏覽器確定資產(chǎn)的優(yōu)先級,以便服務(wù)器首先發(fā)送對頁面顯示至關(guān)重要的資源;
-
壓縮和減少HTTP標(biāo)頭;
-
實現(xiàn)服務(wù)器推送,服務(wù)器可以在被要求之前將重要資源推送到瀏覽器。
此外,SPDY需要瀏覽器和服務(wù)器之間的加密(HTTPS)連接。
SPDY不替代HTTP;相反,它是協(xié)議的隧道,并修改現(xiàn)有HTTP請求和響應(yīng)的發(fā)送方式。它需要服務(wù)器和連接到該服務(wù)器的瀏覽器的支持。借助NGINX提供的支持以及Google提供的支持Apache的支持,可以合理地采用SPDY。瀏覽器支持也非常好,所有主流瀏覽器的現(xiàn)代版本都支持它。
我們已經(jīng)看到SPDY取得了一些成功,并獲得了服務(wù)器和瀏覽器的采用。但是,您可能也發(fā)現(xiàn),盡管支持Internet Explorer 11,但Microsoft的Edge瀏覽器已將其刪除。由于Microsoft實施了對HTTP協(xié)議(HTTP協(xié)議的最新版本)的支持,因此Edge中已經(jīng)刪除了對SPDY的支持。雖然其他當(dāng)前瀏覽器仍然支持SPDY,但Chrome在2016年取消支持,其他瀏覽器可能會跟進(jìn)。
HTTP2 引入
HTTP2建立在SPDY的成功基礎(chǔ)之上,SPDY被用作新協(xié)議的起點。因此,SPDY的大多數(shù)目標(biāo)都在HTTP2中得到滿足。已刪除對HTTPS連接的要求,也就是說,所有瀏覽器廠商都決定只為TLS(https)連接實施http2。因此,雖然可能在服務(wù)器到服務(wù)器通信中使用帶有明文的http2, 但我們向瀏覽器提供HTTP2的用例意味著需要讓站點在https上運行,然后才能考慮轉(zhuǎn)移到http2.
HTTP2規(guī)范于2015年2月完成,一年后,現(xiàn)代瀏覽器中支持這個協(xié)議非常出色,與SPDY一樣,HTTP2需要在瀏覽器和服務(wù)器級別上提供支持,已經(jīng)有許多Web服務(wù)器實現(xiàn)。
對于很多網(wǎng)站來說,遷移到HTTP / 2最難的事情可能根本不是HTTP / 2,而是要求通過安全連接運行網(wǎng)站。如果正在開發(fā)新網(wǎng)站或更新舊網(wǎng)站,第一步應(yīng)該是確保移至https開發(fā),這不僅對http/2很重要,Google使用安全連接作為排名信號,瀏覽器開始將非https鏈接標(biāo)記為“不安全”。將來你會發(fā)現(xiàn)一些強(qiáng)大的HTML5功能,例如地理定位,在沒有安全連接的情況下是不可用的。
如果網(wǎng)站目前只 http, 那么建議是先優(yōu)先遷移到https, 然后再決定http/2策略。
HTTP/2行動計劃
使用安全連接啟動或立即轉(zhuǎn)移到TLS這應(yīng)該是建站首要任務(wù)。
在構(gòu)建過程中準(zhǔn)備HTTP / 2。現(xiàn)在構(gòu)建的任何網(wǎng)站都可能會受益于在其生命周期內(nèi)針對HTTP / 2進(jìn)行優(yōu)化。
檢查你的主機(jī)。需要確保服務(wù)器支持HTTP / 2,與你的托管服務(wù)提供商或服務(wù)器管理員聯(lián)系,了解他們對HTTP / 2的優(yōu)化。
推出HTTP / 2優(yōu)化。一旦你的服務(wù)器支持HTTP / 2,其余的由你決定,停止使用舊的最佳做法并切換到新的。這意味著擁有不支持HTTP / 2的瀏覽器的用戶將獲得較慢的體驗,這就是為什么更改背后的驅(qū)動程序應(yīng)該是大多數(shù)人受益的轉(zhuǎn)折點。
當(dāng)轉(zhuǎn)移到HTTP / 2時,對速度增加進(jìn)行基準(zhǔn)測試以及查看哪些技術(shù)在網(wǎng)站上產(chǎn)生最大差異然后把HTTP / 2使用到最佳體驗。
HTTP2與SPDY的不同
HTTP2.0可以說是SPDY的升級版(其實原本也是基于SPDY設(shè)計的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下兩點:
- HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強(qiáng)制使用 HTTPS
- HTTP2.0 消息頭的壓縮算法采用 HPACK,而非 SPDY 采用的 DEFLATE
HTTP2的特點
- 新的二進(jìn)制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本協(xié)議的格式解析存在天然缺陷,文本的表現(xiàn)形式有多樣性,要做到健壯性考慮的場景必然很多,二進(jìn)制則不同,只認(rèn)0和1的組合。基于這種考慮HTTP2.0的協(xié)議解析決定采用二進(jìn)制格式,實現(xiàn)方便且健壯。
- 多路復(fù)用(MultiPlexing),即連接共享,即每一個request都是是用作連接共享機(jī)制的。一個request對應(yīng)一個id,這樣一個連接上可以有多個request,每個連接的request可以隨機(jī)的混雜在一起,接收方可以根據(jù)request的 id將request再歸屬到各自不同的服務(wù)端請求里面。多路復(fù)用原理圖:
- header壓縮,如上文中所言,對前面提到過HTTP1.x的header帶有大量信息,而且每次都要重復(fù)發(fā)送,HTTP2.0使用encoder來減少需要傳輸?shù)膆eader大小,通訊雙方各自cache一份header fields表,既避免了重復(fù)header的傳輸,又減小了需要傳輸?shù)拇笮 ?/li>
- 服務(wù)端推送(server push),同SPDY一樣,HTTP2.0也具有server push功能。目前,有大多數(shù)網(wǎng)站已經(jīng)啟用HTTP2.0,例如YouTuBe,淘寶網(wǎng)等網(wǎng)站,利用chrome控制臺可以查看是否啟用HTTP/2
HTTP1與HTTP2的不同
總結(jié)
以上是生活随笔為你收集整理的HTTP2协议的发展与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冬天开空调取暖出风口朝哪个方向更科学?蚂
- 下一篇: 清理Mac OSX中安装的nvidia