为啥套接字连接的基本抽象并不常见?

Posted

技术标签:

【中文标题】为啥套接字连接的基本抽象并不常见?【英文标题】:Why are fundamental abstractions of socket connections not more common?为什么套接字连接的基本抽象并不常见? 【发布时间】:2020-03-26 15:32:13 【问题描述】:

例如ZeroMQ 提供了抽象的通信模式,例如 pub-sub、req-rep 等并处理连接(可以在绑定之前连接)。 为什么仍然普遍使用 tcp 和 udp 等原始套接字?

虽然 ZeroMQ 等库提供了这些抽象,但我不明白为什么它没有成为操作系统本身的一部分。

【问题讨论】:

【参考方案1】:

如果您从未使用过 ZeroMQ,您可以在这里先看看"ZeroMQ Principles in less than Five Seconds"在深入了解更多细节之前


Q“为什么仍然很普遍使用原始套接字,例如 tcp 和 udp?”

因为时间。原始的tcpudp 通信协议已经“使它”成为一个通用标准(从那时起承担所有强制性的兼容性承诺)。

O/S-es、硬件设备,甚至 MITM 嗅探器都依赖它们来拥有所有这些 RFC 标准记录的属性。

虽然 ZeroMQ 和其他框架在这些基础标准之上提供更高层的抽象,但也需要基本标准来保持承诺的兼容性。


“......为什么这还没有成为操作系统本身的一部分?”

O/S-es,由于明显的原因是积累最小开销、占用最小空间以及出于类似的动机,自古以来就更喜欢,目前更喜欢并且在可预见的未来更喜欢重复使用成熟的公共领域标准工具,即不专有或受许可限制的工具,具有未知或不确定(未)支持多长时间的交叉编译兼容性,因此在不久的将来很可能不会出现自下而上的、全行业的全面重新设计(以未知的成本和交货时间)直到足够成熟,如果最终行业碰巧决定,尽管到目前为止已经说过,确实要开始并在这样做时生存下来)。

【讨论】:

感谢您的意见。我以前使用过 ZMQ,并且主要喜欢它来处理连接。所以我不必监视丢失的 TCP 连接或等到服务可用。我也没有讨论底层的原始协议,当然仍然需要这些协议作为基础。我很想知道为什么没有标准化的高级抽象内置到 O/S-es 中来处理这种常见的事情。至少在我的编程经验中——我不想弄乱原始套接字,想要一个干净的通信机制来消除这个或那个原始套接字带来的丑陋。

以上是关于为啥套接字连接的基本抽象并不常见?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法通过 Web 套接字连接获得 HubCallerContext 用户?

为啥当它是静态连接时,Web 套接字的延迟会有所不同?

为啥 Node.js 中的某些 TCP 套接字比大多数其他套接字需要更多的时间来连接?

为啥我的 TCP 服务器套接字在一个客户端断开连接后关闭?

为啥在从服务器接收到所有数据后客户端套接字连接没有关闭?

如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?