Sword websocket分析一

什么是WebSocket
WebSocket是一个允许Web应用程序(通常指浏览器)与服务器进行双向通信的协议。
HTML5的WebSocket API主要是为浏览器端提供了一个基于TCP协议实现全双工通信的方法。

传输帧格式

0Bit:
FIN 结束标识位,如果FIN为1,代表该帧为结束帧(如果一条消息过长可以将其拆分为多个帧,
这时候FIN可以置为0,表示后面还有数据帧,服务器需要将该帧内容缓存起来,待所有帧都接收后再拼接到一起。控制帧不可拆分为多帧)。
1~3Bit: RSV1~RSV3 保留标识位,以后做协议扩展时才会用到,目前该3位都为0 4~7Bit: opcode 操作码,用于标识该帧负载的类型,如果收到了未知的操作码,则根据协议,需要断开WebSocket连接。操作码含义如下: 0x00 连续帧,浏览器的WebSocket API一般不会收到该类型的操作码 0x01 文本帧,最常用到的数据帧类别之一,表示该帧的负载是一段文本(UTF-8字符流) 0x02 二进制帧,较常用到的数据帧类别之一,表示该帧的负载是二进制数据 0x03-0x07 保留帧,留作未来非控制帧扩展使用 0x08 关闭连接控制帧,表示要断开WebSocket连接,浏览器端调用close方法会发送0x08控制帧 0x09 ping帧,用于检测端点是否可用,暂未发现浏览器可以通过何种方法发送该帧 0x0A pong帧,用于回复ping帧,暂未发现浏览器可以发送此种类型的控制帧 0x0B-0x0F 保留帧,留作未来控制帧扩展使用 8Bit: MASK 掩码标识位,用来表明负载是否经过掩码处理,浏览器发送的数据都是经过掩码处理(浏览器自动处理,无需开发者编码),
服务器发送的帧必须不经过掩码处理。所以此处浏览器发送的帧必为1,服务器发送的帧必为0,否则应断开WebSocket连接
9~15Bit: payload length 负载长度,单位字节如果负载长度0~125字节,则此处就是负载长度的字节数,如果负载长度在126~65535之间,
则此处的值为12616~32Bit表示负载的真实长度。如果负载长度在65536~2的64次方-1时,则此处的值为12716~80Bit表示负载的真实长度。
其中负载长度包括应用数据长度和扩展数据的长度 payload length 后面4个字节可能是掩码的key(如果掩码位是1则有这4个字节的key,否则没有,一般服务端不需要使用掩码)。 接下来就是负载的数据了,他们可能需要根据掩码的key进行编码(仅浏览器需要掩码),如果存在扩展数据,需要放在应用数据之前
客户端http报文

Upgrade: websocket
Connection: Upgrade
表示发起的是Websocket协议
Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的
Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本)

 

服务端http报文

Upgrade: websocket
Connection: Upgrade
通知客户端即将升级的是 Websocket 协议
Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值