Chrome29的BUG:刷新网页后并未实现WebSocket关闭握手

Chrome取色器:浏览器里的像素级光学探针 网页颜色调试的本质,是理解渲染管线如何将CSS声明转化为人眼所见的最终像素。现代浏览器通过Blink引擎、图层合成(compositor)与GPU加速,使颜色不再只是静态的HEX或RGB值,而是受opacity、filter、backdrop-filter、色彩空间(sRGB/Display P3)、亚像素抗锯齿等多重因素影响的动态输出。Chrome DevTools Color Picker 的核心价值,在于它跳过中间样式计算,直接采样final framebuffer中的浮点精度RGBA值——这使其成为 阅读详情

原因:
前一段时间做了一个在线对战的HTML5小游戏,要实时的判断用户的在线状态,在Chrome29下刷新网页,客户端WebSocket及时关闭连接,判断用户下线。在Chrome31,32上,刷新网页,服务器端取不到客户端关闭连接的报文,出现BUG.


这篇文章是关于WebSocket的报文协议的。个人感觉WebSocket是个比较大的话题,如果不仔细斟酌的话,由于个人能力问题不一定能很好的驾驭,所以该文只是谈到了WebSocket的两个技术细节,供大定参考。


谈到WebSocket,顾名意义,是在Web领域的Socket套接字实现。但他又有别于传统的Socket套接字:
1,使用HTTP头作为客户端与服务器端连接握手的媒介
2,它与HTTP协议类似都是基于TCP协议的应用层协议
3,WebSocket的连接握手与关闭握手有自身的约定

而我们今天就从实际开发中遇到的问题来谈谈WebSocket通讯
我之前一段时间做了一个在线对战的HTML5小游戏,具体的网址就不贴了,只是一个demo。很凑巧的是,服务器端的代码早已有同事用c++写好,所以没有用到socket.io这样的WebSocket框架,完全是自已写的WebSocket后端。也因此遇到了一些问题,下文会针对这些问题做详细的阐述

1.不同的浏览器对WebSocket实现不同的协议,所以我们要准备一个具备兼容能力的后端代码
大家知道,WebSocket协议时至今日依然没有定案,而在之前出版了多个协议标准,如draft-hixie, draft-ietf-hybi,而每个系列又有多个版本 。
主流浏览器实现会因为依据不同的协议而有区别。目前主要有两个版本:draft-hixie-76, draft-ietf-hybi-13。细心的你估计已经看到这两个版本前都是draft的字样,所以它们仍然具有不确定性。不过值得庆兴的是RFC的版本已经发布。

draft-hixie-76与 draft-ietf-hybi-13对于WebSocket协议有较大的区别,从客户端的表现主要为HTTP头的变化。
hybi-13通过对请求头Sec-WebSocket-Key的设置进行一些计算输出Sec-WebSocket-Accept响应头值实现连接握手。
hixie-76通过对请求头Sec-WebSocket-Key1,Sec-WebSocket-Key2及请求主体三个共同计算出响应主体的,实现连接握手。
具体的代码参考: http://www.hoverlees.com/blog/?p=1413
其实这个问题对纯前端开发人员来说是无感知的,所有的握手实现都由浏览器和服务器端来实现。

在这里科普一下这个协议的制定历史:draft-hixie -> draft-ietf-hybi -> RFC
首先是hixie阶段,然后到了hybi阶段,这个时候前面就有了ietf的前缀,ieft是互联网工程任务组,最后到了RFC阶段。在RFC阶段又分为四个小阶段:因特网草案、建议标准、草案标准、因特网标准。最后才能成为互联网的标准,路还漫长。

2.问题1介绍WebSocket对于连接握手的兼容问题,还有就是关闭连接的握手的问题

hixie-76规定任何一端 都可以发送0x00长度的0xFF帧用以发起关闭连接请求,当另一端收到了这个请求,会回传一个相同的0xFF帧来确认连接关闭。当发起端收到了这个确认的回传报文后就可以安全的关闭连接,确保不会有新的报文需要处理。这个机制是用以代替TCP关闭握手协议的

而在hybi-13的版本中,对关闭连接的握手做了改进。
任何一端都可以发送带有指定控制序号的数据(opcode)的帧来开始关闭握手(0x08)。当 另一端 接收到这样的帧时,发送一个关闭帧作为响应。当发起端接收到那个帧时,关闭连接,因为知道没有更多的数据需要传输。


而在事实上chrome29(也许还有之前的版本)并没有按照任一约定来处理,而是实现了TCP关闭握手协议,既:
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。 
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。 
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。 
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。 
虽然chrome29使用了 hybi-13协议,但在关闭时却并未完全实现。


这一点,我和我同事都没有发现。因为用Chrome29连接后端刷新都正常,所以就忽略了,依然用的是TCP的走法开发( 从头就是错的)。

而升级到了chrome31后,chrome31按 hybi-13的协议发送了0x08的opCode,这个时候服务器端没有特别的处理这个opCode,压根不明白"落花有意,而流水无情",还在傻乎乎的等,直到linux的自动关闭socket超时,也就是我发现的刷新网页,websocket连接没有关闭,程序判断用户仍然在线的原因。

保险起见,我查阅了chrome的源码,找到了相关的代码,但由于chrome项目较庞大,我没法通过它的代码来肯定这一切。
一时好奇心又起,我用socket.io做了服务器端,发现结果如同想象的一样,socket.io的服务器端,也一样没法抓到close socket的任何关键帧,无法走到close方法里,约半分钟后(在我的机器上)连接自动关闭。

而推开来说,这个问题其实并不仅仅只是后端没有处理的事情。
因为走的是tcp 关闭握手协议,在客户端关闭连接后,其实服务器端相应的端口都进入了CLOSE_WAIT的状态,必须等到linux系统配置的连接超时才会CLOSE这个端口。如果访问量大的话,会造成端口大量占用的情况
而 draft-ietf-hybi-13文档中也明确写到: TCP关闭握手不总是端到端可靠的,特别是出现拦截代理和其他的中间设施。 通过发送一个关闭帧并等待返回关闭帧响应,可以避免一些数据丢失的特殊情况。例如,在一些平台上,如果一个套接字关闭时有数据在接收队列,RST包发送后,将导致recv()失败, 因为接收到RST,即使仍有数据等待读取。

参考:
Chrome侧边栏集成Gemini 2.5 Pro的原理与实操 浏览器扩展是实现AI能力轻量化集成的关键技术路径,其核心在于利用Chrome扩展机制(如activeTab、scripting权限)构建模型调用代理层,绕过传统账号鉴权与页面跳转限制。这种架构不依赖用户Google账户,而是通过服务端JWT令牌与企业级API密钥完成合规调用,兼顾安全性与可用性。技术价值体现在‘零上下文切换’的工作流融合——AI成为DOM级原生组件,可实时感知当前网页内容,显著提升知识处理效率。典型应用场景包括技术文档精读、代码逻辑审查、学术翻译等需强上下文理解的碎片化任务。本文聚焦Chro 阅读详情

相关推荐

Grok 4.3国内稳定使用指南:实名、支付与非推理模式实战

Grok是x.ai推出的高性能大语言模型系列,其最新版本Grok 4.3在多模态理解、长上下文处理和代码生成方面具备显著优势。但模型能力的释放高度依赖底层服务契约——尤其在国内网络与合规环境下,需同步满足手机号实名制绑定、支付宝直连支付验证及地域路由适配三大前提。其中,非推理模式(non-reasoning mode)成为提升响应稳定性与结构化任务准确率的关键技术路径,可规避上下文超限、降低延迟并增强确定性输出。该模式已广泛应用于PDF信息抽取、多模态指令编排与IDE内代码补全等真实工程场景。本文基于27天

cunfuxiao7305的博客 1023

websocket高版本浏览器经常掉线的问题解决办法

自从chrome浏览器升级到9.开头的版本之后,websocket在后台运行于丹时间后就会断开链接 前后端都是设置了心跳还是会断开 经过抓包分析;

xgs736214763的博客 2361

DeepSeek未发布V4,但已实现1M上下文静默升级

大语言模型的上下文长度是衡量其长文本理解与推理能力的核心指标,直接影响合同审查、代码分析、学术精读等真实场景效果。其技术原理涉及KV缓存优化、分块注意力机制(如PagedAttention)、动态位置编码(RoPE Scaling)及多文档图谱建模。这类工程级升级显著提升响应稳定性与跨文件协同能力,带来确定性输出和低幻觉率的技术价值。在国产大模型DeepSeek的实际应用中,用户已普遍感知到远超V3版本的1048576 token上下文支持与5GB多文件处理能力,尽管官方尚未命名或发布所谓‘DeepSeek

weixin_30439067的博客 358

谷歌浏览器标签页长时间切换到后台后mqtt会自动断开连接解决方案

出现的原因 参考连接: http://cncc.bingj.com/cache.aspx?q=chrome%20%20%20background%20tab%20websocket%20disconnect&d=4822612834067848&mkt=en-US&setlang=en-US&w=pf_vZ2s9Ga6RElns2EcbS3aUQF5_s1X0 谷歌浏览器为了减少资源消耗,所以对后台选项卡进行了限制,(如果你的网页中播放了音频或者视频,就不会限制),选项卡长时

weixin_50853984的博客 6355

AutoGPT工程化实战:从CLI部署到多Agent协同的AI Agent落地指南

AI Agent是当前大模型应用落地的核心范式,其本质是通过目标驱动、工具调用与循环推理实现自主任务执行。理解Agent的运行原理(如规划-执行-反馈闭环)、掌握CLI命令行这一状态控制中枢、熟悉Docker微服务架构与环境配置规范,是突破‘玩具级’Demo走向生产系统的关键。AutoGPT作为开源AI Agent平台代表,将LLM能力封装为可编排的Block组件,并依托Redis消息总线与分布式Worker实现高可用。它适用于竞品监控、合同初筛、内容分发等需跨系统、重复性高、规则明确的业务场景,真正价值在

weixin_34087307的博客 473

微信个人号AI接入实战:cc-connect协议桥接与代码生成工作流

微信个人号缺乏原生AI接口,开发者需借助协议层解析、语义理解与安全执行三层架构实现自然语言到可执行代码的转化。核心在于将微信视为纯文本信道,通过逆向Web协议监听消息流,结合Claude Code与Codex等代码大模型完成意图识别、上下文重写和模型路由,并在Docker沙箱中安全执行。该方案规避企业资质与小程序审核限制,支持私聊/群聊/公众号多场景,适用于Python、JS、Shell等主流语言的即时代码生成与文件回传,是个人开发者构建轻量级微信AI编程助手的技术基石。

weixin_30684743的博客 391

Vue+WebSocket 实现页面实时刷新长连接

Vue+WebSocket 实现页面实时刷新长连接 知乎链接 最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死。。。 与后台人员讨论过后决定使用h5新增的WebSocket来实现数据实时展示 一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支...

weixin_43550660的博客 9043

OpenCode+DeepSeek-V4:构建本地化AI编程工作流

AI编程助手正从云端补全工具演进为深度嵌入开发环境的智能协作者。其核心在于模型与IDE之间的语义对齐能力——不仅需理解自然语言指令,更要解析AST结构、多文件上下文及项目规范。DeepSeek-V4凭借128K上下文支持、代码感知Tokenizer和原生AST解析能力,成为少数可支撑真实工程场景(如遗留系统重构、单元测试生成)的工业级模型;而OpenCode作为轻量级AI编程协议层,通过标准化context字段定义,弥合了大模型与本地开发工具间的‘协议鸿沟’。该组合无需上传代码、不依赖公网API,已在Jav

weixin_34060741的博客 578

不出意外,排名第一的还是它,程序员为什么都喜欢用Chrome?

程序员为什么喜欢使用Chrome? 其实不单单是程序员喜欢使用Chrome,现在大多数的小伙伴都使用Chrome。 我们可以看到Netmarketshare发布了2020年7月的操作系统与浏览器市场份额报告。 Chrome浏览器市占率升至71% 无论从PC端还是移动端Chrome都是绝对意义上的第一,在浏览器这个行业里占据很强大的话语权。 有七成的人都在用Chrome 浏览器。这其中又有着绝大多数的程序员在使用谷歌浏览器。 对于程序员来讲,应该大部分都在用chrome、firefox这两

HUYA69的博客 1828

Gemma 4本地编程助手:Ollama+Gradio两小时极简部署指南

本地大模型编程助手是面向开发者的一类轻量级AI工具,其核心原理在于将开源代码大模型(如Gemma系列)通过量化压缩与硬件加速技术,在消费级设备上实现低延迟推理。技术价值体现在数据隐私保障、离线可用性及响应确定性,广泛应用于代码解释、错误诊断、片段生成与重构等真实开发场景。本文聚焦Gemma 4这一专为编程优化的4B级模型,结合Ollama模型运行时与Gradio交互框架,提供零依赖、可复现的端到端本地部署方案,兼顾精度、速度与工程友好性。

weixin_30323631的博客 290

前端犄角旮旯,非常规面试题总结(不断更新....)

27、判断类型的方式有哪些?1、typeof操作符:用来检测数据的类型,返回的是一个表示类型的字符串。2、instanceof操作符:用来检测对象是否为指定的构造函数的实例。3、方法:可以返回对象的准确类型。4、方法:用来判断一个变量是否为数组。(一)typeof和instanceof区别typeof返回的是一个字符串,表示变量的数据类型,可能的返回值有numberstringbooleanfunctionundefinedobject。instanceof返回的是一个布尔值,true或。

qq_51398495的博客 1666

本地化AI研究助手:Jan-v1+llama.cpp+Streamlit全流程实践

大语言模型(LLM)本地部署正成为科研与企业知识工作的关键能力,其核心在于平衡推理性能、数据隐私与工程可用性。基于llama.cpp的CPU端高效推理、GGUF量化模型轻量加载、Streamlit低门槛交互界面,构成当前最可行的本地AI研究工作流技术栈。该方案规避了GPU依赖与云API调用,支持在i5/16GB内存设备上稳定运行4B级模型,通过agentic reasoning实现问题拆解、多源搜索与结构化报告合成,显著提升行业分析、竞品研究、学术初稿等场景的交付效率。本文聚焦Jan-v1模型在真实研究任务

banglvfei0870的博客 398

跨端即时通讯底座:从UI复用到可靠消息管道的七层补丁

即时通讯(IM)是社交类应用的核心能力,其本质是构建一条高可靠、低延迟、跨终端的消息传输管道。理解WebSocket协议原理、消息状态机设计与离线兜底机制,是实现真正‘三端通用’而非仅UI复用的关键技术前提。在H5、微信小程序和原生App等异构环境中,通信层需适配连接管理、序列化、存储、通知等差异化能力,而消息ID生成、本地持久化、已读回执、撤回原子性等补丁,共同构成支撑实时交互的工程化底座。本文聚焦跨端IM开发中高频踩坑场景,结合真实.zip工程样本,系统拆解从‘能连上’到‘可信赖’的落地路径。

weixin_30731305的博客 405

并行分布式框架:Celery、rq、funboost

Celery是一个异步任务的调度工具,也可以叫做 "分布式任务队列(Distributed Task Queue)"。

freeking101的博客 5万+

Windows平台无人机仿真:从零搭建SITL环境与QGC联调

本文详细指导了在Windows平台上从零搭建无人机软件在环(SITL)仿真环境,并与QGroundControl(QGC)进行联调的完整流程。通过使用Cygwin工具链,开发者可以在没有实体硬件的情况下,模拟运行ArduPilot飞控,并通过MAVLink协议连接QGC地面站进行全功能测试,为无人机软件开发提供了一个安全、经济的虚拟沙盒环境。

weixin_29239279的博客 408

【图形学】Loop细分算法及半边结构实现(C++)

文章目录Loop 细分算法介绍增加新顶点更新旧顶点算法实现半边结构半边结构的表示方法半边结构的构造方法创建所有顶点创建所有面及半边半边结构的使用 Loop 细分 顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。 下面是一个粗糙的兔子模型1000个面,进行3次细分 算法介绍 Loop细分算法主要分两步进行 增加新顶点:增加

wk_119的博客 8066

计算机扫盲(下篇)

由于篇幅问题这篇文章被迫分成上下两篇建议反复上下对比着看,能应付生活中的使用就行。不是学操作系统的不用了解太深。实在不会就喂给ai帮你理解。逆向工程 = 通过分析程序的二进制文件,理解它的行为和逻辑。正常开发:源代码 → 编译 → 可执行文件 逆向工程:可执行文件 → 反汇编/反编译 → 理解逻辑5.2.1 指令与机器码1. 指令的组成 机器码格式(x86/x64):必会的汇编指令2. 常见寄存器3. 汇编代码中的栈重要观念:函数调用时生成的栈帧,在汇编层面根本不是一个必须存在的“结构”。, , , 等指

2504_94717629的博客 520

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 78

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

XiaoqiangClub的博客 1万+

爬虫教程( 2 ) --- scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

freeking101的博客 5255

【Go语言实战】(2) Gin+Vue 电子商城

618来!!不用纠结去哪里剁手了!直接自己安排一个商场不香吗??

面向生活编程 4827
上一篇: [译]可以自纠正的setInterval代替方法
下一篇: Javascript中的正则表达式
simon4545
博客等级 码龄21年 13粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值