iOS各浏览器、macOS的safari无法使用websocket问题

  • 现象
  • 结论
  • 排查过程

现象

写了个页面放在一个购买的服务器上,使用websocket从后台获取数据。某天开始iphone突然无法建立socket连接了,各个浏览器均不行。测试时发现macbook的safari也会失败,开控制台可以看到失败信息为:“failed: Error during WebSocket handshake: ‘Connection’ header value is not ‘Upgrade’”。
PC、Android上各浏览器正常,macbook上的chrome、firefox也正常;本地启动tomcat测试时也是一切正常无此问题。

结论

购买的服务器的部署结构为apache->tomcat。apache上设置了force-proxy-request-1.0,导致实际tomcat收到的请求为http1.0。tomcat对http1.0请求会固定在应答头加上Connection: close,应答头会同时出现Connection: upgrade和Connection: close,其他能建立连接的浏览器可能只判断了前者,失败的可能判断了后者。tomcat对http1.1才能正常只应答Connection: upgrade。删除apache上这个强制1.0的配置项后恢复正常。

排查过程

(一直在绕弯)
18年年中刚出现这个问题时,我2个iPhone有段时间是1台正常1台不正常,所以一开始以为是苹果更新出了什么问题导致,主要针对这方面搜索,并没有什么结果。
近期稍微有空了,所以继续针对这个问题进行了进一步排查。首先是因为手机的safari也有问题,这个可以连mac来看下控制台,结果发现其实mac的safari也有问题,控制台能看到报错,所以后续就拿safari+这个报错搜了下,结果的确也是有人遇到过这个问题,解决方案是换tomcat。
因为那个服务器上的tomcat、jdk一直都有在更新最新的,感觉应该不是tomcat问题。我本地测试也是旧的tomcat和新的tomcat都测过,都正常的。
于是开始自我怀疑我代码是不是哪里有问题,排查过程中甚至解决了个一直没空解决的bug(= =)。
又试了下那个服务器上其他版本的tomcat、jdk,也试了下各个能改的配置项,结果还是一样问题。(然而force-proxy-request-1.0的那个配置项他们没做到页面上让我可以自己配)

(终于进入正轨)
想了想既然我本地tomcat测试正常,那个服务器不正常,肯定是应答里有啥不一样,于是决定抓包。
(下了个wireshark,第一次用还不太会用,本地浏览器连本地tomcat时没抓到,最后是用手机连本地tomcat抓的。)

我本地tomcat测试时的抓包:

0000   e4 b2 fb a8 55 61 c8 69 cd a0 cf 06 08 00 45 00   ....Ua.i......E.
0010   00 e2 00 00 40 00 40 06 b7 e8 c0 a8 00 70 c0 a8   ....@.@......p..
0020   00 6d 1f 90 f5 bf d1 f8 23 91 6c 52 84 e5 80 18   .m......#.lR....
0030   10 05 e0 80 00 00 01 01 08 0a 38 ce 66 23 15 5a   ..........8.f#.Z
0040   04 6c 48 54 54 50 2f 31 2e 31 20 31 30 31 20 0d   .lHTTP/1.1 101 .
0050   0a 53 65 72 76 65 72 3a 20 41 70 61 63 68 65 2d   .Server: Apache-
0060   43 6f 79 6f 74 65 2f 31 2e 31 0d 0a 55 70 67 72   Coyote/1.1..Upgr
0070   61 64 65 3a 20 77 65 62 73 6f 63 6b 65 74 0d 0a   ade: websocket..
0080   43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 75 70 67 72   Connection: upgr
0090   61 64 65 0d 0a 53 65 63 2d 57 65 62 53 6f 63 6b   ade..Sec-WebSock
00a0   65 74 2d 41 63 63 65 70 74 3a 20 2b 31 4b 50 6d   et-Accept: +1KPm
00b0   63 35 52 76 57 56 55 52 7a 50 6f 44 32 56 59 61   c5RvWVURzPoD2VYa
00c0   53 6c 78 52 42 4d 3d 0d 0a 44 61 74 65 3a 20 57   SlxRBM=..Date: W
00d0   65 64 2c 20 32 39 20 4d 61 79 20 32 30 31 39 20   ed, 29 May 2019
00e0   31 32 3a 32 38 3a 32 37 20 47 4d 54 0d 0a 0d 0a   12:28:27 GMT....

连服务器的抓包:

0000   c8 69 cd a0 cf 06 94 d9 b3 e3 44 5f 08 00 45 00   .i........D_..E.
0010   00 da 27 b9 40 00 35 06 ee 13 73 ee fa 4c c0 a8   ..'.@.5...s..L..
0020   00 6e 00 50 c4 cf 89 45 58 df cb c4 c2 2f 80 18   .n.P...EX..../..
0030   1d e8 f7 ed 00 00 01 01 08 0a 00 3d e7 74 14 39   ...........=.t.9
0040   47 48 48 54 54 50 2f 31 2e 31 20 31 30 31 20 0d   GHHTTP/1.1 101 .
0050   0a 55 70 67 72 61 64 65 3a 20 77 65 62 73 6f 63   .Upgrade: websoc
0060   6b 65 74 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a   ket..Connection:
0070   20 75 70 67 72 61 64 65 0d 0a 53 65 63 2d 57 65    upgrade..Sec-We
0080   62 53 6f 63 6b 65 74 2d 41 63 63 65 70 74 3a 20   bSocket-Accept:
0090   58 69 6b 54 6d 57 49 52 71 55 62 49 6a 38 47 32   XikTmWIRqUbIj8G2
00a0   4d 6c 56 78 59 39 32 6e 52 54 63 3d 0d 0a 44 61   MlVxY92nRTc=..Da
00b0   74 65 3a 20 54 68 75 2c 20 30 36 20 4a 75 6e 20   te: Thu, 06 Jun
00c0   32 30 31 39 20 31 33 3a 34 34 3a 31 38 20 47 4d   2019 13:44:18 GM
00d0   54 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63   T..Connection: c
00e0   6c 6f 73 65 0d 0a 0d 0a                           lose....

可以看到除了Connection: upgrade外,最后还多了个Connection: close。
找服务器的技术支持反馈下这个情况,表示不太懂。行吧我继续查= =。

偶然撇到了tomcat的access的log日志里打印的收到的请求都是http1.0,结合我当年对Connection头的研究,记得它对http1.0和1.1是不一样处理的。看了下文档1的确也是不一样的,http1.0默认Connection: close,所以猜测tomcat默认给加上了。
用curl设http1.0对本地tomcat试一下,果然能复现出应答头多Connection: close。

curl -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Key: gECcaHsGS5M+ZrM7SPyc6Q==" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Extensions: x-webkit-deflate-frame" --http1.0 -v http://localhost:8080/showresult
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /showresult HTTP/1.0
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
> Connection: Upgrade
> Upgrade: websocket
> Sec-WebSocket-Key: gECcaHsGS5M+ZrM7SPyc6Q==
> Sec-WebSocket-Version: 13
> Sec-WebSocket-Extensions: x-webkit-deflate-frame
>
< HTTP/1.1 101
< Upgrade: websocket
< Connection: upgrade
< Sec-WebSocket-Accept: bnKWsWFNUcBPRs/wUgi2qfdfStA=
< Date: Fri, 21 Jun 2019 23:26:06 GMT
< Connection: close
<

再找服务器的技术支持问下是不是配了apache强制1.0的配置,删掉再测就好啦。


  1. https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Connection ↩︎

iOS各浏览器、macOS的safari无法使用websocket问题相关推荐

  1. vue在微信里面的兼容问题_Vue在 iOS 微信浏览器下不能播放

    问题的本质 以上定位到问题大概花了我半小时时间,但是我并没有找到问题的根本原因,于是我翻阅了 Vue.js 2.5 的 release log,由于很长就不列了.Vue.js 每次升级主要分成 2 大 ...

  2. 苹果微信html音乐播放,HTML5教程 在iOS微信浏览器中如何自动播放HTML5 audio

    本篇教程探讨了HTML5教程 在iOS微信浏览器中如何自动播放HTML5 audio,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < html> Aut ...

  3. ios macos_设计师可以从iOS 14和macOS Big Sur中学到什么?

    ios macos 重点 (Top highlight) With the introduction of iOS 14 and macOS Big Sur, we are the witness o ...

  4. 苹果将iOS应用带入macOS

    \\ 今天在Apple全球开发者大会上,软件工程高级副总裁Craig Federighi宣布,苹果正努力将iPhone的生态带向Mac. 这不会在一夜之间完成,Federighi强调,这是一个多年的项 ...

  5. 如何安装iOS 13 、 macOS Catalina 、watchOS 6 、 tvOS 13 或 iPadOS Beta

    前言 大家端午节安康!在北京时间6月4日凌晨1点,苹果举行了WWDC19.发布了iOS 13 . macOS Catalina .watchOS 6 . tvOS 13 和 iPadOS , 还有 M ...

  6. ios html自动进入app,iOS 通过浏览器打开app

    1.Targets --> Info --> URL Types --> URL Schemes(填写自定义协议,如:watson),如图: 步骤1.png 2.Html代码 IOS ...

  7. IOS微信浏览器返回事件popstate监听

    问题描述: 通过监听popstate事件,来判断是否点击返回按钮,比如从A页面跳转到B页面(监听popstate),然后再跳转到C页面,点击返回的按钮,测试成功,包括安卓版,但是问题来了,IOS版的微 ...

  8. 苹果浏览器显示打不开改网页无法连接服务器,为什么苹果浏览器老是显示safari打不开该网页答案...

    小编在这段时间遇到好多广大网友的咨询,今天免费分享一下关于电脑系统和电脑操作教程的知识大全,这篇文字是关于为什么苹果浏览器老是显示safari打不开该网页答案的文字,欢迎大金仔细阅读,如果不懂请多多关 ...

  9. uniapp图片或文件的预览和下载,兼容ios+安卓+浏览器

    一.前言 在uniapp的APP日常开发中,我们时常遇到一些兼容性问题,正如本文所提到的图片的预览和下载.在此功能的开发中,我常遇到以下四个问题: 图片预览功能实现,但是PDF,word,xls文件无 ...

最新文章

  1. 一张脑图说清 Nginx 的主流程
  2. 【转】flannel网络的VXLAN及host-gw
  3. Struts2 Hibernate集成示例教程
  4. linux显卡驱动未加载,Linux下无显卡驱动的解决办法
  5. Android 自定义控件之圆形扩散View(DiffuseView)
  6. 6. 标准 I/O 库
  7. 免安装mysql5.7.22_windows环境下安装MySQL5.7.22免安装版
  8. 通过VBA锁定单元格的值
  9. AVX贴片钽电容标识
  10. 40163 php,【PHP】微信支付JsApi 40163错误,_PHP_ 少侠科技
  11. 阿里云ECS centos8连接可视化界面
  12. Java——FileOutputStream,字符输出流,以字符为单位写出数据
  13. 在几何画板中怎样添加链接
  14. Latex引用参考文献-BibTex的使用
  15. FL Studio 20水果编曲软件中文汉化补丁包(含软件)V2021.20
  16. 循环经济与可持续发展企业——章节测试1
  17. 应用、permission、资源
  18. 阿里VS腾讯谁将是未来流量之王?
  19. css变成块级元素_设置标签的css样式代码为“display:block”,标签将变为块级元素。( )...
  20. 计算机专业转专业申请书范文,常用的转专业申请书范文(2017最新版)

热门文章

  1. php运行出现404错误,php文件提示404错误not found其实文件存在
  2. VMware10下Mac OS X 10.9系统VMware Tools的安装
  3. linux aptana,安装Aptana AJAX开发环境在Ubuntu上
  4. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(2) - 识别当前i.MXRT型号
  5. 浙大python网_浙大
  6. python-求阶乘算法
  7. win7镜像下载和安装vm教程
  8. RFID烟草在线监测系统解决方案(无线测温)
  9. 人事办公考勤工资管理系统(ssm,mysql)
  10. JAVA服务端实现页面截屏(附代码)