WebSocket

WebSocket是基于TCP的全双工协议。WebSocket是2011年IETF RFC6455中定义的标准,他的API是W3C定义的。

WebSocket不仅适用于浏览器、服务端的程序,还适用于客户端、服务端的程序。WebSocket是基于TCP的协议。WebSocket让服务器和客户端交换成为可能,提高数据的实时传输。定义了服务端传主动传输数据给客户端的标准。

WebSocket协议使用ws和wss作为URI(Uniform Resource Identifier)

Protocol dependencies

TCP: WebSocket基于TCP的协议,WebSocket一般使用80和443口传输数据。

Connection setup

建立一个WebSocket连接,客户端需要发送WebSocket握手请求,服务端返回WebSocket握手响应,如下:

客户端请求(与HTTP相似,每行的结尾都使用\r\n):

GET / HTTP/1.1
Host: 192.168.43.135:12345
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
Sec-WebSocket-Key: bKdPyn3u98cTfZJSh4TNeQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

服务端响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 4EaeSCkuOGBy+rjOSJSMV+VMoC0=
WebSocket-Origin: file://
WebSocket-Location: ws://192.168.43.135:12345/ 

数据传输

使用Python WebSocket服务端和JavaScript客户端。

从服务端发送数据给客户端:

Frame 7: 79 bytes on wire (632 bits), 79 bytes captured (632 bits)
Ethernet II, Src: Vmware_8a:3d:a7 (00:0c:29:8a:3d:a7), Dst: Vmware_c0:00:08 (00:50:56:c0:00:08)
Internet Protocol Version 4, Src: 192.168.43.135, Dst: 192.168.43.1
Transmission Control Protocol, Src Port: 12345, Dst Port: 50999, Seq: 205, Ack: 510, Len: 25
WebSocket1... .... = Fin: True.000 .... = Reserved: 0x0.... 0001 = Opcode: Text (1)0... .... = Mask: False.001 0111 = Payload length: 23Payload
JavaScript Object Notation
Line-based text dataWelcome, 192.168.43.1 ! 

从客户端发送数据给服务端:

Frame 9: 72 bytes on wire (576 bits), 72 bytes captured (576 bits)
Ethernet II, Src: Vmware_c0:00:08 (00:50:56:c0:00:08), Dst: Vmware_8a:3d:a7 (00:0c:29:8a:3d:a7)
Internet Protocol Version 4, Src: 192.168.43.1, Dst: 192.168.43.135
Transmission Control Protocol, Src Port: 50999, Dst Port: 12345, Seq: 510, Ack: 230, Len: 18
WebSocket1... .... = Fin: True.000 .... = Reserved: 0x0.... 0001 = Opcode: Text (1)1... .... = Mask: True.000 1100 = Payload length: 12Masking-Key: e17e8eb9Masked payloadPayload
JavaScript Object Notation
Line-based text datatest message 

下面来看下官方提供的pcap:

我们来分析下。

首先是TCP三次握手,从中可以知道,服务端端口为12345,客户端端口为50999

客户端向服务端发送了一个HTTP请求,他的head里面带有很多webSocket的头,并且Connection设置为了Upgrade,随后服务端回复ACK:

随后服务端给客户端发送HTTP/1.1 101 Switching Protocols,头信息里面Upgrade为webSocket,Connection为Upgrade,并且带有一些WebSocket的头信息:

随后服务端向客户端推送WebSocket数据,内容为Welcome, 192.168.43.1 !

客户端收到后回复ACK

这里客户端发送数据给服务端,内容为test message

这个应该是个聊天室,这里服务端收到后,又给客户端回了相同的信息,并且信息里面还有哪个IP,什么时候说的这句话:

剩下的部分就不分析了,在看一个TCP Keep-Alive

从中可以看出都是客户端发出来的,Keep-Alive,然后服务端做ACK应答。

Wireshark文档阅读笔记-WebSocket协议基本概念相关推荐

  1. Wireshark文档阅读笔记-User Datagram Protocol(UDP)

    UDP(User Datagram Protocol):用户数据协议,UDP是无状态的传输. UDP没有提供任何检测机制,检测丢包,重复包,的功能. 基于UDP的协议有BOOTP,DNS,NTP,SN ...

  2. Wireshark文档阅读笔记-TCP 4 times close解析与实例

    先介绍一个知识点: 当TCP最后一次握手结束后,也就是客户端发送ACK后,客户端不会立即释放资源.会先将状态转换为TIME-WAIT然后等到2-MSL(Maximum Segment Lifetime ...

  3. Wireshark文档阅读笔记-TCP 3 way handshaking解析与实例

    这里先介绍2个概念: TCB:Transmission Control Block,传输控制块,这个和PCB(进程控制块)类似,存储了很多重要的内容.如TCP连接表,发送缓存指针和接收缓存指针,重发队 ...

  4. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

  5. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图

    Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...

  6. Qt文档阅读笔记-Rotations Example相关

    Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...

  7. FreeRTOS官方指导文档阅读笔记

    FreeRTOS官方指导文档阅读笔记 基于 161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf,可 ...

  8. Blockly学习之文档阅读笔记

    文档阅读来源--谷歌官网介绍: https://developers.google.com/blockly/guides/overview 概述 一个用于Web.Android.iOS的可视化代码编辑 ...

  9. 网络协议文档阅读笔记-TLS vs DTLS | Difference between TLS and DTLS

    TLS是工作在除应用层协议外最顶层的协议.也就是传输层协议,这个协议,在有些文档中称为应用层的子协议.DTLS与TLS区别就在那个D,也就是Datagram TLS协议 TLS:提供了应用程序(如We ...

最新文章

  1. .Net Discovery 系列之九--string从入门到精通(勘误版下)
  2. 让IIS建立的站点默认是.net 2.0的,而不是.net 1.1的代码
  3. 虚拟化的发展历程和实现原理——图文详解
  4. mac怎么实现文件读写c语言,使用Sublime Text和Xcode在Mac上进行文件输入/输出。 C语言...
  5. Qt Creator连接设备
  6. 高中关于人工智能方面的课题_如何看待计算机专业开始设置人工智能课程
  7. vue中选项和url根据彼此的改变实现高亮显示
  8. 当一个人把你所有联系方式删除,意味着什么?
  9. idea中如何生成jar文件
  10. 用户体验与可用性测试_读书笔记
  11. java实现随机抽取题目_随机抽取样本问题蓄水池算法按权重抽取问题
  12. 最新版 | 2020李沐《动手学深度学习》中文版pdf重磅开源!
  13. 微信小程序组件间传值
  14. 微信公众号账号测试申请
  15. python爬取豆瓣读书,python爬取数据豆瓣读书
  16. Spring ClassPathResource详解
  17. agx 安装ros opencv_CARLA与Autoware和ROS的联合仿真安装过程
  18. [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解
  19. NTC热敏电阻原理及应用
  20. 基于 NIOS-II 软核的流水灯

热门文章

  1. three.js 源代码凝视(七)Math/Euler.js
  2. awk:split()函数、数组、自定义函数
  3. C++编程笔记:贪心算法实现部分背包问题
  4. 企业即时通讯软件2013 即时通讯大手笔
  5. 浅谈SQL中存储过程和自定义函数的区
  6. 给缺少Python项目实战经验的人,赶紧收藏!
  7. 如何从初级程序员变成高级程序员?赶紧看一看
  8. 易混淆知识点(1):word-wrap和word-break傻傻分不清楚
  9. java 方法重载调用_Java方法的定义以及调用、方法重载、可变参数以及递归
  10. 年薪50-80万 | 海南省崖州湾种子实验室海外优青招聘公告