我在许多分布式嵌入式设备上都有一个(Java-)应用程序与我的服务器通信。通信由 HTTP 请求组成,从任一端开始,目前通过构建 openVPN 隧道来保护。这很好用,并且具有以下必需的功能:
- 安全(窃听、注入、身份验证等)
- 双向 - 两方中的任何一方都可以发起请求
- 很好地处理通过防火墙和 NAT 路由器(因为连接是从家里开始的)
- 在隧道丢失时自行重新连接
不幸的是,它也有以下缺点:
- (预计)1000 台设备的服务器负载非常重
- 一些数据开销和连续发送 - 这尤其是带宽和数据量受限设备的问题
我正在考虑将安全 WebSockets (WSS) 作为替代品,并希望得到建议,这是否是个好主意。到目前为止,我有以下问题:
- 我是否正确假设当没有通信发生时 WebSockets 的服务器负载是最小的?所以这项技术可以扩展到在单个服务器上连续连接的几个 10,000 个客户端(流量很小)?
- 我是否正确假设没有通信的数据开销是最小的?(keep-alive 是 2bytes,我读过)
- WebSockets 没有定义协议。我必须定义自己的请求/响应协议吗?或者我应该通过 WebSocket 对当前的 HTTP 请求进行隧道传输?推荐什么?
- 我必须自己实施重新连接策略(onError、onClose -> 立即重试,如果不成功请稍等重试等)还是有标准?
- WebSockets 通过通常的家庭防火墙、NAT 路由器、代理等的情况如何?它通常比 VPN(使用非标准传出端口,可能被阻止)更好地工作吗?
- 由于应用程序不是浏览器,我必须包含受信任的证书吗?或者,当我控制两端时,我可以运行自己的证书颁发机构吗?
- 在通过 WebSockets 进行机器对机器通信中需要注意的其他特殊陷阱?