Google 在 2010 年發布了 SPDY(取自 SPeeDY,發音同 speedy),其開發目標旨在解決 HTTP 的性能瓶頸,縮短 Web 頁面的加載時間(50%)
HTTP的瓶頸
1)一條連接上只可發送一條請求
2)請求只能客戶端開始??蛻舳瞬豢梢越邮粘憫酝獾闹噶?/b>
3)請求/響應未經壓縮就發送、首部信息越多延遲越大
4)發送冗長的首部。發次都發送相同的首部浪費較多
5)可任意選擇壓縮的數據格式。非強制壓縮發送
SPDY的設計和功能
SPDY沒有完全改寫HTTP協議,而是在TCP/IP的應用層和傳輸層之間通過新加會話層的形式運作
SPDY以會話層的形式加入,控制對數據的流動,但還是采用HTTP建立連接
使用SPDY,HTTP協議額外獲得以下功能:
多路復用:通過單一的TCP連接,可以無限制處理多個HTTP請求
賦予請求優先級:可以給請求逐個分配優先級,解決因低寬帶而導致響應變慢的問題
壓縮HTTP首部:壓縮HTTP請求的首部和響應的首部,減少數據包數量和發送的字節數
推送功能:支持服務器主動向客戶端推送數據功能,不用等待客戶端的請求
服務器提示功能:服務端可以主動提示客戶端請求所需的資源
WebSocket的設計和功能
WebSocket,即Web瀏覽器和Web服務器之間全雙工通信標準
一旦Web服務器和客戶端建立起WebScoket協議通信連接,之后所有的通信都依靠這個協議進行
由于是建立在HTTP基礎上的協議,因此連接的發起方仍是客戶端,一旦建立連接,任意一方都可直接發送報文
WebSocket協議的主要特點:
推送功能:支持由服務端直接向客戶端推送數據,而不用等待客戶端的請求
減少通信量:它的首部信量很少,因此通信量也相應減少
為了實現WebSocket通信,在HTTP連接建立后,需要完成一次“握手”的步驟:
握手*請求:為了實現WebSocket通信,需要在HTTP的首部添加Upgrade字段,告知服務器協議發送改變
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Sec-WebSocket-Key是握手必不可少的鍵值
Sec-WebSocket-Protocol是使用的子協議
握手*響應:返回狀態碼101Switching Protocols的響應
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Accept是握手請求中Sec-WebSocket-Key的字段值生成的
成功握手后,通信時不再使用HTTP的數據幀,采用WebSocket獨立的數據幀
WebSocket的API
JavaScript 可調用“The WebSocket API”(http://www.w3.org/TR/websockets/,由 W3C 標準制定)內提供的 WebSocket 程序接口,以實現 WebSocket 協議下全雙工通信。
50ms發送一次數據實例:
var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
想要進一步了解WebSocket,看這里