Google 在 2010 年发布了 SPDY(取自 SPeeDY,发音同 speedy),其开发目标旨在解决 HTTP 的性能瓶颈,缩短 Web 页面的加载时间(50%)
HTTP的瓶颈
1)一条连接上只可发送一条请求
2)请求只能客户端开始。客户端不可以接收除响应以外的指令
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,看这里