0.0.1 • Published 7 years ago

mitm-node-websocket v0.0.1

Weekly downloads
-
License
ISC
Repository
-
Last release
7 years ago

基于TCP实现WebSocket 做一些简单的封装

0 1 2 3 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 +-+-+-+-+-------+-+-------------+-------------------------------+ |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 ... | +---------------------------------------------------------------+

|Opcode | Meaning | Reference | -+--------+-------------------------------------+-----------| | 0 | Continuation Frame | RFC 6455 | -+--------+-------------------------------------+-----------| | 1 | Text Frame | RFC 6455 | -+--------+-------------------------------------+-----------| | 2 | Binary Frame | RFC 6455 | -+--------+-------------------------------------+-----------| | 8 | Connection Close Frame | RFC 6455 | -+--------+-------------------------------------+-----------| | 9 | Ping Frame | RFC 6455 | -+--------+-------------------------------------+-----------| | 10 | Pong Frame | RFC 6455 | -+--------+-------------------------------------+-----------|

为什么要这么解析? Unit8Array 8位无符号整数值的类型化数组 分析第一位字节 e0 二进制 binary Number.prototype.toString.call(e0, 2) 第一位字节十进制为129 二进制为 10000001 右移:按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。 FIN flag 取第一位所以右移7取到第一位 10000001 右移7 00000001 &是"与"运算符:同时为1才得1,一个为0就为0 eg:1111 & 0011 = 0011 Opcode &15 15的8位二进制为00001111 代表取后面4位 10000001 & 00001111 = 0001 PayloadLength 为第二个字节的后7位 &01111111 | &127 | &0x7F websocket划分了三个数据传输界限,PayloadLength 7个bit 最多表示 127byte,有时候这不够用,所以有了拓展PayloadLength 当PayloadLength为126时 用2byte表示扩展长度 最大表示65535byte 约等于64kb 当PayloadLength为127时 用4byte表示扩展长度 最大表示4294967295byte 等于4gb 因此websocket一个数据帧传输数据的最大限制是4gb (ei++ << 8) + ei++ 左移是用来将多个字节的数据拼接在一起 eg: 1111111100000000 + 11111110 = 11111111 11111110 掩码 ^是异或运算符 如果对应为中任一个操作数是1那结果就是1,如果两个操作数是1那么结果是0 eg: 000000001 ^ 00000011 = 00000010

代码部分学习于:https://juejin.im/entry/5a012eab518825297a0e27f0