左邊是普通 HTTPS 加載,右邊是 SPDY 加載。是不是很神奇?
SPDY 是什么 ?
SPDY 是 Google 開(kāi)發(fā)的基于傳輸控制協(xié)議 (TCP) 的應(yīng)用層協(xié)議 ,開(kāi)發(fā)組正在推動(dòng) SPDY 成為正式標(biāo)準(zhǔn)(現(xiàn)為互聯(lián)網(wǎng)草案)。SPDY 協(xié)議旨在通過(guò)壓縮、多路復(fù)用和優(yōu)先級(jí)來(lái)縮短網(wǎng)頁(yè)的加載時(shí)間和提高安全性。(SPDY 是 Speedy 的昵音,意思是更快)
SPDY 與 HTTP 的關(guān)系
SPDY 協(xié)議只是在性能上對(duì) HTTP 做了很大的優(yōu)化,其核心思想是盡量減少連接個(gè)數(shù),而對(duì)于 HTTP 的語(yǔ)義并沒(méi)有做太大的修改。具體來(lái)說(shuō)是,SPDY 使用了 HTTP 的方法和頁(yè)眉,但是刪除了一些頭并重寫(xiě)了 HTTP 中管理連接和數(shù)據(jù)轉(zhuǎn)移格式的部分,所以基本上是兼容 HTTP 的。
Google 在 SPDY 白皮書(shū)里表示要向協(xié)議棧下面滲透并替換掉傳輸層協(xié)議(TCP),但是因?yàn)檫@樣無(wú)論是部署起來(lái)還是實(shí)現(xiàn)起來(lái)暫時(shí)相當(dāng)困難,因此 Google 準(zhǔn)備先對(duì)應(yīng)用層協(xié)議 HTTP 進(jìn)行改進(jìn),先在 SSL 之上增加一個(gè)會(huì)話層來(lái)實(shí)現(xiàn) SPDY 協(xié)議,而 HTTP 的 GET 和 POST 消息格式保持不變,即現(xiàn)有的所有服務(wù)端應(yīng)用均不用做任何修改。
因此在目前,SPDY 的目的是為了加強(qiáng) HTTP,是對(duì) HTTP 一個(gè)更好的實(shí)現(xiàn)和支持。至于未來(lái) SPDY 得到廣泛應(yīng)用后會(huì)不會(huì)演一出貍貓換太子,替換掉 HTTP 并徹底顛覆整個(gè) Internet 就是 Google 的事情了。
為什么要重新建立一個(gè) SPDY ?
距離萬(wàn)維網(wǎng)之父蒂姆·伯納斯-李發(fā)明并推動(dòng) HTTP 成為如今互聯(lián)網(wǎng)最流行的協(xié)議已經(jīng)過(guò)去十幾年了(現(xiàn)用 HTTP 1.1 規(guī)范也停滯了 13 年了),隨著現(xiàn)在 WEB 技術(shù)的飛速發(fā)展尤其是 HTML5 的不斷演進(jìn),包括 WebSockets 協(xié)議的出現(xiàn)以及當(dāng)前網(wǎng)絡(luò)環(huán)境的改變、傳輸內(nèi)容的變化,當(dāng)初的 HTTP 規(guī)范已經(jīng)逐漸無(wú)法滿足人們的需要了,HTTP 需要進(jìn)一步發(fā)展,因此 HTTPbis 工作組已經(jīng)被組建并被授權(quán)考慮 HTTP 2.0 ,希望能解決掉目前 HTTP 所帶來(lái)的諸多限制。而 SPDY 正是 Google 在 HTTP 即將從 1.1 跨越到 2.0 之際推出的試圖成為下一代互聯(lián)網(wǎng)通信的協(xié)議,長(zhǎng)期以來(lái)一直被認(rèn)為是 HTTP 2.0 唯一可行選擇。
HTTP 協(xié)議的不足
1. 單路連接 請(qǐng)求低效
HTTP 協(xié)議的最大弊端就是每個(gè) TCP 連接只能對(duì)應(yīng)一個(gè) HTTP 請(qǐng)求,即每個(gè) HTTP 連接只請(qǐng)求一個(gè)資源,瀏覽器只能通過(guò)建立多個(gè)連接來(lái)解決。此外在 HTTP 中對(duì)請(qǐng)求是嚴(yán)格的先入先出(FIFO)進(jìn)行的,如果中間某個(gè)請(qǐng)求處理時(shí)間較長(zhǎng)會(huì)阻塞后面的請(qǐng)求。
(注:雖然 HTTP pipelining 對(duì)連接請(qǐng)求做了改善,但復(fù)雜度增加很大,并未普及)
2. HTTP 只允許由客戶端主動(dòng)發(fā)起請(qǐng)求
服務(wù)端只能等待客戶端發(fā)送一個(gè)請(qǐng)求,在可以滿足預(yù)加載的現(xiàn)狀是一種桎梏。
3. HTTP 頭冗余
HTTP 頭在同一個(gè)會(huì)話里是反復(fù)發(fā)送的,中間的冗余信息,比如 User-Agent、Host 等不需要重復(fù)發(fā)送的信息也在反復(fù)發(fā)送,浪費(fèi)帶寬和資源。
SPDY 協(xié)議的優(yōu)點(diǎn)
1. 多路復(fù)用 請(qǐng)求優(yōu)化
SPDY 規(guī)定在一個(gè) SPDY 連接內(nèi)可以有無(wú)限個(gè)并行請(qǐng)求,即允許多個(gè)并發(fā) HTTP 請(qǐng)求共用一個(gè) TCP會(huì)話。這樣 SPDY 通過(guò)復(fù)用在單個(gè) TCP 連接上的多次請(qǐng)求,而非為每個(gè)請(qǐng)求單獨(dú)開(kāi)放連接,這樣只需建立一個(gè) TCP 連接就可以傳送網(wǎng)頁(yè)上所有資源,不僅可以減少消息交互往返的時(shí)間還可以避免創(chuàng)建新連接造成的延遲,使得 TCP 的效率更高。
此外,SPDY 的多路復(fù)用可以設(shè)置優(yōu)先級(jí),而不像傳統(tǒng) HTTP 那樣嚴(yán)格按照先入先出一個(gè)一個(gè)處理請(qǐng)求,它會(huì)選擇性的先傳輸 CSS 這樣更重要的資源,然后再傳輸網(wǎng)站圖標(biāo)之類不太重要的資源,可以避免讓非關(guān)鍵資源占用網(wǎng)絡(luò)通道的問(wèn)題,提升 TCP 的性能。
2. 支持服務(wù)器推送技術(shù)
服務(wù)器可以主動(dòng)向客戶端發(fā)起通信向客戶端推送數(shù)據(jù),這種預(yù)加載可以使用戶一直保持一個(gè)快速的網(wǎng)絡(luò)。
3. SPDY 壓縮了 HTTP 頭
舍棄掉了不必要的頭信息,經(jīng)過(guò)壓縮之后可以節(jié)省多余數(shù)據(jù)傳輸所帶來(lái)的等待時(shí)間和帶寬。
4. 強(qiáng)制使用 SSL 傳輸協(xié)議
Google 認(rèn)為 Web 未來(lái)的發(fā)展方向必定是安全的網(wǎng)絡(luò)連接,全部請(qǐng)求 SSL 加密后,信息傳輸更加安全。
SPDY 協(xié)議的意義
按照 Google 的說(shuō)法,SPDY 被創(chuàng)造出來(lái)的唯一目的就是讓 Web 更快(strive to make the whole web fast),其名字 SPDY(Speedy) 也似乎在暗示著這一點(diǎn)。那么 SPDY 的意義又在哪里呢?
1. 普通用戶:
對(duì)于使用者來(lái)說(shuō),隱藏在瀏覽器下面的 SPDY 相比 HTTP 沒(méi)有任何區(qū)別,但是我們可以感覺(jué)到 Google 服務(wù)在 Chrome 下異常的快,這就是 SPDY 的功勞了。此外網(wǎng)站信息傳輸加密后不用擔(dān)心信息被截取等,大大增加了安全性和保密性。
2. 前端人員:
對(duì)于前端工程師們來(lái)說(shuō),提升頁(yè)面效率是一件很重要的事情,目前大多采用像 CSS Sprites 等方法來(lái)優(yōu)化網(wǎng)站,對(duì)于因?yàn)轫?yè)面加載時(shí)每張圖片、icon 都請(qǐng)求一個(gè)連接甚至采用在不同頁(yè)面引用不同圖片來(lái)降低一個(gè)頁(yè)面內(nèi)圖片的請(qǐng)求數(shù)量。而現(xiàn)在有了 SPDY 的請(qǐng)求優(yōu)化可以將請(qǐng)求順序進(jìn)行重排,這樣可以在很大程度上緩解頁(yè)面加載時(shí)圖片請(qǐng)求帶來(lái)的影響。例如像極客公園的報(bào)名頁(yè)面,如果報(bào)名用戶過(guò)多,例如極客公園2012年創(chuàng)新大會(huì)或極客公園第 27 期長(zhǎng)城會(huì),可以很明顯的感覺(jué)出頭像的請(qǐng)求會(huì)拖累整體頁(yè)面加載變慢甚至變卡,相信對(duì)于這點(diǎn),經(jīng)常上淘寶或刷微博的會(huì)深有體會(huì),一旦網(wǎng)速稍微慢點(diǎn)就會(huì)出現(xiàn)頁(yè)面加載異常,還有像蘋(píng)果 App Store(除去服務(wù)器因?yàn)榈貐^(qū)的延遲),豌豆莢這類應(yīng)用分發(fā)平臺(tái)上應(yīng)用圖標(biāo)刷新緩慢等,如下面這個(gè)視頻所示。
3. 運(yùn)維人員:
SPDY 在降低連接數(shù)目的同時(shí),還使得服務(wù)器上每個(gè)客戶端占用的資源也減少,從而可以釋放出更多內(nèi)存和 CPU 。此外 SPDY 綜合起來(lái)可以將瀏覽速度提升一倍,頁(yè)面加載延遲方面的改進(jìn)達(dá) 64% 。
眾家支持的 SPDY 協(xié)議
如果你在使用 Chrome 瀏覽器,同時(shí)使用像 Gmail 等 Google 的網(wǎng)絡(luò)服務(wù)的話,其實(shí)你已經(jīng)不再是通過(guò) HTTP 訪問(wèn)這些服務(wù)了。在瀏覽器打開(kāi) chrome://net-internals/#spdy 就會(huì)發(fā)現(xiàn)你已經(jīng)在使用 SPDY 協(xié)議了。(除了包括 Google 自家的 Gmail、Google Plus 等 Google 系服務(wù)外,其他公共站點(diǎn)例如 Twitter 和 Webtide 也已經(jīng)支持該協(xié)議。在國(guó)內(nèi),基于 WebKit 的豌豆莢 2.0 也曾表示將引進(jìn)Chrome的SPDY技術(shù)來(lái)進(jìn)一步提升速度。
就像上圖所示的那樣,SPDY 的實(shí)現(xiàn)需要瀏覽器客戶端和 Web 服務(wù)器同時(shí)支持。在客戶端瀏覽器這快 Google自家的 Chrome 和Chromium 全系列不用說(shuō),都已經(jīng)支持SPDY; Mozilla 家的 Firefox 自 Firefox 13 也默認(rèn)開(kāi)啟對(duì) SPDY 的支持。而亞馬遜家的 Silk 利用 SPDY 的深度其實(shí)不比 Google 自家的 Chrome 和 Firefox 差。
在Web 服務(wù)器方面包括最流行和最廣泛的 Apache 在內(nèi),Netty、Jeety、Varnish、Erlang 和 Hightide 應(yīng)用服務(wù)器以及面向 node.js 的服務(wù)器也都已經(jīng)宣布支持 SPDY。( Nginx 也表示將支持 SPDY)
如何部署 SPDY?
近日 Google 正式發(fā)布了適用于最流行 Web 服務(wù)器 Apache 的插件 mod_spdy,將其下載安裝后你的 Apache 服務(wù)器就能使用 SPDY 協(xié)議與兼容 SPDY 協(xié)議的瀏覽器如 Chrome、FireFox 等進(jìn)行通信。像之前所說(shuō)的那樣,SPDY 是運(yùn)行在 HTTPS 上,非 HTTPS 流量并不會(huì)受到 mod_spdy 影響。
SPDY 部署要求:
1. Apache 2.2 (≥2.2.4)
2. mod_ssl 模塊開(kāi)啟
SPDY 部署步驟:
1. 下載 mod_spdy 模塊
到下載頁(yè)面下載對(duì)應(yīng)系統(tǒng)的安裝包
2. 安裝 mod_spdy 模塊
在系統(tǒng)終端運(yùn)行下面命令行
dpkg -i mod-spdy-*.deb
apt-get -f install-系統(tǒng)為 Debian/Ubuntu
------------------------------------------------------------
yum install at (if you do not already have 'at' installed)
rpm -U mod-spdy-*.rpm-系統(tǒng)為 CentOS/Fedora
3. 重啟服務(wù)器(Apache)
sudo /etc/init.d/apache2 restart (Debian/Ubuntu)
4. 確定開(kāi)啟與否
打開(kāi) Chrome 瀏覽器,輸入并前往 chrome://net-internals/#spdy 頁(yè)面,查看主機(jī)名稱是否出現(xiàn)在標(biāo)識(shí)欄中。如果出現(xiàn)說(shuō)明已經(jīng)部署完畢,如果沒(méi)有出現(xiàn)去服務(wù)器錯(cuò)誤日志(error.log)里查詢。
未來(lái)的web基礎(chǔ)?
在最新的協(xié)議文檔里 Google 重新將 SPDY 分為了兩層,其中一層被描述為 HTTP-like,大有取代 HTTP 的意圖(Google 最近的一篇文章已經(jīng)直呼 SPDY 為“a replacement for HTTP”)。同時(shí) HTTP 2.0 標(biāo)準(zhǔn)制定工作組(HTTPbis)也表示,SPDY 很有希望接替當(dāng)前的 HTTP 傳輸實(shí)現(xiàn)。
考慮到 Chrome 和安卓的份額以及標(biāo)準(zhǔn)的推動(dòng),相信 SPDY 會(huì)有一個(gè)好前景。因此選擇此刻支持 SPDY 也是明智的選擇。