野外的 websocket 与开发机器
websocket in the wild vs dev machine
我的 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 进行了捕获以确认这一点。 所以我的问题 is/are:谁代表客户端发送 PONG? 是反向代理(在我的例子中是 IIS)吗?那是正常的吗?怎样才能避免呢?是 IIS 配置里的东西吗?
编辑:我刚刚在 linux 服务器上使用 nginx 而不是 IIS 对其进行了测试,我得到了相同的行为。所以我一定是漏掉了什么!!
似乎我们不能依赖 websocket ping/pong 来保证正确的线路检查,因为 they (ping) may not be sent down to client. Depending to the infrastructure, they may be intercepted by a proxy 或链中的其他 link(s)。
Ping/pong becomes unrelevant 用于在此类配置中进行连接检查。
令人失望的是RFC is not more constraining!
此外,asp.net core's websocket documentation 中有一些关于如何处理正确连接检查的说明。
我的 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 进行了捕获以确认这一点。 所以我的问题 is/are:谁代表客户端发送 PONG? 是反向代理(在我的例子中是 IIS)吗?那是正常的吗?怎样才能避免呢?是 IIS 配置里的东西吗?
编辑:我刚刚在 linux 服务器上使用 nginx 而不是 IIS 对其进行了测试,我得到了相同的行为。所以我一定是漏掉了什么!!
似乎我们不能依赖 websocket ping/pong 来保证正确的线路检查,因为 they (ping) may not be sent down to client. Depending to the infrastructure, they may be intercepted by a proxy 或链中的其他 link(s)。
Ping/pong becomes unrelevant 用于在此类配置中进行连接检查。
令人失望的是RFC is not more constraining!
此外,asp.net core's websocket documentation 中有一些关于如何处理正确连接检查的说明。