zoukankan      html  css  js  c++  java
  • WebSocket协议探究(序章)

    一 WebSocket协议基于HTTP和TCP协议

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

    二 抓包分析

    • 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 Protocol
    	GET /ws HTTP/1.1
     # Method url 协议版本
    	Connection: Upgrade
     # 升级协议
    	Upgrade: websocket
     # 升级为webscoket
    	Host: iot.eclipse.org
     # 主机名
    	Sec-WebSocket-Version: 13
     # websocket版本
    	Sec-WebSocket-Key: MTMtMTU0NDE1NjY2MjM2NA==
     # 客户端标识符
    	Sec-WebSocket-Protocol: mqtt
     # 子协议
    	Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
     # 拓展属性
    
    # 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 Protocol
    	HTTP/1.1 101 Switching Protocols
    
    	Upgrade: websocket
    
    	Connection: Upgrade
    
    	# base64(sha1(客户端标识符+固定UUID))
    	Sec-WebSocket-Accept: pC5iSVAHF4dkYCnA6rA0VDfEpuI=
    
    	Sec-WebSocket-Protocol: mqtt
    
    

    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]
    WebSocket
    	1... .... = 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 payload
    		Data: 4f06 -> (4f xor 8f == c0)(06 xor 06 ==00) == c000
    	
    # PINGRESP报文    
    198.41.30.241	192.168.1.10	WebSocket	60	WebSocket Binary [FIN] 
    WebSocket
    	1... .... = Fin: True
    	.000 .... = Reserved: 0x0
    	.... 0010 = Opcode: Binary (2)
    	0... .... = Mask: False
    	.000 0010 = Payload length: 2
    	Payload
    		Data: d000
    

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

    参考:

    • 《图解HTTP》
    • 《Web性能权威指南》
  • 相关阅读:
    使用SELECT语句检索数据
    redis的安装和使用【2】redis的java操作
    Python之数据结构改造
    InnoDB undo log物理结构的初始化
    Redis-RDB持久化设置
    MySql(四)Select条件查询
    Node.js TLS/SSL
    Node.js 定时器
    Node.js 系统
    Node.js 字符串解码器
  • 原文地址:https://www.cnblogs.com/linzhanfly/p/10083161.html
Copyright © 2011-2022 走看看