一 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\r\n # Method url 协议版本
Connection: Upgrade\r\n # 升级协议
Upgrade: websocket\r\n # 升级为webscoket
Host: 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 Protocol
HTTP/1.1 101 Switching Protocols\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
# base64(sha1(客户端标识符+固定UUID))
Sec-WebSocket-Accept: pC5iSVAHF4dkYCnA6rA0VDfEpuI=\r\n
Sec-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]
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性能权威指南》

WebSocket协议探究(序章)的更多相关文章

  1. WebSocket协议探究(三):MQTT子协议

    一 复习和目标 1 复习 Nodejs实现WebSocket服务器 Netty实现WebSocket服务器(附带了源码分析) Js api实现WebSocket客户端 注:Nodejs使用的Socke ...

  2. WebSocket协议探究(二)

    一 复习和目标 1 复习 协议概述: WebSocket内置消息定界并且全双工通信 WebSocket使用HTTP进行协议协商,协商成功使用TCP连接进行传输数据 WebScoket数据格式支持二进制 ...

  3. WebSocket协议探究(一)

    一 复习和目标 1 复习 上一节使用wireshark抓包分析了WebSocket流量 包含连接的建立:HTTP协议升级WebSocket协议 使用建立完成的WebSocket协议发送数据 2 目标 ...

  4. WebSocket协议中文版

    WebSocket协议中文版 摘要 WebSocket协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信.用于这个安全模型是通常由web浏览器使用 ...

  5. Websocket协议的学习、调研和实现

    本文章同时发在 cpper.info. 1. websocket是什么 Websocket是html5提出的一个协议规范,参考rfc6455. websocket约定了一个通信的规范,通过一个握手的机 ...

  6. CCNA+NP学习笔记—序章

    本人就读于南京捷式泰网络科技有限公司学习CCIE,这几天准备将多年来的纸质版笔记全部写成电子版献给大家以留下自己学习的足迹.本章是基础篇章,内容较少,主要为之后的内容做铺垫.所有笔记的分类顺序为:序章 ...

  7. WebSocket协议:5分钟从入门到精通

    一.内容概览 WebSocket的出现,使得浏览器具备了实时双向通信的能力.本文由浅入深,介绍了WebSocket如何建立连接.交换数据的细节,以及数据帧的格式.此外,还简要介绍了针对WebSocke ...

  8. Netty5序章之BIO NIO AIO演变

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

  9. Netty序章之BIO NIO AIO演变

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

随机推荐

  1. Xgboost建模

    xgboost参数 选择较高的学习速率(learning rate).一般情况下,学习速率的值为0.1.但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动.选择对应于此学习速率的理 ...

  2. ES6深入浅出-2 新版函数:箭头函数 2 视频-2.视频 箭头函数杂谈

    杂谈coffeescript 箭头函数抄的是谁? coffeescript 双箭头的形式 箭头函数简洁的语法 数组内每一个值都平方一下 Map的写法 箭头函数的写法 平方后,每一个值再加1 numbe ...

  3. 123457123456#0#-----com.twoapp.YiZhiPuzzle02--前拼后广--儿童日常拼图游戏jiemei

    com.twoapp.YiZhiPuzzle02--前拼后广--儿童日常拼图游戏jiemei

  4. SpringCloud学习成长 四 断路器(Hystrix)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  5. kafka shell file

    1. start kafka and schema_registry #!/bin/sh export KAFKA_HOME=/home/lenmom/workspace/software/confl ...

  6. springboot配置虚拟路径访问用户上传的附件及图片资源

    在springmvc项目中,我们通常把图片及附件存放到WEB-INF/upload类似的路径. springboot项目是通过jar包方式运行的. 笔者曾尝试以下代码,把图片转成base64格式的图片 ...

  7. 01.轮播图之三 : collectionView 轮播

    个人觉得 collection view 做轮播是最方便的,设置下flowlayout 其他不会有很大的变动,没有什么逻辑的代码 let's begin…… 创建自定义的view .h 声明文件 @i ...

  8. php 云片国外短信实例

    <?php namespace Ruifi\App; class SmsL { public function smsIcode($moblie,$sms_code,$intl_code){ h ...

  9. linux 安装了Linux generic mysql 出错

    在一次安装 Linux generic cmake 出错 提示:CMake Error: The source directory "/usr/local/src" does no ...

  10. 解决ffmpeg执行报错“ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory”的问题

    问题现象: 执行ffmpeg命令后报错: ffmpeg: error : cannot open shared object file: No such file or directory 出问题的环 ...