2012-10-12 87 views
0

如果我有两个Linux机器,并且正在编写一个C/C++程序在一个盒子上发送信息并在另一个盒子上接收信息,那么最快的方法是什么?通过网络发送数据的最快的C/C++技术?

我不确定我听到的各种插座/网络技术是否仅仅是基础技术的包装,或者它们是否是可选的可能性。我只想知道我可以从我的应用程序中实现的最接近“裸机”的东西。

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

+2

这里有一些非常明显的选择,比如TCP。什么是您提到的一些“各种插座/网络技术”? –

+0

最快或最可靠的交付? – jedwards

+2

我想它归结为“快”有多快? TCP不是实时的,但两个坐在一起的盒子之间的有线GB连接相当快。我想如果你需要*快速和实时,你可能想要在同一个PCI/PCIe总线上获得它们。我已经在实时工业环境中使用了它,但除非必须,否则我不想惹这个问题; -0 –

回答

1

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

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

1

好吧,除非你想建立一个用于通过以太网自定义通信的内核模块,否则来自libc的最快用户空间API是Berkley套接字API。是的,这是对内核TCP/IP和UDP/IP的封装,它是一层基于IP的层,它是一层WWAN,LAN和以太网,它是其他层的层,但除非你需要这样的令人难以置信和确切的性能,我建议留在用户空间的简单的东西,而不是编写内核模块,你需要使用更低的东西。除非我完全错误,否则无法从用户空间访问原始以太网,WWAN或LAN,更不用说实际访问硬件了。

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

注意:如果你是不使用任何传统硬件联网OK,你可以写双头USB连接线自定义驱动程序,并创建了一个自定义的网络协议,如编写Linux的USB设备驱动程序可能是最简单的驱动程序编写,因为它有一个大的API。我真的不知道速度会如何堆积在这里,因为USb 2.0比旧的以太网标准更快,但是他们开始拥有1 Gbps以太网,现在有了SUB 3.0,因此速度可能会更快或更慢,取决于可用的硬件。这更多关于易用性。

编辑:请永远不要把代码放在内核中以求速度。请。您放入机器中的巨大安全漏洞不值得提升性能。曾经有一段时间系统调用非常昂贵,而且您希望尽量减少内核,并增加内核是一种选择,但采用像英特尔的sysenter/sysexit和AMD的syscall/sysret这样的新标准,它们足够勉强以至于不能保证安全性孔。

3

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

对于“快”在两个相连的Linux机器之间的高带宽移动数据,TCP是你的朋友,因为它会自我优化,以最大网络能力,您无需检测和调整自己。直接连接将有微不足道的丢包,一般低延迟,所以你不必担心窗口大小等

如果你想“快”为快速周转,以小的请求,使用UDP。

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