一、负载长度的表示

  (一)负载长度有两部分组成

    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相等。

 

 

 

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐