如果我有两个Linux盒子而且我正在编写一个C / C ++程序来在一个盒子上发送消息而在另一个盒子上接收,那么最快的方法是什么?
我不确定我听到的各种套接字/网络技术是否仅仅是基础技术的包装,或者它们是否是其他可能性。我只是想知道什么是最接近“裸机”的,我可以从我的申请中实现。
我在想最快的方法包括将我的程序编写为驱动程序并将其加载到内核中。但是,我仍然需要知道使用这个想法的最快套接字实现。
答案 0 :(得分:3)
任何现代PC都能够保持以太网芯片缓冲器满载,因此“裸机”编程不会带来任何好处。与网络延迟(即光限制的速度)相比,通过内核增加的延迟非常小,因此不值得优化。
对于“快速”,如在两个连接的Linux机箱之间移动的高带宽数据,TCP是您的朋友,因为它将优化自身以达到最大网络能力,而无需您自己检测和调整。直接连接可以忽略不计的数据包丢失和低延迟,因此您不必担心窗口大小等。
如果您希望“快速”转换为小型请求,请使用UDP。
如果您对“快速”有其他定义,那么您需要详细说明。
答案 1 :(得分:1)
问题是不完整的,因为除了必须快速之外,您没有指定任何要求。这里要考虑很多方面,例如使用的协议(TCP用于可靠性,UDP用于流式传输等),序列化(您计划通过网络发送什么类型的数据,是否可以使用序列化库,如谷歌Protobuf?),等等。
我的建议是看看各种RPC框架,比如Apache Thrift,Apace Etch或ZeroC Ice,并在你确定需要使用tbe BSD套接字API或类似的低级抽象之前对它们进行基准测试。
答案 2 :(得分:1)
好吧,除非您想构建用于通过以太网进行自定义通信的内核模块,否则libc中最快的用户空间API就是Berkley套接字API。是的,这是内核TCP / IP和UDP / IP的包装,它是一层IP,一层是WWAN,LAN和以太网,它是一层而不是其他东西,但除非你需要这样的令人难以置信的确切的性能,我建议留在userland中的简单内容,而不是编写你需要使用更低级别的内核模块。除非我完全错误,否则无法从用户空间访问原始以太网,WWAN或LAN,更不用说实际访问硬件了。
注意:如果您有几年的时间来重写整个UNIX网络堆栈和网卡驱动程序,那么当您通过ioperm()
调用以root用户身份运行时,您可以从用户空间获得x86 I / O端口访问权限,但我不知道建议重写整个UNIX网络堆栈。那是将近20年的工作。此外,从三维方应用程序直接硬件访问是一个等待发生的安全灾难。
注意:如果您没有使用任何传统的硬件进行网络连接,那么可以为双端USB电缆编写自定义驱动程序并创建自定义网络协议,如编写Linux USB设备驱动程序可能是最容易编写的驱动程序,因为它有一个很大的API。我真的不知道速度会如何叠加到这里,因为USb 2.0比旧的以太网标准更快,但是他们开始有1 Gbps以太网,现在有SUB 3.0,所以这可能更快或更慢,取决于可用的硬件。这更多是关于易用性。
编辑:为了速度,请永远不要将代码放在内核中。请。你放入机器的巨大安全漏洞不值得提升性能。曾经有一段时间系统调用非常昂贵,并且您希望最小化并添加到内核是一个选项,但使用更新的标准,如英特尔的sysenter
/ sysexit
和AMD的syscall
/ sysret
,他们足够狡猾,不能保证安全漏洞。