基于UDP高性能传输协议UDT

UDP详解

一、  概述

UDT是一个高性能的基于UDP的数据传输协议,它是为支持高速广域网上海量数据传输而设计,为解决TCP的效率和公平问题,同时提供可靠的数据流和报文传输。

UDT是C++库,几乎类同于BSD socket APIs。

UDT是多线程安全的,但并不是多进程共享。

二、  原理

UDT有两种传输模式:数据流模式(SOCK_STREAM)和数据报模式(SOCK_DGRAM)

数据流模式类似于传统的BSD套接字,这种模式下不能保证任何一端一个调用就把所有的数据发送了,因为在数据流中没有边界信息,进程需用loop来发送和接收。

数据报模式会将数据作为整个单元来传送,不需要循环来接收和发送数据,要么全部发送,要么一点也不发送。在接收端如果缓冲区不够大,则只会接收到部分数据,其他的将被丢弃。

UDT发送数据有阻塞与非阻塞方式,在阻塞方式下,会直到把需要发送的数据发送完再返回,而非阻塞方式下,会根据socket底层的可用缓冲的大小,将缓冲区中的数据拷贝过去,有多大缓冲就拷贝多少,缓冲区满了就立即返回,这个时候的返回值只是拷贝了多少,不代表发送了多少,同时剩下的部分需要再次调用send

UDT增加了rendezvous模式,这是一种连接模式,用来穿透防火墙。这种模式下,UDT不能调用listen和accept,而是两端bind后同时建立连接。

UDT允许用户自己定义拥塞控制。可以继承DUT/CCC下的CCC类来改变一些变量,如拥塞窗口,./app/cc.h下的实例是学习的快速途径。

三、  安装及平台

UDT是基于源码的库,所以没有安装文件工具,我们只需要根据不同的系统和CPU架构使用命令来make相应的库即可。

UDT支持的系统:Linux,BSD,OSX

UDT支持的架构:IA32,IA64,POWERPC,AMD64

命令:  make –e os=XXX arch=XXX

UDT来源于BSD socket API只有一个头文件<udt.h>,一些继续使用BSDAPI 另一些需要加标示符UDT::

库:libudt.h      udt.dll      udt.dylib    libudt.a  udt.lib

四、  配置设置

读取和设置选项通过getsockopt和setsockopt方法,一般不要修改默认选项除非应用不能正常运行。

UDT_MSS用来设置包的大小,一般情况下最佳的UDT包的大小是网络MTU(默认1500字节)的大小,连接的两端都要设置这个值,传输时取两端的较小者。

UDT用不同的同步方式语义UDT_SNDSYN和UDT_RCVSYN,它可以独立的设置发送和接收同步,具有更多的灵活性。它不允许在连接建立和关闭的时候进行非阻塞操作。

UDT缓冲区的大小理论上越大越好,要运行的好两端buffer至少为【带宽*RTT】

UDT使用UDP数据通道,所以UDP缓冲大小影响程序运行,但随着buffer变大效果也会越来越不明显。一般来说发送端的buffer小一点,因为包的发送没有限制太多,但太大会增加端到端的延时。

UDT_LINGER是设置socket关闭时是否立即停止发送缓冲区的数据。

UDT_RENDEZVOUS设置集合点模式,在穿越防火墙时很有用。

UDT_SNDTIMEO和UDT_RCVTIMEO是timeout值

UDT_REUSEADDR设置UDP端口是否可以给其他UDT使用,默认值是true。

以下情况需设置false

1,两个UDT socket不能在同一端口监听。

2,两个UDT socket绑定在同一IP同一端口而不能建立连接。

发送发有两种选择:

1,TTL(默认无限)为timeout时间。

2,消息有序到达,直到上一个消息到达或被丢弃才发下一个。

UDT提供文件传输,UDT::sendfile和UDT::recvfile这种发送接收方式跟

UDT::send和UDT::recv是正交的。也就是说用sendfile发送不一定要用recvfile接收。另外,sendfile和recvfile不受SNDSYN,RCVSYN,SNDTIMEO,RCVTIMEO影响。它使用C++ fstream进行文件IO。

UDT打洞,在传统方式下,穿越防火墙时是用SO_REUSEADDR选项去打开两个socket绑定同一个端口,一个监听一个建立连接。而UDT提供直接相连的方式。

UDT允许一个进程中的所有socket绑定到同一端口但只允许一个监听。

UDT允许绑定已经存在的UDP端口有两个好处:

1,当应用程序向服务器发送一个空包去获得它的地址(尤其是在NAT防火墙下)时,用户会创建一个UDP包发送个server确定绑定的端口,然后UDP端口可以顺便给UDT使用。

2,一些本地防火墙在关闭“打洞”时会改变映射端口,新的UDT绑定的端口将失效,此时用UDP的是必须的。

错误处理:所有的UDT API在遇到错误时都会返回error UDT定义两种错误,

UDT::INVALID_SOCK和UDT::ERROR。可以用getErrorCode和getErrorMessage方法查看存放在ERRORINFO数据结构中的错误代码及信息。

成功的调用不会清楚错误,所以应用程序应该利用返回值检查调用结果,可以调用个体lasterror().clean()来清除错误日志。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容