WebSocket协议深入理解

2023-11-18

1.WebSocket和HTTP的关系

WebSocket只有在建立握手连接的时候借用了HTTP协议的头,连接成功后的通信部分都是基于TCP的连接。总体来说,WebSocket协议是HTTP协议的升级版。


2.研究WebSocket的思路

服务器端自己实现WebSocket非常复杂。我们虽然不求能够完全自己实现,但是还是应该了解一下后端实现WebSocket的整体思路。

WebSocket的实现主要分为两个部分:建立连接(握手)和数据传输。下面对这两个过程分别进行分析。


3.建立连接

(1)客户端发送请求

WebSocket协议的实现首先需要客户端和服务器进行握手连接。首先客户端向服务器发送请求,请求报文中的重点内容如下:

GET /chat HTTP/1.1

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

从GET处可以看出,这是一个基于HTTP的请求。接下来的Upgrade字段和Connection字段完成了对HTTP协议的升级(HTTP Upgrade Request)。Upgrade字段通知服务器,现在要使用一个升级版协议——websocket。接下来是Sec-WebSocket-Key字段,这个字段是一串生成的BASE64加密的密钥,它被一同发送到服务器端。

此外还有诸如Sec-WebSocket-Version、Sec-WebSocket-Protocol等字段,由于是可选字符,对WebSocket协议的实质影响不大,同时为了文章更简洁更容易理解,先不进行介绍。

(2)服务器端进行处理

服务器收到客户端请求后要进行响应。首先服务器需要处理客户端传递过来的Sec-WebSocket-Key。服务器端有一个全局唯一标识符GUID,这个是固定的。服务器端将客户端传来的字符串和服务器端的GUID拼接到一起后进行SHA1处理,再进行一次BASE64加密,准备将其返回客户端。

(3)服务器端返回响应

服务器端处理完成后,将给客户端返回响应报文,重要部分如下:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

第一行再次表明此次连接的建立是以HTTP协议为基础的。同时返回了101状态码。101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求。那么协议是什么时候升级到WebSocket的呢?当发送完这个响应最后的空行后,服务器就会切换到Upgrade消息头定义的WebSocket协议。至此完成了从HTTP协议升级的WebSocket协议的过程。同时需要注意,如果返回的状态码不是101,就表示握手升级的过程失败了。

中间两行就不用说了,最后一行Sec-WebSocket-Accept返回的就是服务器端处理后的字符串。只有返回了这个字符串才表明握手成功了,返回其他的字符串都表示握手失败。


4.数据传输

WebSocket的数据帧格式如下:


这里需要对数据帧进行一个解析,需要返回一个由键值对组成对象,这里先不对解析数据帧的方法进行解析。这个对象就是解析后的数据帧,里面有各个字段以及对应的值。对每个字段的含义如下:

FIN      表示信息的最后一帧,flag,也就是标记符

RSV 1-3  以后备用的,默认都为 0

Opcode   帧类型

Mask     掩码,表示是否加密数据,默认必须置为1 (这里很蛋疼)

Payload  数据的长度

Masking-key   掩码

Payload data  数据

Extension data   扩展数据

Application data 程序数据

将数据帧解析之后,生成的就是上面各个字段加其对应的值。这里面的重点部分是Opcode和Payload data字段。Opcode表示帧类型,每次用户代理接收到数据包时,都要先对Opcode进行判断。Opcode的状态值及其对应含义列表如下:

 0        Continuation Frame                

 1        Text Frame                        

 2        Binary Frame                      

 8        Connection Close Frame            

 9        Ping Frame                        

 10      Pong Frame                       

判断了Opcode后,根据Opcode的具体状态,决定如何对PayLoad data的数据进行解析,从而进行数据传输。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket协议深入理解 的相关文章

随机推荐

  • FileInputStream读取文件&FileOutputStream写入文件

    Java的流式输入输出建立在4个抽象类的基础上 InputStream OutputStream Reader和Writer 它们用来创建具体的流式子类 InputStream和OutputStream类被设计为字节类 而Reader和Wr
  • 【目标检测】【语义分割】—Mask-R-CNN详解

    一 mask rcnn简介 论文链接 论文链接 论文代码 Facebook代码链接 Tensorflow版本代码链接 Keras and TensorFlow版本代码链接 MxNet版本代码链接 mask rcnn是基于faster rcn
  • Asp.Net类型“System.Decimal”的对象无法转换为类型“System.Int32”

    Oracle某个字段是Number类型 实体用了Int类型 底层查询代码就会报错 类型 System Decimal 的对象无法转换为类型 System Int32 region DataReader转化为实体 protected T Po
  • 掌握如何使用Rose绘制活动图的方法

    一 实验目的 1 熟悉活动图的基本功能和使用方法 2 掌握如何使用Rose绘制活动图的方法 二 实验要求 1 4学时 2 每组1人 3 设计性实验 三 实验主要设备 台式或笔记本电脑 四 实验内容 1 案例 借鉴我校图书管理系统 根据图书信
  • 云计算 第4章 云计算与移动互联网/物联网

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 目录 云计算与移动互联网 云计算与物联网 云计算与移动互联网 移动互联网的发展概况 什么是移动互联网 移动互联网是指以宽带IP为技术核心 可同时提供语音 数据 多媒体等业务服务
  • pub格式的文件打开报错:Publisher无法打开文件 解决办法

    最近搞 Git 上传文件到 Github 仓库遇到了点问题 id rsa pub 这个文件打不开 但是我需要复制内容生成 ssh 密钥 文件格式类型为 Microsoft Publisher Document pub 解决方法 1 在当前文
  • Xshell ssh长时间连接不掉线设置

    1 Xshell客户端设置 2 服务器设置 vi etc ssh sshd config 把ClientAliveInterval 0和ClientAliveCountMax 3前的井号去掉 并把ClientAliveInterval的值改
  • Android 4.1 - 如何使用systrace做性能分析

    systrace是Android 4 1引入的一套用于做性能分析的工具 它基于Linux内核的ftrace机制 用于跟踪Linux内核的函数调用 可以输出各个线程当前的函数调用状态 并且可以跟当前CPU的线程运行状态 Display VSY
  • oracle 9i 手工建库,简单记录Oracle 9i数据库手工建库过程

    简单记录Oracle 9i数据库手工建库过程Oracle 9i手工建库 By Oracle老菜 今天客户要用oracle 9 2 0 5 aix 6 1已经不支持了 只好从别的数据库把软件拷贝过来重编译 但是建库只能用手工建库了 很久没有使
  • 如何找到计算机的网络凭据,输入网络凭据是什么(图文)

    导读 输入网络凭据是什么 下面就是191路由网整理的网络知识百科 来看看吧 大家好 我是191路由器网小编 上述问题将由我为大家讲解 以电脑为例 输入网络凭据就是为了访问网络资源存储在本机的账户和密码 当用户访问资源时 无须输入账户和密码就
  • 【error】DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80070002

    解决方案 Qt 中的多媒体播放 底层是使用DirectShowPlayerService 需要一个DirectShow解码器 例如LAV Filters LAV Filters的下载地址如下 http files 1f0 de lavf L
  • VMware下centos7开机登陆页面死循环问题详细解决

    一 问题描述 昨天安装东西 不了解捉瞎的时候在 etc profile下添加了几行export导入环境变量 结果重启虚拟机到用户登录页面 输入了正确的密码后还是出来的登陆页面 一直进不去 二 问题解决 查看博客发现大概率是更改 etc pr
  • linux中利用rsync实现文件增量同步

    inotify tools的安装和使用方法 使用inotify监控文件或目录变化 inotify是一种强大的 细粒度的 异步的文件系统事件监控机制 linux内核从 2 6 13 起 加入了inotify支持 通过inotify可以监控文件
  • Linux shell脚本中shift的用法说明

    Linux shell脚本中shift的用法说明 shift命令用于对参数的移动 左移 通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理 常见于Linux中各种程序的启动脚本 示例1 依次读取输入的参数并打印参数个数 r
  • Unity基础知识及一些基本API的使用

    Unity基础知识及一些基本API的使用 1 Unity界面介绍 Unity的默认Editor窗口主要呈现为以上布局 它们分别为 1 工具栏 工具栏提供最基本的工作功能 左侧的按钮用于访问 Unity Collaborate Unity 云
  • OC5228 100V多功能LED恒流驱动器-高辉调光 65536:1 调光比

    同脚位拼对拼替代智芯HI7001 磁吸灯 舞台灯电源方案新贵 概述 OC5228 是一款外围电路简单的多功能平均电流型LED 恒流驱动器 适用于5 100V 电压范围的降压BUCK 大功率调光恒流LED 领域 芯片PWM 端口支持超小占空比
  • React学习(懒加载)

    学习目标 提示 10分钟学会组件懒加载 1 路由懒加载 SPA应用中 为了优化首页加载和渲染性能 让路由页面组件按需访问加载 解决方案 路由懒加载 代码操作 编辑App jsx import App css 引入页面组件 import Lo
  • 太不可思议了,我的文章居然有人转载

    今天无意间逛Google 发现有人转载我的垃圾文章 简直不可思议 http www newbooks com cn info 50429 html 本来是写起耍的 算是整理加一点实际经验写成的 让我又高兴又惭愧 惭愧文章写的差 高兴我的文章
  • js遍历数组中的对象并拿到值

    拿到一组数组 数组中是对象 想拿到这个对象里面的某个值 可以参考以下例子 这样就拿到所有n1的值 想拿到这个对象里面所有对应的值如下 也可以这样取值 往数组里面push多个值 js中 用法 双叹号可以理解为将其强制类型转换为布尔值 例如 a
  • WebSocket协议深入理解

    1 WebSocket和HTTP的关系 WebSocket只有在建立握手连接的时候借用了HTTP协议的头 连接成功后的通信部分都是基于TCP的连接 总体来说 WebSocket协议是HTTP协议的升级版 2 研究WebSocket的思路 服