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

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 ↩︎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值