websocket的握手及消息帧

UniApp实战:手写WebSocket协议适配SignalR Hub实现跨端实时通信 本文详细介绍了在UniApp中手动实现WebSocket协议适配SignalR Hub的实战方法,解决跨端实时通信中的性能与兼容性问题。通过协议解析、心跳机制、断线重连等核心技术的深度剖析,帮助开发者构建稳定高效的实时通信系统,特别适用于移动端弱网环境下的应用场景。 阅读详情

websocket是基于应用层的传输控制协议,而socket是基于传输层的传输控制协议。它们都是全双工的(可以同时接收和发送),传输层意味着数据都是以16进制传输,而传输层以二进制传输。

websocket的握手分为客户端请求和服务器端回应。

客户端的请求如下:

GET / HTTP/1.1       // 这个请求必须是GET请求,并且HTTP的协议必须是1.1
Connection:Upgrade   // 表示客户端希望连接升级
Upgrade:websocket   // 这个值必须是websocket,表示请求升级为websocket协议
Host:xxxx           // 请求的主机名称
Origin:xxxx         // 打开这个socket的页面
Sec-Websocket-Key:sN9cRrP/n9NdMgdcy2VJFQ== // 随机生成的字符串,客户端通过GUID来验证这个参数是不是一个有效请求
Sec-WebSocket-Version:13  // websocket使用的协议,RFC6455规定这个值必须万为13
Sec-WebSocket-Protocol:xxx // 客户端可以指定应用程序支持的协议,服务器选择其中的一个做为双方通信的协议
Sec-webSocket-Extension:xxxx // 客户端指定某些扩展协议,服务器选择其中一个

服务器端的回应如下:

HTTP/1.1 101 Switching Protocols // 服务器端同意客户端的握手请求
Connection: Upgrade // 同意这个连接升级
Sec-WebSocket-Accept: IIRiohCjop4iJrmvySrFcwcXpHo= // 通过GUID计算出来的值
Sec-WebSocket-Version: 13 // websocket的版本
Upgrade: websocket // 同意升级为websocket协议

如果HTTP的状态不是101客户端应该断开这个连接,如果Sec-WebSocket-Protocol规定了其中的子协议则服务器必须响应其中一个,否则客户端必须断开这个连接。

Sec-WebSocket-Accept的值以php计算如下:

$client_key = 'xxxxx';
$guid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$join = $client_key . $guid;
$sha1 = sha1($join,true);
$accept = base64_encode($sha1);

也就是客户端的Sec-WebSocket-Key的值加上GUID后,哈希为20个字符串后,再使用base64编码即可得到服务器的Sec-WebSocket-Accept的值

数据帧格式:(这个图示转载别人的,原帖在这里:https://www.cnblogs.com/songwenjie/p/8575579.html)

第一个字节包括:

FIN:一位,是否是最后一个消息分片。如果此值是0表示这个消息不是最后一个,反之就是最后一个

RSV1,RSV2,RS3:三位,用于扩展定义的值各一位,如果没有扩展这个值必须为0

opcode:四位,消息接收类型

第二个字节:

MASK:一位,数据是否经过掩码处理,客户端发往服务端的数据都必须经过掩码处理,值为1。

payloadData的长度:7位,7+16位,7+64位
如果其值在0-125,则是payload的真实长度。
如果值是126,则后面2个字节形成的16位无符号整型数的值是payload的真实长度。
如果值是127,则后面8个字节形成的64位无符号整型数的值是payload的真实长度。

其中《原来你是这样的websocket》对消息帧讲解的非常透彻,文中一些图片和文字均来自这篇文章。

这个里有几个不错的帖子

https://www.cnblogs.com/songwenjie/p/8575579.html(原来你是这样的websocket)

https://segmentfault.com/a/1190000013298527(websocket协议)

https://blog.youkuaiyun.com/stoneson/article/details/8063802(websocket规范 RFC6455翻译中文文档)

https://www.w3.org/TR/websockets/(w3c关于websocket介绍)

掌握Java领域WebSocket,实现高效实时数据传输 你是否遇到过这样的需求:用户刷新网页才能看到最新消息?股票行情软件需要频繁加载才能更新价格?这些都是传统HTTP协议的“单向请求-响应”模式导致的低效问题。本文将聚焦Java领域的WebSocket技术,教你如何实现“双向、长连接”的实时数据传输,覆盖从协议原理到代码实战的全流程。 阅读详情

相关推荐

深挖WebSocket协议:Python手撸爬虫采集加密货币实时行情(从握手到消息解密)

现象:握手后收到400响应,无法升级协议;常见原因不是13;格式错误(不是16字节Base64);请求头缺少Host或;解决方案:严格按照协议构造请求头,参考上文的handshake函数,不要省略任何字段。握手阶段:掌握HTTP升级的核心字段,验证,确保连接合法;帧解析阶段:理解消息帧的二进制结构,重点处理Opcode和Payload长度,这是解析数据的关键;运行阶段:做好心跳保活和断线重连,适配加密接口的解密逻辑,才能保证7×24小时稳定采集。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1546

WebSocket

STOMP简单文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。 一、创建STOMP客户端 1、在web浏览器中使用普通的Web Socket STOMP javascript 客户端会使用ws://的URL与STOMP 服务端进行交互。 为了创建一个STOMP客户端js对象,你需要使用Stomp.client(url),而这个URL连接着服务端

Bliss_妍的博客 933

具身智能落地实战:制造业、物流与电力的工业级方案设计

具身智能是一种融合感知、推理与物理执行的智能范式,其核心在于构建具备因果建模能力、多模态闭环反馈和实时动作规划的行动主体。区别于通用AI或传统自动化,它依托多模态大模型、高精度力觉/触觉传感及Sim2Real仿真技术,实现对真实物理环境的深度理解与自适应交互。技术价值体现在可解释性决策、毫秒级跨模态协同与零停机容错能力,已规模化应用于制造业质检、物流破损鉴定、电力绝缘子巡检等强约束工业场景。本文聚焦‘行业应用方案解决方案’这一高频搜索需求,系统拆解从工位筛选、分层架构设计到72小时现场交付的全链路工程方法论

weixin_30952479的博客 300

WebSocket协议解析

WebSocket协议解析 一、协议简介 WebSocket protocol 是HTML5一种新的协议,它是实现了浏览器与服务器全双工通信,本文主要介绍WebSocket协议格式。 WebSocket通信过程分为两步:握手请求和数据传输。 二、握手请求 1、客户端在连接请求时候发送的内容 GET / HTTP/1.1 Connection:Upgrade Ho

CtiyMan的专栏 1165

手把手教你用FPGA实现SGMII接口:从IP核配置到板级调试全流程

本文详细介绍了如何在Xilinx 7系列FPGA上实现SGMII(Serial Gigabit Media Independent Interface)接口的全流程,包括IP核配置、约束编写和硬件调试。通过具体的硬件选型建议、软件工具链配置和PCB设计规范,帮助开发者快速构建稳定可靠的千兆通信链路,并提供了常见故障排查和性能优化技巧。

weixin_29194693的博客 296

告别转换超时!手把手教你用Allegro2Altium.bat搞定AD21导入Allegro 17.2文件

本文详细介绍了如何使用Allegro2Altium.bat工具解决AD21导入Allegro 17.2文件时的转换超时问题。通过理解转换机制、准备离线环境、执行完整转换流程及高级技巧,帮助工程师高效完成PCB设计文件转换,提升工作效率。

weixin_30378623的博客 423

socket 及 websocket的握手过程

一、WebSocket和HTTP之间的关系 WebSocket和HTTP一样都是基于TCP的应用层协议。 WebSocket协议和HTTP协议是两种不同的东西。客户端开始建立WebSocket连接时要发送一个header标记了 Upgrade的HTTP请求,表示请求协议升级。所以服务器端做出响应的简便方法是,直接在现有的HTTP服务器软件和现有的端口上实现WebSocket协议,然后再回一个状态...

yournevermore的博客 6821

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

WebSocket 实现原理

一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解 有交集,但是并不是全部。 另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议

皮卡 皮卡 皮卡丘 ~ 啾 1025

生物信息学投稿避坑指南:如何根据影响因子和审稿速度选择最适合的期刊

本文为生物信息学研究者提供全面的期刊投稿策略,重点解析影响因子、审稿速度等关键指标,帮助选择最适合的期刊。涵盖算法开发类和应用型研究的投稿路径,分析不同出版社特点及开放获取的利弊,并提供投稿全流程优化建议,助力高效发表研究成果。

weixin_42652674的博客 379

cefshap(C#)定义浏览器的右键菜单

菜单效果:复制(自带),搜索文本,打开链接,复制链接,刷新,检查,关于 public class MenuHandler : IContextMenuHandler { //public event Action<string> PopupRequest; void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrows

无线智能模块 可视DIY智能专家 1705

websocket协议详解

WebSocket 协议主要为了解决基于 HTTP/1.x 的 Web 应用无法实现服务端向客户端主动推送的问题, 为了兼容现有的设施, WebSocket 协议使用与 HTTP 协议相同的端口, 并使用HTTP Upgrade 机制来进行 WebSocket 握手, 当握手完成之后, 通信双方便可以按照 WebSocket 协议的方式进行交互在 WebSocket 协议中,帧 (frame) 是通信双方数据传输的基本单元。

qq_35337506的博客 1295

具身智能(26):RDK S100的LeRobot或Agile X piper机械臂控制模型

本文档详细介绍了基于ROS2的机器人控制模型架构与标定数据联动机制。核心采用"感知-规划-控制"闭环流程,通过激光雷达、相机和IMU的融合数据实现厘米级定位(≤1cm)。文档包含两大控制模型配置:1)RDKLeRobot模型,重点说明PID参数调节和标定文件路径设置;2)AgileXPiper模型,强调驱动安装与外部标定文件集成。针对常见问题提供解决方案,如控制指令无响应需验证标定路径,运动偏差过大需重新标定等。最后给出批量部署方案,通过复制基准配置文件实现多机器人快速配置,要求定位偏差

码农17年的博客 179

WebSocket 抓包怎么查看内容?从握手到消息帧完整解读

WebSocket 抓包查看内容,长连接消息按帧流动,普通 HTTP 抓包模型看不到。本文从 101 握手原理讲起,对比 DevTools、Charles、Wireshark 的 WS 帧查看边界,实操三步:代理接入长连接、逐帧查看文本/二进制/ping/pong 收发方向、处理压缩帧与信封结构,最后给出按场景的排查顺序。

2501_91380052的博客 247

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于mina的websocket初步实现

package com.codecronch.util.net.websocket;   import java.security.MessageDigest;   import java.util.regex.Matcher;   import java.util.regex.Pattern;   import org.apache.mina.core.buffer.IoBuffer;

u014279471的专栏 4126

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

服务端使用C++实现非阻塞的websocket

客户端有socket,但网页端有类似socket的websocekt,那么webscoekt到底是如何实现的,今天我们来研究一下。

秋雨 De Blog 1917

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WebSocket通信原理和在Tomcat中实现源码详解(万字爆肝)

我在成长过程中也是一路摸爬滚打,没有任何人的指点,所以走的很艰难。例如在大三的时候,如果有个学长可以阶段性的指点一二,如果有已经工作的师兄可以告诉我工作上需要什么,我应该前面的三年可以缩短一半;后来去面试bat,失败了有5、6次,每次也不知道具体是什么原因,都是靠面试回忆去猜测可能是哪方面的问题,回来学习和完善,当你真正去招人的时候,你就会知道面试记录是多么重要,面试官可以从面试记录里看到你的成长,总是去面试,总是没有成长,就会被定义为缺乏潜力。一个人可以走的很快,但一群人才能走的更远。

2401_84140347的博客 1764

探索 `lua-resty-websocket`: 构建高效WebSocket服务的利器

探索 lua-resty-websocket: 构建高效WebSocket服务的利器 在现代Web开发中,实时通信已经成为许多应用程序的核心需求,而WebSocket协议正是为此设计的。它提供了全双工、低延迟的通信方式,适用于在线游戏、聊天应用、股票市场、物联网等多种场景。本文将向您介绍一个由OpenResty社区维护的项目——lua-resty-websocket,这是一款用于构建基于Lua和N...

gitblog_00046的博客 1327

PHP-Websockets 上传文件2 优化支持php socket客户端和websocket连接websocket服务器 以守护进程方式运行编码

WebsocketServer: users.php class WebSocketUser { public $socket; public $id; public $headers = array(); public $handshake = false; public $handlingPartialPacket = false; p

little_rabbit_baby的博客 2765

nodejs之websocket

1 var events = require("events"); 2 var http = require("http"); 3 var crypto = require("crypto"); 4 var util = require("util"); 5 //opcodes for WebSocket frames 6 //http://tools.iet...

weixin_30896825的博客 84

WebSocket科普

WebSocket为何物?如果你现在还不太清楚请先到baidu百科一下。如果你实在懒得起搜索的话,下面帮你从网络上搜罗了些许有关WebSocket的信息。   Baidu百科:http://baike.baidu.com/view/3623887.htm (下面摘录了些许内容,内容来自Baidu)   WebSocket 规范的目标是在浏览器中实现和服务器端双向通信.双向通信可以拓展浏览器上的

linking530的专栏 542

WebSocket核心技术解析:从握手到心跳机制的实时通信实践

实时通信技术是现代Web应用的核心需求,它通过建立持久连接实现数据的即时传输。WebSocket作为一种双向通信协议,通过特定的握手过程从HTTP升级而来,解决了传统轮询的资源浪费和延迟问题。其技术价值在于提供了真正的全双工通信能力,支持服务器主动推送数据。在实际应用中,心跳机制保持连接活跃,消息分片确保大数据量传输的稳定性。WebSocket广泛应用于实时聊天、在线协作、金融交易等场景,其中握手协议和心跳机制是保证连接可靠性的关键。通过理解这些核心概念,开发者能够构建更稳定高效的实时应用系统。

weixin_30580341的博客 320

java websocket sha1_WebSocket协议探究(一)

一 复习和目标1 复习上一节使用wireshark抓包分析了WebSocket流量包含连接的建立:HTTP协议升级WebSocket协议使用建立完成的WebSocket协议发送数据2 目标协议对比初始握手和计算响应键值消息格式关闭握手注:WebSocket服务器使用《HTML5 WebSocket权威指南》3.4节中使用nodejs实现,WebSocket客户端使用Chrome浏览器实现。二 协议...

weixin_32392583的博客 424

第三章 传输协议之WebSocket协议

本文档详细介绍了FastMCP框架中WebSocket协议的实现方案。作为全双工通信协议,WebSocket通过持久连接实现低延迟的双向通信,特别适合AI代理等实时交互场景。文档从连接握手、消息帧格式、客户端/服务端实现、会话管理到异常处理等方面展开说明,展示了如何通过JSON-RPC 2.0格式进行结构化消息交换,并采用内存流管理会话状态。与SSE和HTTP轮询相比,WebSocket在实时性方面具有显著优势,是FastMCP框架推荐的核心传输协议之一。

sfdzhmr的博客 675
上一篇: img 403的解决办法
下一篇: PHP 位运算符
san生石
博客等级 码龄10年 14粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值