ios15及以上webview、Safari使用Websocket断连,1006无清晰错误码

news2024/12/25 0:49:11

文章目录

  • 问题表现:
  • 定位疑似原因:
  • 解决方式:
  • 定位问题思路过程记录:
    • 1、对比前端代码运行环境问题
    • 2、写纯请求前端代码连接,确认是否接口部署服务问题;
    • 3、IOS连接是否有对TSL安全协议版本有要求(使用的wss协议)
    • 4、验证iOS网络是否稳定&查阅信息是否iOS会出现频繁断连又迅速重连情况
    • 5、自己搞个nodedemo验证纯连接问题:
    • 6、IOS自身多运行环境对比:QQ频道应用、QQ聊天框、safari、chrome;
  • 题外

做游戏通常都会用到Websocket,这个工具在前端本身的文档( Websocket-mdn)就简单得很,原理也很简单,就是http1.1的基础上增加了长链接,封装之后监听open、message、error、close,可以主动调用send、close,通常close不会主动调用。

问题表现:

机型均为15.3以上,后测试12.5没有问题,机型范围并不具体;1006 {eventType: true} 无其他报错信息。其中eventType时浏览器事件机制的只读属性,代表被信任,无信息价值。1006是保留,用来表示期望收到状态码时连接非正常关闭,无具体指向。

定位疑似原因:

数据多帧发送存在无法正确解析和解压数据的bug

解决方式:

后台建联时关闭请求头的连接确认

定位问题思路过程记录:

1、对比前端代码运行环境问题

(虽然Android运行正常,但还是仔细些好,也方便后续提供给研究问题的人证明);
结果记录:

  • 检查前端对接websocket代码,并未启用close流程;
  • 检查接收数据后是否解码数据影响,切换解码与不接码控制变量对比,无影响;
    综上,排除前端代码问题。

2、写纯请求前端代码连接,确认是否接口部署服务问题;

结果记录:

  • 后台SYNC和正常响应验证,验证没有影响。
  • 走到固定流程会失败,对比流程变化怀疑接收字符长度引起的变化。后台通过直接切换返回无意义长度问题严重,200字符可以成功走完流程,500个字符不行,考虑可能时 MTU(最大传输单元)问题;但MTU大小通常是1500(最大可配置到9000)字节,且是接收到数据之后断连,而MTU问题则会丢失数据帧。
  • 多次验证过程中,游戏又可以走到不同的流程,因此特定流程的后台接口影响也排除,长度的嫌疑度也降低,怀疑内容可能性增大。(后续多次验证时确认)
    综上,长度是一种影响的表现,虽可作为一种解决思路,但实际表现中属于收到数据再断连,断连的引起机制还未找到;且游戏的数据结构同步已全部是关键信息,不易拆分,若使用分批次发组合数据,组合数据耗时切须维护管理,对于数据长度的拓展有一定的限制性,方案复杂没有针对性,没有实操的意义。

3、IOS连接是否有对TSL安全协议版本有要求(使用的wss协议)

结果记录:

  • 查到一份资料有提到需要使用tsl1.2,后台确认服务一致;
    综上,排除SSL证书问题问题。

4、验证iOS网络是否稳定&查阅信息是否iOS会出现频繁断连又迅速重连情况

结果记录:

  • 断网表现报错一致,继续查看;
  • iOS部分机型升级版本确实会出现Wi-Fi断连,但不会马上重连;且无websocket关键字相关;
  • 多IOS手机随机测试,多网络切换,断连现象稳定频发;
  • 使用浏览器的navigator.onLine及断网联网监听事件,websocket断连时网络并未断连;
    综上,排除网络不好原因引起。

5、自己搞个nodedemo验证纯连接问题:

结果记录:

  • 写demo测试直接断连,就很黑人问号。node库和go库的区别很大吗?
    本想研究node库深入,虽然能成大功但时间紧急,也感觉这个走向有些费力不讨好,出结果的几率小。且websocket,原理简单,看了下node的主文件没有什么切入点。

6、IOS自身多运行环境对比:QQ频道应用、QQ聊天框、safari、chrome;

  • 代理多环境运行代码,对比表现一致;
  • 以safari为关键词搜索问题时,发现有类似问题,且关掉一个内置功能 NSURLSession Websocket 即可,验证可行。
    然而QQ内部又无此功能,因此还是需要找到核心原因。
    查询Safari此功能的作用,是一个新规范的压缩中间件,也就是说是存在中间件执行有问题并内部主动关闭的情况;那么就需要验证下是否有该中间件的请求头标识。
    webview里抓不到wss请求包??QQ内部与外部的区别。QQ android是有实现新的???
    通过抓包safari对比请求头、数据等时,发现

iOS websocket 抓包工具:Charles 、 Wireshark 、mitmproxy 、Socks5 代理(付费)。本是用whistle代理抓包来着,但是不知道为什么抓不到此次的wss请求,只得在safari中查看

  • 结果预设:抓包iOS正式环境 webview 、 safari 、chrome; demo的各浏览器 ; 对比请求头
    大家的请求头应该一致,ios必须具备压缩头;假设 不建立defate压缩连接 是解决办法,那么safari的两种情况表现应该有所不同;

upgrade 逐跳(Hop-by-hop)标头,connection
Sec-WebSocket-Extensions
用于指定一个或多个请求服务器使用的协议级 WebSocket 扩展。允许在一个请求中使用多个 Sec-WebSocket-Extension 标头;结果跟在一个标头文件中包含了所有列出的扩展一样。 permessage-deflate 压缩扩展;
代理-抓包请求头

通过对比验证,请求头标识特点符合。那么就需要关闭这个压缩功能,还原到旧的协议版本来验证是否是压缩协议实现有问题。Safari虽提供了这个功能,但是实际运行环境的QQ并没有,因此只能找到后台,找其改掉websocket建联时请求协议商定时的确认。看了go的websocket 库,同nodejs一样无配置入口,但后台大佬不负众望,改了库内部的实现。(todo-待补充)
协议建立连接之后验证,果然不再断连。
至此,虽找到并解决了关键点,但这个关键点后面还有很多牵连的知识以及疑似内部深层次的iOS- webview实现该压缩协议失败而 Android正常的根本原因需要探索。

题外

此坑是个开发时预料之外的坑,借此记录下排查问题的过程以及网上的优秀资料和贡献者们,且整理下websocket问题排查规范流程:

  1. 网络问题:网络不稳定、断网、网络丢包等原因都可能导致websocket断连。
  2. 服务器问题:服务器故障、服务器重启等原因也可能导致websocket断连。
  3. 应用问题:应用进入后台、应用被系统强制关闭、应用崩溃等原因都可能导致websocket断连。
  4. SSL证书问题:如果websocket使用的是wss协议,那么SSL证书无效或过期也可能导致websocket断连。
  5. WebSocket协议版本不兼容:如果客户端和服务器使用的WebSocket协议版本不兼容,也可能导致websocket断连。

参考资料:
状态码报错一览表
websocket原理
基于Tomcat的Websocket范例及permessage-deflate扩展特性的研究
The WebSocket Protocol - rfc6455协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java入门合集】第六章异常处理

博主:命运之光 专栏:JAVA入门 学习目标 掌握异常的概念,Java中的常见异常类; 掌握Java中如何捕获和处理异常; 掌握自定义异常类及其使用; 目录 异常概述 异常体系 常见的异常 Java的异常处理机制 方式…

The Certificate Of Harbor On Rancher(2.5.16)

序言 针对Rancher2.5.16版本的情况. 问题是: 当我们创建RancherServcie后,RancherService会在容器内通构建k3s环境,然后k3s去我们的私有Harbor拉取镜像. 问题就在我们虽然在虚拟机上给docker设置了可以不通过Https的方式拉取Hrabor的镜像,但是RancherService中的k3s也会去拉…

Android---bitmap优化

目录 Bitmap 占用内存大小计算 Bitmap | Drawable | InputStream | Byte[] 之间进行转换 Bitmap 相关方法 BitmapFactory 工厂类 Bitmap 占用内存大小计算 Bitmap 作为位图,需要读入一张图片中每一个像素点的数据,其主要占用内存的地方也正是这些像…

【axios 使用】下载文件流 以及 获取响应头header content-disposition

获取数据都知道,使用的是 axios,主要是设置 responseType: blob 由于项目使用的是 apipost ,所以在使用的时候还要设置 isReturnNativeResponse -是否返回本机响应标头,一般可能设置 responseType: blob 就可以了 export function getDow…

本地使用IIS快速搭建一个属于自己的网站,并发布公网访问「无需购买云服务器」

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助&#xf…

java+iClientOpenlayers实现城市内涝积涝模拟内涝模拟演进

程序实现效果图 洪水演进过程 一、应用背景 城市内涝和积涝是一个严重的问题,特别是在气候变化的背景下。为了更好地了解这个问题,模拟城市内涝和积涝是非常重要的。这个过程可以帮助我们预测哪些区域可能会受到影响,以及在发生内涝和积涝时…

人人都应该知道的CPU缓存运行效率

提到CPU性能,大部分同学想到的都是CPU利用率,这个指标确实应该首先被关注。但是除了利用率之外,还有很容易被人忽视的指标,就是指令的运行效率。如果运行效率不高,那CPU利用率再忙也都是瞎忙,产出并不高。 …

“LSTM之父”谈AI威胁论:AI将超越人类智力,对人类不感兴趣,呼吁暂停AI是一种误导

他因在人工智能(AI)、深度学习和人工神经网络领域内做出的成就而知名,一度被称为“(现代)AI 之父”或“深度学习之父”。 他提出的长短期记忆网络(LSTM)被谷歌、苹果、亚马逊、Meta 等科技巨头…

Ims跟2/3G会议电话(Conference call)流程差异介绍

2/3G Conference call 合并(Merged)通话前,两路电话只能一路保持(Hold),一路通话(Active)。 主叫Merged操作,Hold的一路会变成Active,进入会议通话。 例如终端A跟C通话,再跟B通话,此时B就是Active状态,C从Active变成Hold状态。Merged进入会议通话后,C又从Hold变…

亚马逊关于婴儿摇篮的政策需要做的认证标准

本政策适用的婴儿摇篮 婴儿摇篮 婴儿摇篮是一种旨在为婴儿提供睡眠环境的小床。婴儿摇篮由独立支腿、固定框架或支腿、轮式底座、摇摆底座或可以相对于固定底座摇摆的底座支撑。在静止(不摇摆或不摆动)时,婴儿摇篮的睡眠表面与水平面的夹角…

ASEMI代理ADI亚德诺LT6230CS6-10#TRPBF车规级芯片

编辑-Z LT6230CS6-10#TRPBF特点: 低噪声电压:1.1nV/ √Hz 低电源电流:3.5mA/Amp(最大值) 低失调电压:350μV(最大值) 增益带宽积: LT6230:215MHz&#…

设计模式之【桥接模式】,多用组合少用继承

文章目录 一、什么是桥接模式1、使用场景2、代理、桥接、装饰器、适配器 4 种设计模式的区别3、桥接模式的优缺点4、桥接模式的四种角色 二、实例桥接模式优化代码 三、源码中使用的桥接模式1、桥接模式在JDBC中的应用 一、什么是桥接模式 桥接模式(Bridge Pattern…

【Java 并发编程】Java 线程本地变量 ThreadLocal 详解

Java 线程本地变量 ThreadLocal 详解 1. ThreadLocal 简介2. ThreadLocal 的使用2.1 ThreadLocal 接口(1)initialValue()(2)get()(3)set(T value)(4)remove() 2.2 ThreadLocal 应用 …

springboot链接redis (Windows版本)

1。 下载链接 https://redis.io/download/ 2.下载完成之后傻瓜安装 3. 打开下载安装路径 3.输入cmd回车 4.依次执行以下命令 redis-server.exe redis-server.exe redis.windows.conf redis-cli shutdown exit redis-server.exe redis.windows.conf 可成功启动redis 5…

(五)Kubernetes - 手动部署(二进制方式安装)

Kubernetes - 手动部署 [ 4 ] 1 增加Master节点(高可用架构)1.1 部署Master2 Node1.1.1 安装Docker(Master1)1.1.2 启动Docker、设置开机自启(Master2)1.1.3 创建etcd证书目录(Master2)1.1.4 拷贝文件(Master1)1.1.5 删除证书(Master2)1.1.6 修改配置文件和主机名(Master2)1.1.…

在线一键解jsjiami.v6

在当今的互联网时代,JavaScript是web开发的核心技术之一。但是,为了保护JavaScript代码的安全性,很多开发者会使用JS加密技术。其中一个常用的JS加密工具是jsjiami.v6。 JS加密通过对JavaScript代码进行混淆、压缩、编码等多种操作&#xff…

使用crond定时跑脚本备份数据库

前言: 开发环境 服务器:centos 7(腾讯云轻量服务器) 数据库:mysql 5.7 一、crond是什么? crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务…

车载测试-can报文解析规则实例

报文解析 报文组成 一般报文主要有以下几个参数(比较全的情况下) 例 解析报文时主要用到的是帧ID和帧数据 帧ID 接收到的帧ID是十六进制的形式,由29位标识符转换的,目前大多数的通信协议中都直接给出了相应的帧ID&#xff0c…

一文读懂ChatGPT(全文由ChatGPT撰写)

最近ChatGPT爆火,相信大家或多或少都听说过ChatGPT。到底ChatGPT是什么?有什么优缺点呢? 今天就由ChatGPT自己来给大家答疑解惑~ 全文文案来自ChatGPT! 01 ChatGPT是什么 ChatGPT是一种基于人工智能技术的自然语言处理系统&…

光耦继电器和普通继电器的区别概述

光耦继电器和普通继电器都是电气传感器元件中的一种,其都能够将电能转化成机械能,并实现各种开关控制和保护控制。但光耦继电器与普通继电器最大的区别在于其输入电路与输出电路之间通过光电转换器件,而不是实现物理接触。本文将从结构、工作…