野外的 websocket vs 开发机器

Posted

技术标签:

【中文标题】野外的 websocket vs 开发机器【英文标题】:websocket in the wild vs dev machine 【发布时间】:2020-09-30 14:50:08 【问题描述】:

我的 websocket ping/pong 在我的开发环境和我的实际部署之间遇到了不同的行为。

当我开始这个项目时,我花了一些时间来测试 websocket ping/pong 功能,以便将 keepalive/connection 检查委托给 websocket 堆栈。我的主要目标是知道远程客户端是否尽快断开连接。所以我添加了一个服务器端 websocket keepalive(比如说 20 秒)。

在我的开发机器上,我有类似的东西:

[device] <==> [switch] <==> [asp.net core app(kestrel)]

在这种情况下,一切都很好:当我断开 websocket 客户端设备时,在 20 秒(好吧,有时更多)之后,我会收到连接已丢失的通知。

在我的暂存环境中,它有点复杂:

[device] <==> [switch] <==> [internet] <==> [IIS reverse proxy] <==> [asp.net core app(kestrel)]

在那种情况下,这很奇怪:当我断开 websocket 客户端设备时,我仍然从 IIS 获得 PONG...

我使用wireshark 进行了捕获以确认这一点。 所以我的问题是/是:谁代表客户端发送 PONG? 是反向代理(在我的情况下是 IIS)吗?这正常吗?怎么能避免呢?是 IIS 配置中的问题吗?

编辑:我只是在 linux 服务器上使用 nginx 而不是 IIS 对其进行了测试,并且得到了相同的行为。所以我一定错过了什么!

【问题讨论】:

【参考方案1】:

似乎我们不能依靠 websocket ping/pong 来保证正确的线路检查,因为 they (ping) may not be sent 一直到客户端。根据基础设施,他们may be intercepted by a proxy 或链中的其他链接。

Ping/pong becomes unrelevant 用于在这种配置中进行连接检查。

RFC is not more constraining 对此感到失望!

此外,asp.net core's websocket documentation 中有一些关于如何处理正确连接检查的指示。

【讨论】:

以上是关于野外的 websocket vs 开发机器的主要内容,如果未能解决你的问题,请参考以下文章

使用websocket开发智能聊天机器人

使用websocket开发智能聊天机器人

Websocket vs Ajax vs Cometd

如何利用Websocket实现ROS与Web的交互?

机器人操作系统二 ROS2:设计架构和野外使用 - 机器翻译

Node.Js + Socket.IO vs SignalR vs C# WebSocket 服务器