65.9K
CodeProject 正在变化。 阅读更多。
Home

基于UDP的可靠数据传输库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (55投票s)

2005 年 7 月 20 日

4分钟阅读

viewsIcon

358747

downloadIcon

10031

介绍了一个开源的基于 UDP 的数据传输库。

引言

本文介绍了一个开源的基于 UDP 的数据传输库,名为 UDT (UDP-based Data Transfer)。

目前,主要的两种互联网传输协议是 TCP 和 UDP。TCP 提供面向连接的可靠数据流服务,而 UDP 提供无连接的不可靠消息服务。大多数应用程序使用 TCP 进行数据传输,因为它们需要数据可靠性。

然而,在使用 TCP 时,某些应用程序会遇到两个问题。首先,TCP 在长距离链路上的性能较差,尤其是在带宽很高(例如 1GB/s 或更高)的情况下。其次,当同一个应用程序中包含具有不同 RTT 的多个并发 TCP 流时,不同的 TCP 流可能具有不同的数据传输速率(也称为 RTT 偏差)。

还有一些情况,人们不希望使用 TCP 或 UDP。例如,应用程序可能需要数据可靠性(因此不能直接使用 UDP),但同时也希望数据以用户可控的速率到达,或者希望保留消息边界。此外,有时使用 UDP 比使用 TCP 更容易穿过防火墙。

在 UDP 之上构建一个开源的用户空间传输协议可能是有益的,但需要数据可靠性控制和网络流/拥塞控制。因为它位于用户空间,所以易于安装。因为它开源,所以可以轻松修改以满足应用程序的各种需求。

示例应用程序

在这里,我们展示了两个可能需要 UDT 的示例应用程序。

a. 大规模数据传输和在线流数据处理

假设一家公司的数据存储在其全球的多个分支机构中,每个分支机构都拥有数据集的一部分。这些数据集非常大(TB 级别),公司拥有一个 1GB/s 的内网来传输它们。现在,其芝加哥分支机构的一个部门想要分析其自身的数据集以及伦敦分支机构的数据集。这个数据分析应用程序将需要使用公司 1GB/s 的内网,将两个数据集(分别位于伦敦和芝加哥)读取到芝加哥的一台计算机上。

回顾一下前面提到的 TCP 的两个问题。首先,链路必须非常干净(丢包率非常低),TCP 才能充分利用伦敦和芝加哥之间 1GB/s 的带宽。其次,当两个 TCP 流(伦敦->芝加哥,芝加哥->芝加哥)同时启动时,伦敦-芝加哥流会因为 RTT 偏差问题而被饿死,因此数据分析过程将不得不等待较慢的数据流。

b. 应用程序感知

一个流媒体视频服务器正在向许多客户端发送数据。服务器可以在任何特定时期为每个客户端选择特定的发送速率。您可能很难让 TCP 以固定速率发送数据。而使用 UDP,您必须自己完成大部分数据可靠性控制工作。此外,视频帧是时间敏感型数据,如果帧延迟太长,它将不再有用。也就是说,在这种情况下,并不需要完整的数据可靠性。

使用 UDT 库,编程工作仅仅是几行设置选项的代码。

UDT

UDT 是一个在 UDP 之上构建的、具有自身可靠性控制和流/拥塞控制的传输协议。UDT 同时提供与 TCP 非常相似的可靠数据流服务和部分可靠的消息传递。后者允许用户以指定的传递顺序和生存时间值发送消息。

UDT 在互联网参考模型的分层架构中的位置如下图所示。应用程序使用 UDT 套接字传输其数据,这些数据被传递到 UDP 套接字。(我们努力避免在这里进行一次性内存复制。)拥塞控制 (CC) 算法可以由应用程序提供;否则,将使用默认的控制算法。如果提供了用户定义的控制算法,UDT 将在发生控制事件时调用 CC 中的回调函数。

默认的 UDT 控制算法专为广域高速网络上的高性能数据传输而设计(例如,示例 a 的情况)。但是,UDT 的拥塞控制算法是可配置的,您可以轻松地添加自己的控制算法(例如,示例 b 的情况)。

UDT 提供了一套类似套接字 (socket-like) 的 API。只要您熟悉 BSD 套接字,在您的应用程序中使用 UDT 就会很简单。例如:使用 BSD 套接字,您会这样写

int s = socket(AF_INET, SOCK_STREAM, 0);

UDT 中的对应代码是

UDTSOCKET u = UDT::socket(AF_INET, SOCK_STREAM, 0);

UDT 目前是用 C++ 实现的,支持 Linux、Windows(2000、XP 及以上版本)和 OS X。当前版本是 3.0 Beta。下载 UDT 后,请阅读“readme”文件或文档以获取详细的安装和使用信息。请注意,如果您使用的是 Windows,您需要 VC7 才能编译它。使用 VC6,您将不得不自己修复一些不兼容的 C++ 语法。

如果您对该项目感兴趣,请参阅 网站了解更多信息。

© . All rights reserved.