1

如果我有两个 Linux 机器并且我正在编写一个 C/C++ 程序以在一个机器上发送消息并在另一个机器上接收,那么最快的方法是什么?

我不确定我听到的各种套接字/网络技术是否只是底层技术的包装,或者它们是否是替代可能性。我只想知道最接近我可以从我的应用程序中实现的“裸机”。

我在想最快的方法包括将我的程序编写为驱动程序并将其加载到内核中。但是,我仍然需要知道最快的套接字实现来使用这个想法。

4

3 回答 3

3

任何现代 PC 都能够保持以太网芯片缓冲器满载,因此“裸机”编程不会带来任何好处。与网络延迟(即光速限制)相比,通过内核增加的延迟非常小,不值得优化。

对于在两个连接的 Linux 机器之间进行高带宽数据移动的“快速”,TCP 是你的朋友,因为它会优化自身以达到最大的网络能力,而无需你自己检测和调整。直接连接的丢包率可以忽略不计,而且延迟通常很低,因此您不必担心窗口大小等。

如果您想要“快速”以快速处理小请求,请使用 UDP。

如果您对“快速”有其他定义,那么您需要详细说明。

于 2012-10-13T02:01:27.637 回答
1

这个问题不完整,因为您没有指定任何要求,除了它必须快速。这里有很多方面需要考虑,例如要使用的协议(TCP 用于可靠性,UDP 用于流式传输等),序列化(您打算通过网络发送什么样的数据,您可以使用序列化库,例如Google Protobuf?)等等。

我的建议是查看各种 RPC 框架,例如 Apache Thrift、Apace Etch 或 ZeroC Ice,并在您决定确实需要使用 BSD 套接字 API 或类似的低级抽象之前对它们进行基准测试。

于 2012-10-12T23:55:34.177 回答
1

好吧,除非您想为以太网上的自定义通信构建内核模块,否则 libc 中最快的用户空间 API 是 Berkley Sockets API。是的,这是内核 TCP/IP 和 UDP/IP 的包装,它是 IP 上的一层,它是 WWAN、LAN 和以太网的一层,它是其他东西上的一层,但除非你需要如此不可思议和精确的性能,我建议留在用户空间中的简单东西,而不是编写你需要使用更低的内核模块。除非我完全错了,否则无法从用户空间访问原始以太网、WWAN 或 LAN,更不用说实际访问硬件了。

注意:如果您有几年时间重写整个 UNIX 网络堆栈和网卡驱动程序,您可以在以 root 身份运行时从用户空间获得 x86 I/O 端口访问权限ioperm(),但我不建议重写整个 UNIX 网络堆。这差不多是 2 年的工作。此外,来自 3-d 方应用程序的直接硬件访问是等待发生的安全灾难。

注意:如果您可以不使用任何传统硬件进行网络连接,您可以为双端 USB 电缆编写自定义驱动程序并在其上创建自定义网络协议,因为编写 Linux USB 设备驱动程序可能是最容易编写的驱动程序,因为它有一个很大的 API。我真的不知道这里的速度会如何叠加,因为 USB 2.0 比旧的以太网标准更快,但是他们开始有 1 Gbps 以太网,现在有 SUB 3.0,所以这可能更快或更慢,取决于可用的硬件。这更多是关于易用性。

编辑:为了速度,请永远不要将代码放入内核中。请。您在机器中放置的巨大安全漏洞不值得性能的小幅提升。曾经有一段时间,系统调用非常昂贵,您希望最小化并添加到内核是一种选择,但是对于 Intel 的sysenter/sysexit和 AMD 的syscall/等新标准sysret,它们足够便宜,不足以保证安全漏洞。

于 2012-10-12T23:56:37.033 回答