即使不涉及 Web 浏览器,也可以在原始 tcp 上使用 websocket:好主意吗?

Posted

技术标签:

【中文标题】即使不涉及 Web 浏览器,也可以在原始 tcp 上使用 websocket:好主意吗?【英文标题】:Using websocket over raw tcp even when no web browser is involved: good idea? 【发布时间】:2019-09-17 02:53:20 【问题描述】:

在查看了原始 TCP 和 websocket 之间的差异之后,我正在考虑使用 websocket,即使它是一个客户端/服务器系统,图中没有 web 浏览器。我的动机源于:

    websocket 是面向消息的,因此我不必自己在 tcp 层之上编写协议来分隔消息。 websocket 的初始握手非常适合我的用例,因为我可以在此初始响应-请求交换中对用户进行身份验证/授权。

不过,性能在这里确实很重要,我想知道除了 websocket 握手之外,websocket 消息与在原始 tcp 上编写自定义协议之间是否会出现性能损失?如果没有,那么 websocket 对我来说是最方便的选择,即使我不使用与“web”部分相关的好处。

使用 wss 也会改变上述问题的答案吗?

【问题讨论】:

wss 只是基于 TLS/SSL 安全会话的 websocket,因此会带来更多开销。还可以查看一些更高级别的 websocket 协议,例如 WAMP [wamp-proto.org/] 协商经过身份验证和授权的连接的侵入性较小。 WebSockets 在每一帧都有开销,而且可能相当大。当然,您设计的任何消息传递协议都有开销,但是您可以在每条消息之前执行一些简单的操作,例如在每条消息之前添加一个 16 位长度的字,这是最小的。 【参考方案1】:

假设性能和开销是与您的用例无关。

如果您以这种方式重新表述您的问题,答案应该是显而易见的:使用适合您目的的现有实现可以为您节省大量时间和设计、实现和测试的麻烦。培训开发人员使用此协议也更容易。由于 Wireshark 等常用工具已经了解协议,因此更容易调试问题。

除此之外,websockets 还具有使用代理的既定机制,使用通用协议,以便它们更容易通过防火墙等。因此,在推出应用程序时,您可能会遇到更少的问题。

换句话说:如果 websocket 符合您的目的,我看不出有什么理由不使用它们。

【讨论】:

呵呵是真的。主要是它被称为 websocket,但系统中并没有真正涉及到太多的“web”,所以想知道我是否遗漏了什么以及我的权衡是什么。谢谢!

以上是关于即使不涉及 Web 浏览器,也可以在原始 tcp 上使用 websocket:好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使不涉及虚函数,虚继承也需要vtable?

云或 Web 服务器上的原始 TCP 侦听套接字

二http通信 http与tcp关系

实现图片懒加载

第二十节 tcp_ip协议

Faye:即使套接字打开,也无法在浏览器中发送 GET 消息,通过 CURL 工作和响应数据