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