2012-08-09 31 views
4

就低延迟而言(我在考虑金融交换/协同定位 - 关心微秒的人)有哪些选择可用于从C++程序发送数据包两台Unix电脑?C/C++技术非常快速地跨网络发送数据

我听说过有关内核旁路网卡,但这是否意味着您针对该卡的某种API编程?我相信,与使用标准的Unix berkeley套接字相比,这将是一个更快的选择。

我非常感谢任何贡献,特别是来自参与此领域的人士。

从毫秒编辑以微秒

EDITED我还挺希望能得到更多的基于C/C++,答案而不是网络硬件技术。它的目的是作为一个软件问题。

+0

这些通常使用*套接字 - 它们几乎不减少延迟以减少主CPU的负载。 – 2012-08-09 19:03:16

+0

@Jerry:你指的是校验和卸载还是更重要的东西? – 2012-08-09 19:08:08

+0

如果你只关心*毫秒*,绕过内核不会帮助你。我无法想象,除了微秒之外,还有什么可以衡量的。 – meagar 2012-08-09 19:09:14

回答

1

当两台机器都在同一个LAN上时,UDP套接字是快速,低延迟和足够可靠的。 TCP比UDP慢得多,但是当两台机器不在同一个LAN上时,UDP不可靠。

+2

即使在同一个局域网上,任何拥塞点都可能导致丢失的UDP数据包 - 发送者,交换机或接收者。 – stark 2012-08-09 19:31:57

1

软件分析会在你的程序中遇到明显的问题。但是,当您谈论网络性能时,网络延迟可能是您最大的瓶颈。如果您使用的是TCP,那么您想要做的事情是避免网络拥塞和丢失,以防止重新传输。有几件事需要解决:

  • 使用具有带宽和可靠性保证的网络。
  • 正确调整TCP参数的大小以最大限度地利用率而不会造成损失。
  • 在您的数据传输中使用纠错来纠正您可能遇到的少量损失。

或者你可以完全避免使用TCP。但是,如果要求可靠性,那么最终将实现TCP中已有的大部分功能。

但是,您可以利用已经考虑了很多这些问题的现有项目。 UDT project是我知道的,这似乎正在获得牵引力。

1

在过去的某个时候,我使用了一个加载到Windows内核的数据包发送驱动程序。使用这个驱动程序可以产生比使用套接字层的应用程序强10-15倍的数据包流(我不记得确切的数字)。

的优点是简单的:直接从内核发送请求进入并绕过多个软件层:插座,协议(即使对于UDP包,仍然需要简单的协议驱动器处理),上下文切换等

+0

但是肯定内核旁路技术会更快? – user997112 2012-08-09 19:38:23

+0

最好的会写你自己的网卡驱动程序,我认为... – 2012-08-09 19:41:40

1

通常降低延迟的代价是降低了鲁棒性。比较例如(经常大大标榜)fastpath option for ADSL。由于较短的数据包传输时间而导致的延迟减少的代价是增加了错误敏感性。类似的技术migt存在于大量的网络媒体中。所以它非常依赖于所涉及的硬件技术。你的问题表明你指的是以太网,但不清楚这个链路是否是以太网或其他(ATM,ADSL ......),以及是否有其他的网络技术。它也非常依赖于地理距离。

编辑:
我得到这个问题的硬件方面抬出了一下。在应用程序设计级别至少提供一个有形的方面:看看zero-copy网络操作,如sendfile(2)。它们可以用来消除一种可能的延迟原因,但只有在原始数据来自应用程序内存以外的其他来源的情况下。

+0

那么这个接口如何与C++程序? – user997112 2012-08-09 19:43:25

+0

只要你留在TCP/IP协议栈中,这个答案不会提供可以在C++中修改的问题。如果您更改底层技术,您也可能更改协议,并且要这样做,请使用其他API。例如。发送原始ATM帧,或其他。 – MvG 2012-08-09 20:45:21

0

作为我的日常工作,我为某个证券交易所工作。下面的答案是我自己从我们提供的软件解决方案中为这种高吞吐量低延迟数据传输提供的意见。它不是以任何方式被视为营销宣传(请我是开发人员)。这只是为了给出此解决方案中软件堆栈的基本组件,这种快速数据(数据可以是库存/交易市场数据或一般的任何数据): -

1]物理层 - 基于TCP-UDP/IP的以太网网络的网络接口卡,或称为Infiniband主机通道适配器的非常快/高带宽接口。在IP /以太网软件堆栈的情况下,是OS的一部分。对于Infiniband,卡制造商(英特尔,Mellanox)提供其驱动程序,固件和API库,以便实施套接字代码(甚至infiniband使用其自己的套接字协议进行2个节点之间的网络通信。物理层之上的下一层是一个Middleware,它基本上抽象出较低的网络协议nittigritrit,为从物理层到应用层的数据I/O提供某种接口,该层还提供某种网络数据质量保证(IF使用tcp)

3]最后一层是我们在中间件之上提供的一个应用程序,任何一个从我们那里得到[1]和[2]的人都可以开发低延迟/高吞吐量的网络'ki nd应用程序的股票交易,算法交易类os应用程序使用编程语言接口的选择 - C,C++,Java,C#。

基本上,像您这样的客户端可以使用我们提供的API在C,C++中开发自己的应用程序,它将负责与NIC或HCA(即实际的物理网络接口)交互以快速发送和接收数据,非常快。

我们有一个全面的解决方案,可以满足我们客户所要求的不同质量和等待时间配置文件 - 有些需要微秒等待时间没问题,但他们需要高数据质量/很少的错误;有些可以容忍一些错误,但需要纳秒的延迟,有些需要微秒的延迟,没有错误可以容忍,...

如果您需要/或有兴趣在这种解决方案的任何方式,我的联系人在这里提到。