wireshark文档阅读笔记-websocket协议基本概念(代码片段)

IT1995 IT1995     2023-01-10     445

关键词:

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
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0001 = Opcode: Text (1)
    0... .... = Mask: False
    .001 0111 = Payload length: 23
    Payload
JavaScript Object Notation
Line-based text data
    Welcome, 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
WebSocket
    1... .... = Fin: True
    .000 .... = Reserved: 0x0
    .... 0001 = Opcode: Text (1)
    1... .... = Mask: True
    .000 1100 = Payload length: 12
    Masking-Key: e17e8eb9
    Masked payload
    Payload
JavaScript Object Notation
Line-based text data
    test 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应答。

resin文档阅读笔记

阅读文档对应的版本为Resin4.0,且基本只关注Standard版本的功能。 1、Resin可以注册为服务: Toinstalltheservice,useC:/>resin-3.2.x/resin.exe-install-confconf/myconf.xml/-userMyResinUser-passwordmypasswordToremovetheservice, 查看详情

beautifulsoup4.2.0文档阅读笔记(代码片段)

BeautifulSoup4.2.0文档阅读笔记环境:macOSHighSierraversion10.13.2BeautifulSoup4.2.0文档安装BeautifulSoupsudoeasy_installbeautifulsoup4关于easy_install和pip安装解析器sudoeasy_installlxml检测是否安装成功pythonfrombs4importBeautiful 查看详情

laravel文档阅读笔记-howtouse@authand@guestdirectivesinlaravel(代码片段)

Laravel文档阅读笔记-Howtouse@authand@guestdirectivesinLaravel这个是我在阅读Laravel8中的文档时遇到的。在此阅读下@auth和@guest的用法。下面将说明@auth和@guest在Laravel中的使用。这两个关键字其实是代替@if、@endif的... 查看详情

laravel文档阅读笔记-howtouse@authand@guestdirectivesinlaravel(代码片段)

Laravel文档阅读笔记-Howtouse@authand@guestdirectivesinLaravel这个是我在阅读Laravel8中的文档时遇到的。在此阅读下@auth和@guest的用法。下面将说明@auth和@guest在Laravel中的使用。这两个关键字其实是代替@if、@endif的... 查看详情

阅读笔记四

读《需求工程——软件建模与分析》第四部分需求的文档化和验证有感  需求规格说明文档是需求规格说明活动的一个核心元素。(1)需求规格说明文档可以成为各方人员之间有关软件系统的协议基准。(2)需求规格说明文... 查看详情

css文档之盒模型阅读笔记

  前段时间抽空仔细阅读了w3c的css文档关于盒模型方面的一些基础知识。边读边记录了一些要点,在此做些整理,与大家分享,如有理解有误之处,请不吝指教。1.综述文档中的每个元素被描绘为矩形盒子。渲染引擎的目的就... 查看详情

cloudstream官方文档阅读笔记2

1、引入springcloudStreamspringcloudStream是一个可以用于构建消息驱动服务的框架为了能够使你的应用连到一个messagebroker,你可以添加一个@EnableBinding注解到你的应用中,然后,你可以添加@StreamListener来监听接收事件在你的Stream进程里面... 查看详情

c++文档阅读笔记-understandingnullptrinc++(代码片段)

在编程中经常会使用到指针为NULL(needofnullptr)。如下代码://C++programtodemonstrateproblemwithNULL#include<bits/stdc++.h>usingnamespacestd;//functionwithintegerargumentvoidfun(i 查看详情

c++文档阅读笔记-understandingnullptrinc++(代码片段)

在编程中经常会使用到指针为NULL(needofnullptr)。如下代码://C++programtodemonstrateproblemwithNULL#include<bits/stdc++.h>usingnamespacestd;//functionwithintegerargumentvoidfun(i 查看详情

qt文档阅读笔记-qtconcurrentprogressdialogexample解析(代码片段)

这篇展示了如何监听任务的进度。QtConcurrentProgressDialog使用QFutrueWathcer类去监听任务进程进展。代码如下:progressdialog.proQT+=concurrentwidgetsCONFIG+=consoleSOURCES+=main.cpptarget.path=$$[QT_INS 查看详情

cloudstream官方文档阅读笔记4

5、编程模型要了解编程模型,您应该熟悉以下核心概念:DestinationBinders负责提供与外部消息系统集成的组件DestinationBindings外部消息传递系统和应用程序之间的桥梁,提供了消息的生产者和消费者Message:生产者和消费者用于与目... 查看详情

cloudstream官方文档阅读笔记3

核心概念4.1应用模型一个springcloudStream应用包括了一个消息中间件作为核心。某个应用通过springcloudStream使用input和output通道与外界(注:消息队列)进行消息交换。通道通过中间件专用的绑定机制连接到外部的虚拟主机(注:原文为br... 查看详情

springboot文档阅读笔记-validatingforminput解析

这篇文章的主要功能是Web应用程序中验证表单输入是否合法的文章。PersonForm对象首先创建一个PersonForm对象:这个对象会验证PersonForm的用户名,代码如下:packagecn.it1995;importjavax.validation.constraints.Min;importjavax.validation.co... 查看详情

qt文档阅读笔记-bluetoothscannerexample(代码片段)

这个例子说明了如何找蓝牙设备。官方给出的文档已经没了,下面我自己补充下。项目是这样的,主要有2个界面,一个是service,一个是device。刚好对应了2个界面类ServiceDiscoveryDialog和DeviceDiscoveryDialog首先看下main.c... 查看详情

qt文档阅读笔记-bluetoothscannerexample(代码片段)

这个例子说明了如何找蓝牙设备。官方给出的文档已经没了,下面我自己补充下。项目是这样的,主要有2个界面,一个是service,一个是device。刚好对应了2个界面类ServiceDiscoveryDialog和DeviceDiscoveryDialog首先看下main.c... 查看详情

qt文档阅读笔记-bluetoothscannerexample(代码片段)

这个例子说明了如何找蓝牙设备。官方给出的文档已经没了,下面我自己补充下。项目是这样的,主要有2个界面,一个是service,一个是device。刚好对应了2个界面类ServiceDiscoveryDialog和DeviceDiscoveryDialog首先看下main.c... 查看详情

qt文档阅读笔记-broadcastsenderexample解析(代码片段)

此例子展示了使用QtNetworkAPI发送广播包程序结构如下:代码如下:sender.h#ifndefSENDER_H#defineSENDER_H#include<QWidget>#include<QTimer>QT_BEGIN_NAMESPACEclassQLabel;classQPushButton;classQUdpSocket;QT_ 查看详情

springboot文档阅读笔记-schedulingtasks(代码片段)

这篇博文将说明,如何一步一步完成Spring的任务调度功能。主要是使用@Scheduled注解,完成每5秒打印当前时间。首先在Maven中增加awaitility依赖包<dependency><groupId>org.awaitility</groupId><artifactId>awaitility</ar 查看详情