介绍
RFC官网给出的数据帧格式
字段解释
- FIN(1bit): 标记位,表示该数据帧是否为完整消息最后的数据帧。
- RSV1/2/3(各1bit): 标记位,根据RFC的介绍,这三个bit位是用做扩展用途,没有这个需求的话设置为0。
- opcode(4bit): 表示该数据帧的操作类型,后面会具体介绍。
- MASK(1bit): 标记位,标记是否使用掩码,和Masking-key配合使用,按照规定,服务端无需使用掩码,客户端必须使用掩码。
- Payload len(7bit): 表示Payload(消息体)部分内容长度,因为是无符号整形表达,所以表示范围为0 - 127。
- Extended payload len: 根据Payload len的值判断是否开启扩展,如果Payload len值等于126,则Extended payload len位数为16;如果Payload len值等于127,Extended payload len的位数为64。
- Masking-key(32bit): 如果MASK标记为1则启用该字段,字段的值用来解码客户端发送给服务端的数据帧。
- Payload Data: 消息体内容
opcode
参考IPV4首部Protocal字段
Protocal字段定义了一些功能,比如说用来ping地址的ICMP包就是通过定义IPV4首部中Protocal进行收发IP数据包实现的。
同理,WebSocket中的opcode字段也是定义了WebSocket帧的功能,下面列出部分值:
- 0x0 denotes a continuation frame 标示当前数据帧为分片的数据帧,也就是当一个消息需要分成多个数据帧来传送的时候,需要将opcode设置位0x0。
- 0x1 denotes a text frame 标示当前数据帧传递的内容是文本
- 0x2 denotes a binary frame 标示当前数据帧传递的是二进制内容,不要转换成字符串
- 0x8 denotes a connection close 标示请求关闭连接
- 0x9 denotes a ping 标示Ping请求
- 0xA denotes a pong 标示Pong数据包,当收到Ping请求时自动给回一个Pong
参考资料
小林coding——图解网络
RFC 6445