通过3G连接使用WebSockets

40

我一直在使用Socket.io、node.js和WebSockets进行实验,它们在wifi连接下可以很好地工作。

但是,当我在3G连接(例如我的iPhone)上测试WebSocket应用时,似乎只有退回到长轮询才能解决问题。

使用Socket.io时,在降级到长轮询之前,连接就会因为"WebSocket连接无效或原始验证失败"而失败。

我不知道WebSockets是否应该在3G上工作 - 是否有人成功让它们像这样工作过?我尝试过许多不同的方法,它们似乎都失败了,这让我觉得我正在尝试做不可能的事情。


Socket.IO在iPhone上通过wifi工作吗?也就是说,您能否将iPhone / iOS排除在问题之外? - kanaka
是的,说得好。在 iPhone 上通过 WiFi 使用 Socket.io 没有问题,所以问题出在 3G 方面。 - suttree
我只在使用iPhone 6和3G时遇到这个问题。与Socket.io无关,使用Tornado和Nginx。也发生在非SSL端口80上的连接。 - ydaniv
4个回答

37
一些移动电话运营商因设置了完全失效的透明代理而臭名昭著,你不得不通过这些代理。这是WebSocket工作组自始至终必须处理的真正烦恼。该协议旨在确保在出现此类产品时会非常快地失败,以便您的应用程序可以立即回退到其他方法。如果您发现检测异常并回退需要很长时间,请向IETF的hybi工作组报告,以便诊断和解决问题。
同时,您可以联系您的移动电话运营商,询问如何在不通过他们的失效透明代理或者至少在他们修复其失效的代理以支持符合规范的HTTP时访问网络。其中一些可能会为您提供多个访问选项。

是的,这似乎是问题所在。我对WebSockets速度失败没有任何问题,所以这部分问题运行良好。只是很沮丧不能在3G上使用它们。感谢您解释情况。 - suttree
2
英国也有同样的问题。O2和Orange上的Websockets无法正常工作。 - FlappySocks
10
我在英国使用o2网络,当我在WiFi环境下访问http://websocketstest.com网站时,所有服务都可以正常使用,但在3G网络下只有443端口(SSL)可用。因此,值得考虑获取证书并改用wss://。 - Marc
所有人都加一分。那个测试网站真不错。我刚刚切换到端口443并在Android上使用wss,现在似乎一切正常了(当使用Pusher时,端口80会失败并显示503错误)。 - Dori
2
日本的Softbank也会阻止ws,但不会阻止wss。 - Grant M
@Marc 我使用Android Chrome在O2网络上,今天测试websocketstest.com的所有端口都是绿色的。 - pauloya

12

正如Willy Tarreau所说的那样,移动运营商使用的透明代理存在问题。我相信其他公司的防火墙也有这个问题。你可以通过使用不同的端口号来避免这个问题(至少在移动运营商上)。选择一些与80端口不同的端口号。尝试使用SSL也可能有效,但我尚未尝试过。

然后你会发现,由于防火墙的限制,只有80和443端口是开放的,其他端口都被阻塞了。

为你的WebSockets应用程序编写代码,在每次连接尝试时在端口80和其他端口之间切换,并使你的主机监听这两个端口。这样你就有很好的机会连接到服务器了。如果你使用Linux操作系统,则可以使用iptables端口重定向同时监听两个端口。


嗨,FlappySocks。听起来是个好的解决方案。你在任何网络上实施并确认它有效吗?我已经尝试了O2 UK的81端口,但WebSocket连接仍然失败。如果这确实有效,那么加一分和许多赞誉给你! - Brett Hannah
1
在使用1442端口的Orange上运行良好。还有一些SIM供应商,如http://www.stream-communications.com/和http://aaisp.net,提供正常工作的APN代理。但你不应该需要这个。我希望很快支持443 SSL。 - FlappySocks
很遗憾,在O2上甚至端口1442也无法使用。不过,知道我可以选择去Orange还是很好的。 - Brett Hannah

11

1
我正在使用SSE,但在尝试通过3G移动网络访问我的端点时遇到了问题。在常规宽带上同样的操作正常运行。不过我有一个观察结果 - 我有两个端点,一个使用https(ssl)在我的移动网络上可以正常工作,但是另一个使用http(没有ssl)在我的移动网络上无法工作。有什么想法吗? - Arpit Agrawal
@ArpitAgrawal 当连接过早关闭时,未决消息是否到达?这有助于在连接被强制通过尝试在发送任何内容之前缓冲整个响应的代理时。 - Kornel
我不确定你所说的“连接意外关闭时待处理消息”是什么意思?既然这是SSE,连接不是一直保持打开状态吗?我在这里设置了一个问题:https://dev59.com/bIvda4cB1Zd3GeqPUAva,并提供了我的端点示例。请帮忙解答,谢谢。 - Arpit Agrawal

6
我曾遇到在某些移动网络上使用不良的Web套接字连接时出现这些错误。以下方法解决了这些问题:
  1. 更改端口:将服务器和Web套接字客户端的端口迁移到SSL端口(端口443)

  2. Ping Keep-Alive:从客户端向服务器发送周期性的“ping”消息,等待服务器返回“pong”,如果服务器在Y秒内未返回“pong”,则在客户端重新启动连接。

实施(1)将帮助您解决大部分问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接