CodeEaseiOS Developer计算机技术一锅炖

#聊聊WebSocket

2016-08-23  本文已影响146人  践行者

WebSocket使用场景

场景化.png

前世今生

Polling阶段
Polling.jpeg

客户端和服务器之间会一直进行连接,每隔一段时间就询问一次;

优点

缺点

实例

适于小型应用。

Long polling阶段
longPolling.jpeg

客户端发送HTTP给服务器之后,有没有新消息,如果没有新消息,就一直等待。
当有新消息的时候,才会返回给客户端。

优点:

在无消息的情况下不会频繁的请求,耗费资源小。

缺点:

服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。

实例:

WebQQ、Hi网页版、Facebook IM。

websocket

基本了解

Websocket是一个持久化的协议(相对于HTTP这种非持久的协议来说)。本质上是一个基于TCP的协议,它由通信协议和编程API组成,WebSocket能够在浏览器和服务器之间建立双向连接,以基于事件的方式,赋予浏览器实时通信能力。

Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

原理图

img002.jpg

交互报文格式

1、.WebSocket 客户端连接报文
<code>
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13
</code>
客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。

2.WebSocket 服务端响应报文
<code>
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
</code>
“Sec-WebSocket-Accept”的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,“HTTP/1.1 101 Switching Protocols”表示服务端接受 WebSocket 协议的客户端连接,经过这样的请求-响应处理后,客户端服务端的 WebSocket 连接握手成功, 后续就可以进行 TCP 通讯了。

交互图

img003.jpg

优点

1 大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。

2 和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。

与Socket区别与联系

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
而 WebSocket 则不同,它是一个完整的 应用层协议,包含一套标准的 API 。
所以,从使用上来说,WebSocket 更易用,而 Socket 更灵活。

相关开源框架

参考文章

1 .http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/

2.web协议栈 https://tools.ietf.org/html/rfc6455

扫码关注,定期推送

0.jpg
上一篇下一篇

猜你喜欢

热点阅读