WebSocket协议探究(序章)

一 WebSocket协议基于HTTP和TCP协议

  • 与往常一样,进入WebSocket协议学习之前,先进行WebSocket协议抓包,来一个第一印象。
  • WebSocket能实现客户端和服务器间双向、基于消息的文本或二进制的数据传输。
    • HTTP握手机制用于协商连接参数
    • 二进制消息分帧机制用于支持低开销的数据传输
  • WebSocket协议特点:
    • 连接协商和同源策略
    • 与既有 HTTP 基础设施的互操作
    • 基于消息的通信和高效消息分帧
    • 子协议协商及可扩展能减少通信量

二 抓包分析

1136599-20181207152452498-913009192.png

  • WebSocket客户端(MQTTBox)
    • IP:192.168.1.10
    • port:2994
  • WebSocket服务器(Eclipse的MQTT服务器)
    • IP:198.41.30.241
    • port:80

1 TCP三次握手

192.168.1.10    198.41.30.241   TCP 2994 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
198.41.30.241   192.168.1.10    TCP 80 → 2994 [SYN, ACK] Seq=0 Ack=1 Win=14600 Len=0 MSS=1412 SACK_PERM=1 WS=64
192.168.1.10    198.41.30.241   TCP 2994 → 80 [ACK] Seq=1 Ack=1 Win=66304 Len=0

注:TCP讲解了很多遍了,就简单贴出来了。

2 HTTP协议交换

# 1.客户端 -> 服务器 ,HTTP升级Webscoket请求
192.168.1.10    198.41.30.241   HTTP    310 GET /ws HTTP/1.1 
Hypertext Transfer ProtocolGET /ws HTTP/1.1\r\n # Method url 协议版本Connection: Upgrade\r\n # 升级协议Upgrade: websocket\r\n # 升级为webscoketHost: iot.eclipse.org\r\n # 主机名Sec-WebSocket-Version: 13\r\n # websocket版本Sec-WebSocket-Key: MTMtMTU0NDE1NjY2MjM2NA==\r\n # 客户端标识符Sec-WebSocket-Protocol: mqtt\r\n # 子协议Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n # 拓展属性# TCP应答报文
198.41.30.241   192.168.1.10    TCP 60  80 → 2994 [ACK] Seq=1 Ack=257 Win=15680 Len=0# 2.服务器 -> 客户端,协议升级应答
198.41.30.241   192.168.1.10    HTTP    213 HTTP/1.1 101 Switching Protocols 
Hypertext Transfer ProtocolHTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n# base64(sha1(客户端标识符+固定UUID))Sec-WebSocket-Accept: pC5iSVAHF4dkYCnA6rA0VDfEpuI=\r\nSec-WebSocket-Protocol: mqtt\r\n

3 数据传输

  • HTTP协议升级为WebSocket协议后,并不适用HTTP报文封装WebSocket报文,而是直接基于TCP报文。
  • 报文的格式为二进制或字符。
  • 发送方需要设置Mask为True,并发送Masking-Key;Masking-Key会一直变化。(解析方式以后细说)
# 只截取MQTT中PINGREQ和PINGRESP报文# PINGREQ报文
192.168.1.10    198.41.30.241   WebSocket   62  WebSocket Binary [FIN] [MASKED]
WebSocket1... .... = Fin: True # 是否为最终帧.000 .... = Reserved: 0x0 # 保留.... 0010 = Opcode: Binary (2) # 操作码1... .... = Mask: True # 是否掩码.000 0010 = Payload length: 2 # 负载长度Masking-Key: 8f 06 5d 55 # 掩码的Key值(Mask为True时需要传输该字段)Masked payloadData: 4f06 -> (4f xor 8f == c0)(06 xor 06 ==00) == c000# PINGRESP报文    
198.41.30.241   192.168.1.10    WebSocket   60  WebSocket Binary [FIN] 
WebSocket1... .... = Fin: True.000 .... = Reserved: 0x0.... 0010 = Opcode: Binary (2)0... .... = Mask: False.000 0010 = Payload length: 2PayloadData: d000

注:MQTT报文请参考MQTT协议探究(一)

参考:

  • 《图解HTTP》
  • 《Web性能权威指南》

转载于:https://www.cnblogs.com/linzhanfly/p/10083161.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部