#聊聊WebSocket
WebSocket使用场景
场景化.png前世今生
Polling阶段
Polling.jpeg客户端和服务器之间会一直进行连接,每隔一段时间就询问一次;
优点
- 后端程序编写比较容易。
缺点
- 连接数会很多,一个接受,一个发送。
- 每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。
- 不适合获取实时信息
实例
适于小型应用。
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 更灵活。
相关开源框架
- Socket开源框架有:CocoaAsyncSocket,socketio/socket.io-client-swift
- WebSocket开源框架有:facebook/SocketRocket,tidwall/SwiftWebSocket
参考文章
1 .http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/
2.web协议栈 https://tools.ietf.org/html/rfc6455