一 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 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

WebSocket协议探究(序章)相关推荐

  1. 【译】 WebSocket 协议第十一章——IANA 注意事项(IANA Considerations)

    概述 本文为 WebSocket 协议的第十一章,本文翻译的主要内容为 WebSocket 的 IANA 相关注意事项. IANA 注意事项(协议正文) 11.1 注册新 URI 协议 11.1.1 ...

  2. 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)

    概述 本文为 WebSocket 协议的第六章,本文翻译的主要内容为 WebSocket 消息发送与接收相关内容. 发送与接收消息(协议正文) 6.1 发送数据 为了通过 WebSocket 连接发送 ...

  3. 【译】WebSocket协议第四章——连接握手(Opening Handshake)

    概述 本文为WebSocket协议的第四章,本文翻译的主要内容为WebSocket建立连接开始握手的内容,主要包含了客户端和服务端握手的内容,以及双方如何处理相关字段和逻辑. 4 开始握手(协议正文) ...

  4. 【译】 WebSocket 协议第十章——安全性考虑(Security Considerations)

    概述 本文为 WebSocket 协议的第九章,本文翻译的主要内容为 WebSocket 安全性相关内容. 10 安全性考虑(协议正文) 这一章描述了一些 WebSocket 协议的可用的安全性考虑. ...

  5. WebSocket 协议 RFC 文档(全中文翻译)

    概述 经过半年的捣鼓,终于将 WebSocket 协议(RFC6455)全篇翻译完成.现在将所有章节全部整理到一篇文章中,方便大家阅读.如果大家想看具体的翻译文档,可以去我的GitHub中查看. 具体 ...

  6. 理解WebSocket协议中控制帧:close、ping、pong

    控制帧 控制帧用于WebSocket协议交换状态信息,控制帧可以插在消息片段之间. 所有的控制帧的负载长度均不大于125字节,并且禁止对控制帧进行分片处理. 目前控制帧的操作码定义了oxo8(关闭帧) ...

  7. 【译】 WebSocket 协议第十二章——使用其他规范中的WebSocket协议

    概述 本文为 WebSocket 协议的第十二章,本文翻译的主要内容为如何使用其他规范中的 WebSocket 协议. 使用其他规范中的WebSocket协议(协议正文) WebSocket协议旨在由 ...

  8. WebSocket 协议

    1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用到 HTTP 轮询的方式.围绕轮询产生了 "短轮询" 和 "长轮询". ...

  9. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

最新文章

  1. excel宏转txt替换强制换行符_三个步骤学会用EXCEL批量导入anki题库
  2. centos6.5环境wget报错Unable to establish SSL connection
  3. DbHelperSQL 判断数据库表结构公用方法
  4. 一个SAP成都研究院开发工程师的2020年度总结:未知生,焉知死
  5. Android之运行Java.lang.UnsatisfiedLinkError的错误解决办法
  6. android jni示例_Android服务示例
  7. unity3d 鼠标延各个方向拖拽物体
  8. 来自专业的RIA咨询strechmedia机构提供的Flex组件
  9. mysql 删除创建表分区_创建,增加,删除mysql表分区
  10. Silverlight 模拟Nano5 界面效果
  11. 每一个ip地址只能投票一次php代码,PHP,一个IP只能访问一次的代码
  12. Android全局变量使用
  13. 《模拟电子技术基础》-(童诗白)笔记
  14. linux解压war包命令改配置文件脚本,自动解压war包,并替换胚子和文件,重启tomcat,实现自动化部署。...
  15. 生物信息学笔记03 -- 基因组序列分析 方法
  16. linux6 下dns配置,RHEL6中DNS配置
  17. 微擎跳过云平台_2018年10月微擎安装之阿里云懒人教程篇
  18. 照片怎么无损放大尺寸,三种方法无损放大照片
  19. 在受控主机上创建文件或目录
  20. 图片查看器 Viewer.js

热门文章

  1. Ubuntu系统目录结构
  2. 三个值得期待的JavaScript新功能!
  3. Shiro切入Spring的方式
  4. spring mvc4 笔记
  5. NVelocity的宏使用
  6. Center os vi
  7. [转]Laravel 4之URL生成
  8. promo和promotion
  9. MYSQL 实时升级
  10. 人类大脑每日24小时工作节奏表