title: HTTPS和HTTP2.0詳解
date: 2018-05-21 14:19:31
tags:
- HTTP
- HTTPS
- HTTP2.0
categories: 深入http
HTTP的基本優(yōu)化
影響一個(gè)HTTP網(wǎng)絡(luò)請(qǐng)求的因素主要有兩個(gè):帶寬和延遲嘁信。
帶寬:如果說我們還停留在撥號(hào)上網(wǎng)的階段折柠,帶寬可能會(huì)成為一個(gè)比較嚴(yán)重影響請(qǐng)求的問題沸版,但是現(xiàn)在網(wǎng)絡(luò)基礎(chǔ)建設(shè)已經(jīng)使得帶寬得到極大的提升您旁,我們不再會(huì)擔(dān)心由帶寬而影響網(wǎng)速赢织,那么就只剩下延遲了允蚣。
延遲:
- 瀏覽器阻塞(HOL blocking):瀏覽器會(huì)因?yàn)橐恍┰蜃枞?qǐng)求粥血。瀏覽器對(duì)于同一個(gè)域名,同時(shí)只能有 4 個(gè)連接(這個(gè)根據(jù)瀏覽器內(nèi)核不同可能會(huì)有所差異)坪仇,超過瀏覽器最大連接數(shù)限制杂腰,后續(xù)請(qǐng)求就會(huì)被阻塞。
- DNS 查詢(DNS Lookup):瀏覽器需要知道目標(biāo)服務(wù)器的 IP 才能建立連接椅文。將域名解析為 IP 的這個(gè)系統(tǒng)就是 DNS喂很。這個(gè)通常可以利用DNS緩存結(jié)果來達(dá)到減少這個(gè)時(shí)間的目的皆刺。
- 建立連接(Initial connection):HTTP 是基于 TCP 協(xié)議的少辣,瀏覽器最快也要在第三次握手時(shí)才能捎帶 HTTP 請(qǐng)求報(bào)文,達(dá)到真正的建立連接羡蛾,但是這些連接無法復(fù)用會(huì)導(dǎo)致每次請(qǐng)求都經(jīng)歷三次握手和慢啟動(dòng)漓帅。三次握手在高延遲的場(chǎng)景下影響較明顯,慢啟動(dòng)則對(duì)文件類大請(qǐng)求影響較大痴怨。
HTTP1.0和HTTP1.1的一些區(qū)別
HTTP1.0最早在網(wǎng)頁(yè)中使用是在1996年忙干,那個(gè)時(shí)候只是使用一些較為簡(jiǎn)單的網(wǎng)頁(yè)上和網(wǎng)絡(luò)請(qǐng)求上,而HTTP1.1則在1999年才開始廣泛應(yīng)用于現(xiàn)在的各大瀏覽器網(wǎng)絡(luò)請(qǐng)求中浪藻,同時(shí)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中赞哗,存在一些浪費(fèi)帶寬的現(xiàn)象,例如客戶端只是需要某個(gè)對(duì)象的一部分辆雾,而服務(wù)器卻將整個(gè)對(duì)象送過來了肪笋,并且不支持?jǐn)帱c(diǎn)續(xù)傳功能,HTTP1.1則在請(qǐng)求頭引入了range頭域,它允許只請(qǐng)求資源的某個(gè)部分涂乌,即返回碼是206(Partial Content),這樣就方便了開發(fā)者自由的選擇以便于充分利用帶寬和連接英岭。
- 錯(cuò)誤通知的管理湾盒,在HTTP1.1中新增了24個(gè)錯(cuò)誤狀態(tài)響應(yīng)碼,如409(Conflict)表示請(qǐng)求的資源與資源的當(dāng)前狀態(tài)發(fā)生沖突诅妹;410(Gone)表示服務(wù)器上的某個(gè)資源被永久性的刪除罚勾。
- Host頭處理,在HTTP1.0中認(rèn)為每臺(tái)服務(wù)器都綁定一個(gè)唯一的IP地址吭狡,因此尖殃,請(qǐng)求消息中的URL并沒有傳遞主機(jī)名(hostname)。但隨著虛擬主機(jī)技術(shù)的發(fā)展划煮,在一臺(tái)物理服務(wù)器上可以存在多個(gè)虛擬主機(jī)(Multi-homed Web Servers)送丰,并且它們共享一個(gè)IP地址。HTTP1.1的請(qǐng)求消息和響應(yīng)消息都應(yīng)支持Host頭域弛秋,且請(qǐng)求消息中如果沒有Host頭域會(huì)報(bào)告一個(gè)錯(cuò)誤(400 Bad Request)器躏。
- 長(zhǎng)連接,HTTP 1.1支持長(zhǎng)連接(PersistentConnection)和請(qǐng)求的流水線(Pipelining)處理蟹略,在一個(gè)TCP連接上可以傳送多個(gè)HTTP請(qǐng)求和響應(yīng)登失,減少了建立和關(guān)閉連接的消耗和延遲,在HTTP1.1中默認(rèn)開啟Connection: keep-alive挖炬,一定程度上彌補(bǔ)了HTTP1.0每次請(qǐng)求都要?jiǎng)?chuàng)建連接的缺點(diǎn)揽浙。
HTTPS
HTTP 有以下安全性問題:
- 使用明文進(jìn)行通信,內(nèi)容可能會(huì)被竊聽意敛;
- 不驗(yàn)證通信方的身份馅巷,通信方的身份有可能遭遇偽裝;
- 無法證明報(bào)文的完整性草姻,報(bào)文有可能遭篡改令杈。
HTTPS可以理解為 HTTP+SSL/TLS, 即 HTTP 下加入 SSL 層碴倾,HTTPS 的安全基礎(chǔ)是 SSL逗噩,因此加密的詳細(xì)內(nèi)容就需要 SSL,用于安全的 HTTP 數(shù)據(jù)傳輸跌榔。
HTTPS 并不是新協(xié)議异雁,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信僧须。也就是說 HTTPS 使用了隧道進(jìn)行通信纲刀。
通過使用 SSL,HTTPs 具有了加密(防竊聽)担平、認(rèn)證(防偽裝)和完整性保護(hù)(防篡改)
對(duì)稱秘鑰加密和非對(duì)稱秘鑰加密
對(duì)稱密鑰加密
對(duì)稱密鑰加密(Symmetric-Key Encryption)示绊,加密的加密和解密使用同一密鑰锭部。
優(yōu)點(diǎn):運(yùn)算速度快;
缺點(diǎn):密鑰容易被獲取面褐。
公開密鑰加密
公開密鑰加密(Public-Key Encryption)拌禾,也稱為非對(duì)稱密鑰加密,使用一對(duì)密鑰用于加密和解密展哭,分別為公開密鑰和私有密鑰湃窍。公開密鑰所有人都可以獲得,通信發(fā)送方獲得接收方的公開密鑰之后匪傍,就可以使用公開密鑰進(jìn)行加密您市,接收方收到通信內(nèi)容后使用私有密鑰解密。
優(yōu)點(diǎn):更為安全役衡;
缺點(diǎn):運(yùn)算速度慢茵休;
HTTPS 采用混合的加密機(jī)制,使用公開密鑰加密用于傳輸對(duì)稱密鑰來保證安全性手蝎,之后使用對(duì)稱密鑰加密進(jìn)行通信來保證效率泽篮。
原理圖:
HTTPS性能問題
- HTTPS 降低用戶訪問速度。SSL握手柑船,HTTPS 對(duì)速度會(huì)有一定程度的降低帽撑,但是只要經(jīng)過合理優(yōu)化和部署,HTTPS 對(duì)速度的影響完全可以接受鞍时。在很多場(chǎng)景下亏拉,HTTPS 速度完全不遜于 HTTP,如果使用 SPDY逆巍,HTTPS 的速度甚至還要比 HTTP 快及塘。
- 相對(duì)于HTTPS降低訪問速度,其實(shí)更需要關(guān)心的是服務(wù)器端的CPU壓力锐极,HTTPS中大量的密鑰算法計(jì)算笙僚,會(huì)消耗大量的CPU資源,只有足夠的優(yōu)化灵再,HTTPS 的機(jī)器成本才不會(huì)明顯增加肋层。
使用SPDY
2012年google如一聲驚雷提出了SPDY的方案,大家才開始從正面看待和解決老版本HTTP協(xié)議本身的問題翎迁,SPDY可以說是綜合了HTTPS和HTTP兩者有點(diǎn)于一體的傳輸協(xié)議栋猖,主要解決:
- 降低延遲,針對(duì)HTTP高延遲的問題汪榔,SPDY優(yōu)雅的采取了多路復(fù)用(multiplexing)蒲拉。多路復(fù)用通過多個(gè)請(qǐng)求stream共享一個(gè)tcp連接的方式,解決了HOL blocking的問題,降低了延遲同時(shí)提高了帶寬的利用率雌团。
- 請(qǐng)求優(yōu)先級(jí)(request prioritization)燃领。多路復(fù)用帶來一個(gè)新的問題是,在連接共享的基礎(chǔ)之上有可能會(huì)導(dǎo)致關(guān)鍵請(qǐng)求被阻塞锦援。SPDY允許給每個(gè)request設(shè)置優(yōu)先級(jí)猛蔽,這樣重要的請(qǐng)求就會(huì)優(yōu)先得到響應(yīng)。比如瀏覽器加載首頁(yè)雨涛,首頁(yè)的html內(nèi)容應(yīng)該優(yōu)先展示,之后才是各種靜態(tài)資源文件懦胞,腳本文件等加載替久,這樣可以保證用戶能第一時(shí)間看到網(wǎng)頁(yè)內(nèi)容。
- header壓縮躏尉。前面提到HTTP1.x的header很多時(shí)候都是重復(fù)多余的蚯根。選擇合適的壓縮算法可以減小包的大小和數(shù)量。
- 基于HTTPS的加密協(xié)議傳輸胀糜,大大提高了傳輸數(shù)據(jù)的可靠性颅拦。
- 服務(wù)端推送(server push),采用了SPDY的網(wǎng)頁(yè)教藻,例如我的網(wǎng)頁(yè)有一個(gè)sytle.css的請(qǐng)求距帅,在客戶端收到sytle.css數(shù)據(jù)的同時(shí),服務(wù)端會(huì)將sytle.js的文件推送給客戶端括堤,當(dāng)客戶端再次嘗試獲取sytle.js時(shí)就可以直接從緩存中獲取到碌秸,不用再發(fā)請(qǐng)求了。SPDY構(gòu)成圖:
HTTP2.0
HTTP2.0可以說是SPDY的升級(jí)版(其實(shí)原本也是基于SPDY設(shè)計(jì)的)悄窃,但是讥电,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下兩點(diǎn):
- HTTP2.0 支持明文 HTTP 傳輸轧抗,而 SPDY 強(qiáng)制使用 HTTPS
- HTTP2.0 消息頭的壓縮算法采用 HPACK恩敌,而非 SPDY 采用的 DEFLATE
HTTP2.0的新特性
- 新的二進(jìn)制格式(Binary Format),HTTP1.x的解析是基于文本横媚【琅冢基于文本協(xié)議的格式解析存在天然缺陷,文本的表現(xiàn)形式有多樣性灯蝴,要做到健壯性考慮的場(chǎng)景必然很多抗碰,二進(jìn)制則不同,只認(rèn)0和1的組合绽乔』∮基于這種考慮HTTP2.0的協(xié)議解析決定采用二進(jìn)制格式,實(shí)現(xiàn)方便且健壯。
- 多路復(fù)用(MultiPlexing)看疗,即連接共享沙峻,即每一個(gè)request都是是用作連接共享機(jī)制的。一個(gè)request對(duì)應(yīng)一個(gè)id两芳,這樣一個(gè)連接上可以有多個(gè)request摔寨,每個(gè)連接的request可以隨機(jī)的混雜在一起,接收方可以根據(jù)request的 id將request再歸屬到各自不同的服務(wù)端請(qǐng)求里面怖辆。多路復(fù)用
- header壓縮是复,如上文中所言,對(duì)前面提到過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控制臺(tái)可以查看是否啟用H2酬核。