做爲一個常常和web打交道的程序員,瞭解這些協議是必須的,本文就向你們介紹一下這些協議的區別和基本概念,文中可能不侷限於前端知識,還包括一些運維,協議方面的知識,但願能給讀者帶來一些收穫,若有不對之處還請指出。css
全稱:超文本傳輸協議(HyperText Transfer Protocol) 伴隨着計算機網絡和瀏覽器的誕生,HTTP1.0也隨之而來,處於計算機網絡中的應用層,HTTP是創建在TCP協議之上,因此HTTP協議的瓶頸及其優化技巧都是基於TCP協議自己的特性,例如tcp創建鏈接的3次握手和斷開鏈接的4次揮手以及每次創建鏈接帶來的RTT延遲時間。html
早在HTTP創建之初,主要就是爲了將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。也是說對於前端來講,咱們所寫的HTML頁面將要放在咱們的web服務器上,用戶端經過瀏覽器訪問url地址來獲取網頁的顯示內容,可是到了WEB2.0以來,咱們的頁面變得複雜,不只僅單純的是一些簡單的文字和圖片,同時咱們的HTML頁面有了CSS,Javascript,來豐富咱們的頁面展現,當ajax的出現,咱們又多了一種向服務器端獲取數據的方法,這些其實都是基於HTTP協議的,一樣到了移動互聯網時代,咱們頁面能夠跑在手機端瀏覽器裏面,可是和PC相比,手機端的網絡狀況更加複雜,這使得咱們開始了不起不對HTTP進行深刻理解並不斷優化過程當中。前端
影響一個HTTP網絡請求的因素主要有兩個:帶寬和延遲。ios
一、瀏覽器阻塞(HOL blocking):瀏覽器會由於一些緣由阻塞請求。瀏覽器對於同一個域名,同時只能有 4 個鏈接(這個根據瀏覽器內核不一樣可能會有所差別),超過瀏覽器最大鏈接數限制,後續請求就會被阻塞。程序員
二、DNS 查詢(DNS Lookup):瀏覽器須要知道目標服務器的 IP 才能創建鏈接。將域名解析爲 IP 的這個系統就是 DNS。這個一般能夠利用DNS緩存結果來達到減小這個時間的目的。web
三、創建鏈接(Initial connection):HTTP 是基於 TCP 協議的,瀏覽器最快也要在第三次握手時才能捎帶 HTTP 請求報文,達到真正的創建鏈接,可是這些鏈接沒法複用會致使每次請求都經歷三次握手和慢啓動。三次握手在高延遲的場景下影響較明顯,慢啓動則對文件類大請求影響較大。ajax
HTTP1.0最先在網頁中使用是在1996年,那個時候只是使用一些較爲簡單的網頁上和網絡請求上,而HTTP1.1則在1999年纔開始普遍應用於如今的各大瀏覽器網絡請求中,同時HTTP1.1也是當前使用最爲普遍的HTTP協議。算法
主要區別主要體如今:chrome
一、緩存處理,在HTTP1.0中主要使用header裏的If-Modified-Since,Expires來作爲緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。瀏覽器
二、帶寬優化及網絡鏈接的使用,HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是須要某個對象的一部分,而服務器卻將整個對象送過來了,而且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它容許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和鏈接。
三、錯誤通知的管理,在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生衝突;410(Gone)表示服務器上的某個資源被永久性的刪除。
四、Host頭處理,在HTTP1.0中認爲每臺服務器都綁定一個惟一的IP地址,所以,請求消息中的URL並無傳遞主機名(hostname)。但隨着虛擬主機技術的發展,在一臺物理服務器上能夠存在多個虛擬主機(Multi-homed Web Servers),而且它們共享一個IP地址。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中若是沒有Host頭域會報告一個錯誤(400 Bad Request)。
五、長鏈接,HTTP 1.1支持長鏈接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP鏈接上能夠傳送多個HTTP請求和響應,減小了創建和關閉鏈接的消耗和延遲,在HTTP1.1中默認開啓Connection: keep-alive,必定程度上彌補了HTTP1.0每次請求都要建立鏈接的缺點。如下是常見的HTTP1.0:
區別用一張圖來體現:
一、上面提到過的,HTTP1.x在傳輸數據時,每次都須要從新創建鏈接,無疑增長了大量的延遲時間,特別是在移動端更爲突出。
二、HTTP1.x在傳輸數據時,全部傳輸的內容都是明文,客戶端和服務器端都沒法驗證對方的身份,這在必定程度上沒法保證數據的安全性。
三、HTTP1.x在使用時,header裏攜帶的內容過大,在必定程度上增長了傳輸的成本,而且每次請求header基本不怎麼變化,尤爲在移動端增長用戶流量。
四、雖然HTTP1.x支持了keep-alive,來彌補屢次建立鏈接產生的延遲,可是keep-alive使用多了一樣會給服務端帶來大量的性能壓力,而且對於單個文件被不斷請求的服務(例如圖片存放網站),keep-alive可能會極大的影響性能,由於它在文件被請求以後還保持了沒必要要的鏈接很長時間。
爲了解決以上問題,網景在1994年建立了HTTPS,並應用在網景導航者瀏覽器中。 最初,HTTPS是與SSL一塊兒使用的;在SSL逐漸演變到TLS時(其實兩個是一個東西,只是名字不一樣而已),最新的HTTPS也由在2000年五月公佈的RFC 2818正式肯定下來。簡單來講,HTTPS就是安全版的HTTP,而且因爲當今時代對安全性要求更高,chrome和firefox都大力支持網站使用HTTPS,蘋果也在ios 10系統中強制app使用HTTPS來傳輸數據,因而可知HTTPS勢在必行。
一、HTTPS協議須要到CA申請證書,通常免費證書不多,須要交費。
二、HTTP協議運行在TCP之上,全部傳輸的內容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,全部傳輸的內容都通過加密的。
三、HTTP和HTTPS使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
四、HTTPS能夠有效的防止運營商劫持,解決了防劫持的一個大問題。
若是一個網站要全站由HTTP替換成HTTPS,可能須要關注如下幾點:
一、安裝CA證書,通常的證書都是須要收費的,這邊推薦一個比較好的購買證書網站:1)Let's Encrypt,免費,快捷,支持多域名(不是通配符),三條命令即時簽署+導出證書。缺點是暫時只有三個月有效期,到期需續簽。2Comodo PositiveSSL,收費,可是比較穩定。
二、在購買證書以後,在證書提供的網站上配置本身的域名,將證書下載下來以後,配置本身的web服務器,同時進行代碼改造。
三、HTTPS 下降用戶訪問速度。SSL握手,HTTPS 對速度會有必定程度的下降,可是隻要通過合理優化和部署,HTTPS 對速度的影響徹底能夠接受。在不少場景下,HTTPS 速度徹底不遜於 HTTP,若是使用 SPDY,HTTPS 的速度甚至還要比 HTTP 快。
四、相對於HTTPS下降訪問速度,其實更須要關心的是服務器端的CPU壓力,HTTPS中大量的密鑰算法計算,會消耗大量的CPU資源,只有足夠的優化,HTTPS 的機器成本纔不會明顯增長。
推薦一則淘寶網改造HTTPS(http://velocity.oreilly.com.cn/2015/ppts/lizhenyu.pdf)的文章。
2012年google如一聲驚雷提出了SPDY的方案,你們纔開始從正面看待和解決老版本HTTP協議自己的問題,SPDY能夠說是綜合了HTTPS和HTTP二者有點於一體的傳輸協議,主要解決:
一、下降延遲,針對HTTP高延遲的問題,SPDY優雅的採起了多路複用(multiplexing)。多路複用經過多個請求stream共享一個tcp鏈接的方式,解決了HOL blocking的問題,下降了延遲同時提升了帶寬的利用率。
二、請求優先級(request prioritization)。多路複用帶來一個新的問題是,在鏈接共享的基礎之上有可能會致使關鍵請求被阻塞。SPDY容許給每一個request設置優先級,這樣重要的請求就會優先獲得響應。好比瀏覽器加載首頁,首頁的html內容應該優先展現,以後纔是各類靜態資源文件,腳本文件等加載,這樣能夠保證用戶能第一時間看到網頁內容。
三、header壓縮。前面提到HTTP1.x的header不少時候都是重複多餘的。選擇合適的壓縮算法能夠減少包的大小和數量。
四、基於HTTPS的加密協議傳輸,大大提升了傳輸數據的可靠性。
五、服務端推送(server push),採用了SPDY的網頁,例如個人網頁有一個sytle.css的請求,在客戶端收到sytle.css數據的同時,服務端會將sytle.js的文件推送給客戶端,當客戶端再次嘗試獲取sytle.js時就能夠直接從緩存中獲取到,不用再發請求了。SPDY構成圖:
SPDY位於HTTP之下,TCP和SSL之上,這樣能夠輕鬆兼容老版本的HTTP協議(將HTTP1.x的內容封裝成一種新的frame格式),同時可使用已有的SSL功能。
兼容性:
十、HTTP2.0的前世此生
顧名思義有了HTTP1.x,那麼HTTP2.0也就瓜熟蒂落的出現了。
HTTP2.0能夠說是SPDY的升級版(其實本來也是基於SPDY設計的),可是,HTTP2.0 跟 SPDY 仍有不一樣的地方,主要是如下兩點:
更多關於HTTP2的問題能夠參考:HTTP2奇妙平常(http://www.alloyteam.com/2015/03/http2-0-di-qi-miao-ri-chang/),以及HTTP2.0的官方網站。
關於HTTP2和HTTP1.x的區別大體能夠看下圖:
十二、HTTP2.0的升級改造
對比HTTPS的升級改造,HTTP2.0或許會稍微簡單一些,你可能須要關注如下問題:
一、前文說了HTTP2.0其實能夠支持非HTTPS的,可是如今主流的瀏覽器像chrome,firefox表示仍是隻支持基於 TLS 部署的HTTP2.0協議,因此要想升級成HTTP2.0仍是先升級HTTPS爲好。
二、當你的網站已經升級HTTPS以後,那麼升級HTTP2.0就簡單不少,若是你使用NGINX,只要在配置文件中啓動相應的協議就能夠了,能夠參考NGINX白皮書,NGINX配置HTTP2.0官方指南。
三、使用了HTTP2.0那麼,本來的HTTP1.x怎麼辦,這個問題其實不用擔憂,HTTP2.0徹底兼容HTTP1.x的語義,對於不支持HTTP2.0的瀏覽器,NGINX會自動向下兼容的。
以上就是關於HTTP,HTTP2.0,SPDY,HTTPS的一些基本理論,有些內容沒有深刻講解,你們能夠跟進參考鏈接具體查看。
關於HTTP1.x的一些優化方式,例如文件合併壓縮,資源cdn,js,css優化等等一樣使用與HTTP2.0和HTTPS,因此web前端的優化,仍是要繼續進行。
其實WEB發展如此迅速的今天,有些技術是真的要與時俱進的,就像蘋果宣佈ios 10必須使用HTTPS開始,關於web協議革新就已經開始了,爲了更好的性能,更優越的方式,如今就開始升級改造吧