基于HTTP的功能追加协议

2017-06-07  本文已影响0人  牛软糖

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,看这里

【腾讯Bugly干货分享】WebSocket 浅析

上一篇下一篇

猜你喜欢

热点阅读