在低延迟方面(我正在考虑金融交换/托管 - 关心微秒的人)有哪些选项可以从两台 Unix 计算机上的 C++ 程序发送数据包?
我听说过内核绕过网卡,但这是否意味着您针对网卡的某种 API 进行编程?我认为与使用标准 Unix berkeley 套接字相比,这将是一个更快的选择?
我真的很感激任何贡献,尤其是那些参与这一领域的人。
从毫秒编辑到微秒
已编辑我有点希望收到更多基于 C/C++ 的答案,而不是网络硬件技术。它的目的是作为一个软件问题。
在低延迟方面(我正在考虑金融交换/托管 - 关心微秒的人)有哪些选项可以从两台 Unix 计算机上的 C++ 程序发送数据包?
我听说过内核绕过网卡,但这是否意味着您针对网卡的某种 API 进行编程?我认为与使用标准 Unix berkeley 套接字相比,这将是一个更快的选择?
我真的很感激任何贡献,尤其是那些参与这一领域的人。
从毫秒编辑到微秒
已编辑我有点希望收到更多基于 C/C++ 的答案,而不是网络硬件技术。它的目的是作为一个软件问题。
当两台机器在同一个 LAN 上时,UDP 套接字速度快、延迟低且足够可靠。TCP 比 UDP 慢很多,但是当两台机器不在同一个 LAN 上时,UDP 是不可靠的。
软件分析将解决您的程序明显的问题。但是,当您谈论网络性能时,网络延迟可能是您最大的瓶颈。如果您使用的是 TCP,那么您需要做一些事情来避免网络上的拥塞和丢失,以防止重新传输。有几件事可以应对:
或者您可以完全避免使用 TCP。但如果需要可靠性,您最终将实现 TCP 中已有的大部分内容。
但是,您可以利用已经考虑过很多此类问题的现有项目。UDT 项目是我所知道的,它似乎正在获得关注。
在过去的某个时候,我使用了一个加载到 Windows 内核中的数据包发送驱动程序。使用这个驱动程序可以生成比使用套接字层的应用程序强 10-15 倍的数据包流(我不记得确切的数字)。
优点很简单:发送请求直接来自内核,绕过多层软件:套接字、协议(即使对于UDP数据包仍然需要简单的协议驱动处理)、上下文切换等。
通常减少延迟是以降低鲁棒性为代价的。例如,比较ADSL 的(经常大肆宣传的)快速路径选项。由于更短的数据包传输时间而减少的延迟是以增加错误敏感性为代价的。类似的技术可能存在于大量网络媒体中。所以这在很大程度上取决于所涉及的硬件技术。您的问题表明您指的是以太网,但尚不清楚该链接是仅以太网还是其他东西(ATM,ADSL,...),以及其他一些网络技术是否也是一种选择。它也很大程度上取决于地理距离。
编辑:
我对这个问题的硬件方面有点忘乎所以。在应用程序设计级别提供至少一个有形的方面:看看像(2)这样的零拷贝网络操作。它们可用于消除一种可能的延迟原因,尽管仅在原始数据来自应用程序内存以外的某个来源的情况下。sendfile
作为我的日常工作,我在某家证券交易所工作。下面的答案是我自己对我们为这种高吞吐量低延迟数据传输提供的软件解决方案的看法。它无意以任何方式被视为营销宣传(请我是开发人员。)这只是为了提供这种快速数据的解决方案中软件堆栈的基本组件(数据可能是库存/交易市场数据或一般任何数据):-
1] 物理层 - 基于 TCP-UDP/IP 的以太网网络的网络接口卡,或称为Infiniband主机通道适配器的非常快速/高带宽的接口。对于 IP/以太网软件堆栈,它是操作系统的一部分。对于 Infiniband,卡制造商(英特尔、Mellanox)提供了他们的驱动程序、固件和 API 库,必须针对这些库实施套接字代码(甚至 infiniband 也使用自己的“socketish”协议在 2 个节点之间进行网络通信。
2] 我们拥有的物理层之上的下一层是中间件,它基本上抽象了较低的网络协议细节,为从物理层到应用层的数据 I/O 提供某种接口。该层还提供某种网络数据质量保证(IF 使用 tCP)
3] 最后一层是我们在中间件之上提供的应用程序。任何从我们这里得到 1] 和 2] 的人,都可以开发一种低延迟/高吞吐量的“网络数据传输”类应用程序,用于股票交易、算法交易类操作系统应用程序,使用编程语言接口 - C、C++、爪哇,C#。
基本上,像您这样的客户可以使用我们提供的 API 在 C、C++ 中开发自己的应用程序,这将负责与 NIC 或 HCA(即实际的物理网络接口)进行交互,以快速、非常快速地发送和接收数据。
我们有一个全面的解决方案,可以满足客户对不同质量和延迟的需求——有些需要微秒级的延迟是可以的,但他们需要高质量的数据/很少的错误;有些可以容忍一些错误,但需要纳秒延迟,有些需要微秒延迟,不能容忍错误,...
如果您需要/或对这种解决方案有任何兴趣,请通过我在 SO 中提到的联系人联系我离线。