02、WebSocket协议数据包的长度
一、负载长度的表示
(一)负载长度有两部分组成
7比特负载长度
变化的扩展长度
(二)实际的选择
1、负载数据字节数低于126
负载长度直接设置在7比特的负载长度里。
扩展长度部分不存在。
2、如果负载数据长度在126到65535之间
设置7比特负载长度的值是126。
扩展长度占用2个字节,总共16位,用无符号格式存放负载数据长度。
3、如果负载数据长度超过65535
设置7比特负载长度的值是127。
扩展长度占用8个字节,总共64位,用无符号格式存放实际负载的数据长度。
二、掩码
只有客户端发给服务端的数据包才设置掩码。
(一)掩码占用4字节
由客户端随机生成一个4字节整数。
(二)用掩码处理客户端给服务端的负载数据
1、客户端发送时,把负载数据按照连续的4个字节分组。
2、每个分组和4字节掩码的对应位置进行异或计算;
不足4个字节的分组也要对应位置进行异或计算。
假设4字节掩码是:4、5、6、7。
掩码计算思路(符号"^"代表是异或运算):
如果数据序列是: 12,13
计算结果是: 12^4,13^5
如果数据序列是:12,13,14,15
计算结果是: 12^4,13^5,14^6,15^7
如果数据序列是:12,13,14,15,16,17
计算结果是: 12^4,13^5,14^6,15^7,16^4,17^5
计算掩码的方法:
// int mask是掩码
// data是原始负载数据组成的字节数组
public void maskOp(int mask, byte[] data){
// 存放掩码的字节序列
byte[] code = new byte[4];
// 获取掩码的4个对应字节
code[0] = (byte)((mask & 0xFF000000) >> 24);
code[1] = (byte)((mask & 0xFF0000) >> 16);
code[2] = (byte)((mask & 0xFF00) >> 8);
code[3] = (byte)(mask & 0xFF);
// 遍历每个字节,对4取余,获得掩码的下标,取值进行异或运算,再赋值
for(int k = 0; k < data.length; k++){
data[k] = data[k] ^ code[k % 4];
}
}
(三)服务器接收时用掩码还原负载数据
1、获取掩码。
2、把每个负载数据按顺序和掩码异或计算,获得原来的负载数据。
说明: 一个数被另一个数计算两次异或,得到它本身。
例如:"1 ^ 2 ^ 2"的计算结果和1相等。
更多推荐


所有评论(0)