从 iPad 上的 websocket 连接中获取错误信息

Posted

技术标签:

【中文标题】从 iPad 上的 websocket 连接中获取错误信息【英文标题】:Getting error information out of a websocket connect on iPad 【发布时间】:2012-10-25 07:55:38 【问题描述】:

我正在尝试实现 websocket 协议,但由于某种原因 iPad 不与我合作。 iPad运行Hybi-00 specification,问题出在握手的某个地方。我正在阅读请求和以下魔术字节,并以我认为正确的答复进行响应。 iPad 不同意我并关闭连接。

协议处理程序适用于大多数现代浏览器运行的Hybi-06。

我真的很想用某种方法让 iPad 告诉我为什么它决定关闭 websocket 连接以便我可以解决问题。要么让 chrome 或其他浏览器将他们的 websocket 版本降级到 iPad 支持的相同版本,这样我就可以得到一些关于实际情况的线索。

有没有办法获取这些信息?

好的,尽管解释实际错误会很好,但握手如下:

GET /myurl HTTP/1.1
Upgrade:WebSocket
Connection:Upgrade
Host:my-host.com
Origin:https://my-host.com
Sec-WebSocket-Key1:1  QB  9 ,  $169780@8A`@4
Sec-WebSocket-Key2:3 160RhGi7mu  97*66br9

以下八个字节是关键:

byte[8]
    [0]: 105
    [1]: 199
    [2]: 161
    [3]: 204
    [4]: 5
    [5]: 176
    [6]: 104
    [7]: 199

服务器回复这个

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade:WebSocket
Connection:Upgrade
Sec-WebSocket-Origin:https://my-host.com
Sec-WebSocket-Location:ws://my-host.com/

还有钥匙

byte[16]
    [0]: 100
    [1]: 132
    [2]: 37
    [3]: 58
    [4]: 243
    [5]: 195
    [6]: 173
    [7]: 26
    [8]: 180
    [9]: 239
    [10]: 33
    [11]: 56
    [12]: 40
    [13]: 192
    [14]: 123
    [15]: 255

这是通过 HTTPS 连接运行的,所以它基本上是来自我的调试器的数据,因为我无法正确配置 wireshark 以在我的一生中提取它。据我所知,握手键也是正确的。

【问题讨论】:

你能把你的服务器收到的握手请求和它发送的响应贴出来吗? ...或您服务器的 Hybi-00 握手代码 它被埋得很深,并以几种不同的语言存在。而且,这也不全是我的。我正在代理对另一台服务器的调用并处理内容。我怀疑它与主机和来源有关,因为调用实际上在没有代理的情况下工作。 如果不能提供代码,可以用wireshark抓取握手请求/响应吗? 我会尝试一下。需要在附近的某个地方找到 iPad。需要一段时间,但我会得到它 【参考方案1】:

看this thread。

正如 Cybear 所指出的,我建议升级到 ios6。当前统计显示around 60% of overall iOS users are on iOS6。

【讨论】:

如果他们允许我强制使用 iOS6,我会这样做。但是,如果我能真正完成这项工作并找出这里似乎存在问题的原因,那就太酷了。【参考方案2】:

Hybi-06 是协议的一个版本,它只是一个规范,如果我没记错的话,实际上没有任何浏览器实现该版本。我认为大多数浏览器都使用了 Hybi-10,然后是 Hybi-17(Rfc6455),正如你所说的 iOS 目前使用的是 Hybi00。有几个服务器支持该特定握手。我也知道有一些支持草稿的每个版本。

我运行XSockets.NET,我们选择支持 Hybi-00 和 RFC6455 版本,因为它们是在浏览器中实现的协议。 (Safari 仍在 Hybi00 上)

在 RFC6455 中有一个关于支持多协议的部分;

https://www.rfc-editor.org/rfc/rfc6455#page-26

如果您正在实施某事,我的建议是执行 RFC6455

【讨论】:

以上是关于从 iPad 上的 websocket 连接中获取错误信息的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amp\Websocket 从打开的流连接中获取 websocket ping?

使用部署在 CentOS 服务器上的 Latchet 框架时,无法从 webapp 的 JS 建立 websocket 连接

连接打开后如何从javax websocket服务器获取消息

由于 BoringSSL 证书验证失败,iOS 上的安全 websocket 连接失败

Android - WebSocket - 从最近使用的应用程序清除应用程序时,连接从服务中删除

在 Redux Saga 中重用 websocket 连接对象