1、wireshark抓包过滤器

2、 wireshark配置抓取websocket  ,分析 ----启用的协议------------ 选中websocket

3、 配置过滤器,抓包

4、websocket协议 分析详解

ws://82.157.123.54:9010/ajaxchattest

ws://121.40.165.18:8800

在线websocket测试-online tool-postjson

建立连接的流程概述
步骤1:客户端和服务端完成三次握手建立TCP连接,这一点和HTTP协议没有差异

步骤2:由客户端发起HTTP请求,升级协议为WebSocket

步骤3:只需完成一次握手后,就可以实现客户端和服务端主动发送消息内容

步骤4:客户端发送关闭帧,关闭所有连接

客户端:请求升级协议

客户端:请求服务器!升级协议为websocket,版本号为13

 服务端:同意升级协议

服务端:回复客户端一个状态码为101的报文,表明服务端收到啦。协议已经升级成了websocket

发送数据帧

接下来让我们看下,使用WebSocket协议发送的数据帧

FIN:是否为消息的最后一帧,是扣1、不是扣0

RSV1、2、3:保留部分,没啥用(高情商:未雨绸缪)

opcode:帧类型,说明这个帧是干嘛用的,若值为1,该帧为文本类型的

MASK:数据是否需要掩码处理,需要的请扣1

Payload len:数据的长度,长度的最大值是可以调整的,有7、7+16、7+64三种模式

Mask-key:若进行了掩码处理,则在此处填写4个字节的掩码

 

下面是服务器返回的数据帧

websocket协议

该结构的字段语义如下:

  • FIN, 长度为 1 比特, 该标志位用于指示当前的 frame 是消息的最后一个分段, 因为 WebSocket 支持将长消息切分为若干个 frame 发送, 切分以后, 除了最后一个 frame, 前面的 frame 的 FIN 字段都为 0, 最后一个 frame 的 FIN 字段为 1, 当然, 若消息没有分段, 那么一个 frame 便包含了完成的消息, 此时其 FIN 字段值为 1
  • RSV 1 ~ 3, 这三个字段为保留字段, 只有在 WebSocket 扩展时用, 若不启用扩展, 则该三个字段应置为 1, 若接收方收到 RSV 1 ~ 3 不全为 0 的 frame, 并且双方没有协商使用 WebSocket 协议扩展, 则接收方应立即终止 WebSocket 连接
  • Opcode, 长度为 4 比特, 该字段将指示 frame 的类型, RFC 6455 定义的 Opcode 共有如下几种:
    • 0x0, 代表当前是一个 continuation frame
    • 0x1, 代表当前是一个 text frame
    • 0x2, 代表当前是一个 binary frame
    • 0x3 ~ 7, 目前保留, 以后将用作更多的非控制类 frame
    • 0x8, 代表当前是一个 connection close, 用于关闭 WebSocket 连接
    • 0x9, 代表当前是一个 ping frame (将在下面讨论)
    • 0xA, 代表当前是一个 pong frame (将在下面讨论)
    • 0xB ~ F, 目前保留, 以后将用作更多的控制类 frame

  • Mask, 长度为 1 比特, 该字段是一个标志位, 用于指示 frame 的数据 (Payload) 是否使用掩码掩盖, RFC 6455 规定当且仅当由客户端向服务端发送的 frame, 需要使用掩码覆盖, 掩码覆盖主要为了解决代理缓存污染攻击 (更多细节见 RFC 6455 Section 10.3)
  • Payload Len, 以字节为单位指示 frame Payload 的长度, 该字段的长度可变, 可能为 7 比特, 也可能为 7 + 16 比特, 也可能为 7 + 64 比特. 具体来说, 当 Payload 的实际长度在 [0, 125] 时, 则 Payload Len 字段的长度为 7 比特, 它的值直接代表了 Payload 的实际长度; 当 Payload 的实际长度为 126 时, 则 Payload Len 后跟随的 16 位将被解释为 16-bit 的无符号整数, 该整数的值指示 Payload 的实际长度; 当 Payload 的实际长度为 127 时, 其后的 64 比特将被解释为 64-bit 的无符号整数, 该整数的值指示 Payload 的实际长度
  • Masking-key, 该字段为可选字段, 当 Mask 标志位为 1 时, 代表这是一个掩码覆盖的 frame, 此时 Masking-key 字段存在, 其长度为 32 位, RFC 6455 规定所有由客户端发往服务端的 frame 都必须使用掩码覆盖, 即对于所有由客户端发往服务端的 frame, 该字段都必须存在, 该字段的值是由客户端使用熵值足够大的随机数发生器生成, 关于掩码覆盖, 将下面讨论, 若 Mask 标识位 0, 则 frame 中将设置该字段 (注意是不设置该字段, 而不仅仅是不给该字段赋值)
  • Payload, 该字段的长度是任意的, 该字段即为 frame 的数据部分, 若通信双方协商使用了 WebSocket 扩展, 则该扩展数据 (Extension data) 也将存放在此处, 扩展数据 + 应用数据, 它们的长度和便为 Payload Len 字段指示的值

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐