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 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协议探究(序章)相关推荐
- 【译】 WebSocket 协议第十一章——IANA 注意事项(IANA Considerations)
概述 本文为 WebSocket 协议的第十一章,本文翻译的主要内容为 WebSocket 的 IANA 相关注意事项. IANA 注意事项(协议正文) 11.1 注册新 URI 协议 11.1.1 ...
- 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)
概述 本文为 WebSocket 协议的第六章,本文翻译的主要内容为 WebSocket 消息发送与接收相关内容. 发送与接收消息(协议正文) 6.1 发送数据 为了通过 WebSocket 连接发送 ...
- 【译】WebSocket协议第四章——连接握手(Opening Handshake)
概述 本文为WebSocket协议的第四章,本文翻译的主要内容为WebSocket建立连接开始握手的内容,主要包含了客户端和服务端握手的内容,以及双方如何处理相关字段和逻辑. 4 开始握手(协议正文) ...
- 【译】 WebSocket 协议第十章——安全性考虑(Security Considerations)
概述 本文为 WebSocket 协议的第九章,本文翻译的主要内容为 WebSocket 安全性相关内容. 10 安全性考虑(协议正文) 这一章描述了一些 WebSocket 协议的可用的安全性考虑. ...
- WebSocket 协议 RFC 文档(全中文翻译)
概述 经过半年的捣鼓,终于将 WebSocket 协议(RFC6455)全篇翻译完成.现在将所有章节全部整理到一篇文章中,方便大家阅读.如果大家想看具体的翻译文档,可以去我的GitHub中查看. 具体 ...
- 理解WebSocket协议中控制帧:close、ping、pong
控制帧 控制帧用于WebSocket协议交换状态信息,控制帧可以插在消息片段之间. 所有的控制帧的负载长度均不大于125字节,并且禁止对控制帧进行分片处理. 目前控制帧的操作码定义了oxo8(关闭帧) ...
- 【译】 WebSocket 协议第十二章——使用其他规范中的WebSocket协议
概述 本文为 WebSocket 协议的第十二章,本文翻译的主要内容为如何使用其他规范中的 WebSocket 协议. 使用其他规范中的WebSocket协议(协议正文) WebSocket协议旨在由 ...
- WebSocket 协议
1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用到 HTTP 轮询的方式.围绕轮询产生了 "短轮询" 和 "长轮询". ...
- Netty序章之BIO NIO AIO演变
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...
最新文章
- excel宏转txt替换强制换行符_三个步骤学会用EXCEL批量导入anki题库
- centos6.5环境wget报错Unable to establish SSL connection
- DbHelperSQL 判断数据库表结构公用方法
- 一个SAP成都研究院开发工程师的2020年度总结:未知生,焉知死
- Android之运行Java.lang.UnsatisfiedLinkError的错误解决办法
- android jni示例_Android服务示例
- unity3d 鼠标延各个方向拖拽物体
- 来自专业的RIA咨询strechmedia机构提供的Flex组件
- mysql 删除创建表分区_创建,增加,删除mysql表分区
- Silverlight 模拟Nano5 界面效果
- 每一个ip地址只能投票一次php代码,PHP,一个IP只能访问一次的代码
- Android全局变量使用
- 《模拟电子技术基础》-(童诗白)笔记
- linux解压war包命令改配置文件脚本,自动解压war包,并替换胚子和文件,重启tomcat,实现自动化部署。...
- 生物信息学笔记03 -- 基因组序列分析 方法
- linux6 下dns配置,RHEL6中DNS配置
- 微擎跳过云平台_2018年10月微擎安装之阿里云懒人教程篇
- 照片怎么无损放大尺寸,三种方法无损放大照片
- 在受控主机上创建文件或目录
- 图片查看器 Viewer.js