#聊聊WebSocket

作者: 践行者 | 来源:发表于2016-08-23 15:26 被阅读146次

    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

    扫码关注,定期推送

    0.jpg

    相关文章

      网友评论

        本文标题:#聊聊WebSocket

        本文链接:https://www.haomeiwen.com/subject/eswbsttx.html