琅绫擎重要的是 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个字节。
- 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
所以如不雅要组装一个帧数据可以如许子:
- char *rev = (rev *)malloc(4);
- rev[0] = (char)(0x81 & 0xff);
- rev[1] = 126 & 0x7f;
- rev[2] = 1;
- 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 的和
而数据的发送和攫取就是对帧的封装和解析。
数据发送:
- void ws__wrap_packet(_WS_IN websocket_t *ws,
- _WS_IN const char *payload,
- _WS_IN unsigned long long payload_size,
- _WS_IN int flags,
- _WS_OUT char** out,
推荐阅读
应用redis-6379为主机,其余两台为大年夜机应用 docker exec -ti 容器ID /bin/bash 分别进入三个Redis容器进入容器后,应用 redis-cli 敕令,连接redis办事端连接办过后,应用 info replication 查看当前机械的角色未>>>详细阅读
本文标题:WebSocket实现原理
地址:http://www.17bianji.com/lsqh/36156.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示