作家
登录

WebSocket实现原理

作者: 来源: 2017-07-11 16:29:23 阅读 我要评论

  •  
  • Upgrade: websocket 
  •  
  • Connection: Upgrade 
  •  
  • Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=  
  • 琅绫擎重要的是 Sec-WebSocket-Accept ,办事端经由过程大年夜客户端请求头中攫取 Sec-WebSocket-Key 与一串全局独一的标识字符串(俗称魔串)“258EAFA5-E914-47DA- 95CA-C5AB0DC85B11”做拼接,生成长度为160位的 SHA-1 字符串,然落后行 base64 编码,作为 Sec-WebSocket-Accept 的值回传给客户端。

    处理握手 HTTP 响应解析的时刻,可以用 nodejs 的 http-paser ,解析方法也比较简单,就是仇人信息的逐字攫取再处理,具体处理你可以看一下它的状况机实现。解析完成后你须要对其内容进行解析,看返回是否精确,同时去治理你的握手状况。

    数据发送/攫取

    数据的处理就要拿这个帧协定图来说清楚明了:

    下面再来看126,126则表示的是 Payload len ,也就是 Payload 的长度:

    起首我们来看看数字的含义,数字表示位,0-7表示有8位,等于1个字节。

    1. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 

    所以如不雅要组装一个帧数据可以如许子:

    1. char *rev = (rev *)malloc(4); 
    2.  
    3. rev[0] = (char)(0x81 & 0xff); 
    4.  
    5. rev[1] = 126 & 0x7f; 
    6.  
    7. rev[2] = 1; 
    8.  
    9. rev[3] = 0;  

    ok,懂得了帧数据的样子,我们反过往来交往懂得值对应的帧字段。

    起首0x81是什么,这个是十六进制数据,转换成二进制就是1000 0001, 是一个字节的长度,也就是这一段琅绫擎每一位的值:

    • FIN 表示该帧是不是消息的最后一帧,1表示停止,0表示还有下一帧。
    • RSV1, RSV2, RSV3 必须为0,除非扩大协商定义了一个非0的值,如不雅没有定义非0值,且收到了非0的 RSV ,那么 WebSocket 的连接会掉效。
    • opcode 用来描述 Payload data 的定义,如不雅收到了一个未知的 opcode ,同样会使 WebSocket 连接掉效,协定定义了以下值:
      • %x0 表示持续的帧
      • %x1 表示 text 帧
      • %x2 表示二进制帧
      • %x3-7 预留给非控制帧
      • %x8 表示封闭连接帧
      • %x9 表示 ping
      • %xA 表示 pong
      • %xB-F 预留给控制帧

    0xff 感化就是掏出须要的二进制值。

    • MASK 表示Playload data 是否要加掩码,如不雅设成1,则须要赋值 Masking-key 。所有大年夜客户端发到办事端的帧都要加掩码
    • Playload len 表示 Payload 的长度,这里分为三种情况
      • 长度小于126,则只须要7位
      • 长度是126,则须要额外2个字节的大年夜小,也就是 Extended payload length
      • 长度是127,则须要额外8个字节的大年夜小,也就是 Extended payload length + Extended payload length continued ,Extended payload length 是2个字节,Extended payload length continued 是6个字节
    • Playload len 则表示 Extension data 与 Application data 的和

    而数据的发送和攫取就是对帧的封装和解析。

    数据发送:

    1. void ws__wrap_packet(_WS_IN websocket_t *ws, 
    2.  
    3. _WS_IN const char *payload, 
    4.  
    5. _WS_IN unsigned long long payload_size, 
    6.  
    7. _WS_IN int flags, 
    8.  
    9. _WS_OUT char** out
    10.  

    11.   推荐阅读

        Linux_基于Docker搭建Redis集群

      应用redis-6379为主机,其余两台为大年夜机应用 docker exec -ti 容器ID /bin/bash 分别进入三个Redis容器进入容器后,应用 redis-cli 敕令,连接redis办事端连接办过后,应用 info replication 查看当前机械的角色未>>>详细阅读


      本文标题:WebSocket实现原理

      地址:http://www.17bianji.com/lsqh/36156.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)