首页 > 语言 > JavaScript > 正文

node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例

2024-05-06 15:44:21
字体:
来源:转载
供稿:网友

本文实例讲述了node.js 使用 net 模块模拟 websocket 握手进行数据传递操作。分享给大家供大家参考,具体如下:

websocket 是一种让浏览器与服务器之间建立持久的连接,并能进行双向数据传输的一种协议。

websocket 属性应用层协议,基于tcp传输协议,并复用http的握手通道。

一、如何进行websocket连接。

websocket复用了http的握手通道,客户端通过http请求与服务端进行协商,升级协议。协议升级完后,后面的数据交换则遵照websocket协议。

1、客户端申请协议升级

Request URL: ws://localhost:8888/Request Method: GETConnection: UpgradeUpgrade: websocketSec-WebSocket-Version: 13Sec-WebSocket-Key: uR5YP/BMO6M24tAFcmHeXw==Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Connection: Upgrade 表示要升级协议 Upgrade: websocket 表示升级到websocket协议 Sec-WebSocket-Version: 13 表示websocket的版本 Sec-WebSocket-Key 表示websocket的验证,防止恶意的连接,与服务端响应的Sec-WebSocket-Accept是配套。

2、服务端响应协议升级

Status Code: 101 Switching ProtocolsConnection: UpgradeSec-WebSocket-Accept: eS92kXpBNI6fWsCkj6WxH6QeoHs=Upgrade: websocket

Status Code:101 表示状态码,协议切换。

Sec-WebSocket-Accept 表示服务端响应的校验,与客户端的Sec-WebSocket-Key是配套的。

3、Sec-WebSocket-Accept是如何计算的

将 Sec-WebSocket-Key 的值与 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。

然后通过sha1计算,再转成base64。

const crypto = require('crypto');function getSecWebSocketAccept(key) {  return crypto.createHash('sha1')    .update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')    .digest('base64');}console.log(getSecWebSocketAccept('uR5YP/BMO6M24tAFcmHeXw=='));

4、协议升级完后,后续的数据传输就需要按websocket协议来走。

websocket客户端与服务端通信的最小单位是 帧,由1个或多个帧组成完整的消息。

客户端:将消息切割成多个帧,发送给服务端。

服务端:接收到消息帧,将帧重新组装成完整的消息。

5、数据帧的格式

单位是1个比特位,FIN,PSV1,PSV2,PSV3 占1个比特位,opcode占4个比特位。

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7+-+-+-+-+-------+-+-------------+-------------------------------+|F|R|R|R| opcode|M| Payload len |  Extended payload length  ||I|S|S|S| (4) |A|   (7)   |       (16/64)      ||N|V|V|V|    |S|       |  (if payload len==126/127)  || |1|2|3|    |K|       |                |+-+-+-+-+-------+-+-------------+-------------------------------+|   Extended payload length continued, if payload len == 127 |+-------------------------------+-------------------------------+|                |Masking-key, if MASK set to 1 |+-------------------------------+-------------------------------+| Masking-key (continued)    |     Payload Data     |+-------------------------------+-------------------------------+|           Payload Data continued ...        |+---------------------------------------------------------------+|           Payload Data continued ...        |+---------------------------------------------------------------+            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选