声明:本人的所有博客皆为个人笔记,作为个人知识索引使用,因此在叙述上存在逻辑不通顺、跨度大等问题,希望理解。分享出来仅供大家学习翻阅,若有错误希望指出,感谢!
基于HTTP的协议
SPDY
其开发目标在解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)
HTTP的瓶颈
- 一条连接上只可发送一个请求
- 请求只能从客户端开始,客户端不可以接收除响应以外的指令
- 请求/响应首部未经压缩就发送,首部信息越多延迟越大
- 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
- 可任意选择数据压缩格式,非强制压缩发送
Ajax解决方案
Ajax(Asynchronous JavaScript and XML)是一种利用JavaScript和DOM的操作,以达到局部web页面替换加载的异步通信手段,由于它只更新一部分页面,响应中传输的数据量会因此减少
- Ajax的核心技术是名为XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信
- 利用Ajax实时从服务器获取内容,有可能会导致大量请求产生,另外Ajax未解决HTTP协议本身存在的问题
Coment解决方案
一旦服务器端有内容更新了,Coment不会让请求等待,而是直接给客户端返回响应这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能
- 为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。因此,服务器端一旦有更新, 就可以立即反馈给客户端
- 内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。另外,Comet也仍未解决HTTP协议本身存在的问题
SPDY 的设计与功能
- SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY规定通信中使用SSL
- SPDY以会话层的形式加人,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP的GET和POST等方法、Cookie 以及HTTP报文等
使用SPDY后,HTTP协议额外获得以下功能
多路复用流
通过单一的TCP连接,可以无限制处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高
赋子请求优先级
SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题
压缩HTTP首部
用缩HTTP请求和响应的首部。这样一来, 通信产生的数据包数量和发送的字节数就更少了
推送功能
支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求
服务器提示功能
服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求
全双工通信WebSocket
WebSocket 的设计与功能
- WebSocket,即Web浏览器与Web服务器之间全双工通信标准
- WebSocket技术主要是为了解决Ajax和Comet里XMLHttpRequest附带的缺陷所引起的问题
WebSocket 协议
- 一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML或图片等任意格式的数据
- 由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文
WebSocket 协议的主要特点:
推送功能
支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求
减少通信量
只要建立起WebSocket连接,就希望一直保持连接状态。 和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
- ScWebSokrKkey字段内记录着握手过程中必不可少的建值
- Sec-WebSocket-Protocol字段内记录使用的子协议
- 子协议按WebSocket协议标准在连接分开使用时,定义那些连接的名称
握手:响应
对于之前的请求,返回状态码101 Switching Protocols的响应
HTTP /1.1 101 Switching Protocols
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbk+xOo=
Sec-WebSocket-Protocol:chat
- See-Websocket-Accept的字段值是由握手请求中的Sec-WebSocket-Key的字段值生成的
成功握手确立Websocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧
WebSocket API
JavaScript可调用"The WebSocket API”内提供的WebSocket 程序接口,以实现WebSocket协议下全双工通信
以下为调用WebSocket API,每50ms发送一次数据的实例
var socket = new WebSocket('ws://game.example.com:12010/updates')
socket.onopen = function(){
setInterval(function(){
if(socket.bufferedAmount == 0)
socket.send(getUpdateData())
},50);
};