WebSocket 相关总结

  • 什么是WebSocket

    WebSocket是一种在单个TCP连接上进行全双工通信的网络层协议。

    画外音:

    全双工:通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。

    半双工:通信一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两辆车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。

    单工:通信只允许甲方向乙方传送信息,而乙方不能向甲方传送 。(比喻汽车的单行道。)

  • 为什么有了Http还需要WebSocket?(Http和WebSocket的区别)

    Http单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

    轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。

  • 不使用WebSocket能用别的实现替换吗?

    1. 短轮询:其实就是普通的轮询。指在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。
    2. 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
    3. Server-sent Events:是WebSocket 的一种轻量代替方案,使用 HTTP 协议。SSE 是单向通道,只能服务器向客户端发送消息,如果客户端需要向服务器发送消息,则需要一个新的 HTTP 请求。 这对比 WebSocket 的双工通道来说,会有更大的开销。这么一来的话就会存在一个「什么时候才需要关心这个差异?」的问题,如果平均每秒会向服务器发送一次消息的话,那应该选择 WebSocket。如果一分钟仅 5 - 6 次的话,其实这个差异并不大。
  • WebSocket的结构

    主要关注:

    Opcode: 4 bit , 操作码,如果收到一个未知的操作码,接收终端必须断开WebSocket连接。

    0 表示一个持续帧

    1 表示一个文本帧

    2 表示一个二进制帧

    3-7 预留给以后的非控制帧

    8 表示一个连接关闭包

    9 表示一个ping包

    A 表示一个pong包

    B-F 预留给以后的控制帧

  • WebSocket通信的三个过程

    1. 握手阶段

      WebSocket利用了Http进行握手,相比于Http有如下的区别:

      WebSocket 的请求和响应格式:

      客户端握手请求:

             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
      

      服务端握手响应:

              HTTP/1.1 101 Switching Protocols
              Upgrade: websocket
              Connection: Upgrade
              Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
              Sec-WebSocket-Protocol: chat
      
      • Upgrade:
        表示HTTP协议升级为webSocket
      • connection:Upgrade 请求升级。
      • Sec-WebSocket-Key:
        用于服务端进行标识认证,生成全局唯一id,GUID。WebSocket 中 Sec-WebSocket-Key 的生成算法是拼接服务端和客户端生成的字符串,进行SHA1哈希算法,再用base64编码
      • Sec-WebSocket-Version:WebSocket协议版本
      • Sec-WebSocket-Protocol: 请求服务端使用指定的子协议。
        如果指定了这个字段,服务器需要包含相同的字段,并且从子协议的之中选择一个值作为建立连接的响应。
      • Sec-WebSocket-Extensions: WebSocket的扩展。
      • Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 生成的全局唯一id,GUID。
    2. 数据交换阶段

    3. 关闭阶段

  • WebSocket的心跳机制

    为什么需要心跳机制呢?如果没有心跳机制维护WebSocket连接,服务端到时候就会维护着一堆烂连接,占用资源,所以这里如果是面向外部开放的必须要维护。

    websocket协议本身有没有心跳机制,需要自己去定时检测。

posted @ 2021-11-10 19:41  rongbu2  阅读(38)  评论(0)    收藏  举报