原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd

                 UDT文档阅读理解

一、  概述

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()来清除错误日志。

基于UDP高性能传输协议UDT doc翻译(一)的更多相关文章

  1. Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)

    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机 ...

  2. UNIX网络编程——分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  3. 分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  4. QUIC:基于udp的传输新技术

    Google研发 https://blog.csdn.net/b2222505/article/details/79391430

  5. 网络协议之:基于UDP的高速数据传输协议UDT

    目录 简介 UDT协议 UDT的缺点 总结 简介 简单就是美.在网络协议的世界中,TCP和UDP是建立在IP协议基础上的两个非常通用的协议.我们现在经常使用的HTTP协议就是建立在TCP协议的基础上的 ...

  6. 基于udp协议的套接字及udp协议粘包问题

    udp协议的套接字 udp协议传输  服务端和客户端没有建立连接一说. import socket # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发 ...

  7. FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议

    FastSocket这个东西上次我已经说过,它使用简单,功能强大,扩展灵活,目前在新浪的生产环境中已经被广泛使用,所以它的性能,安全等各方面我们绝对可以信赖,今天我们来说一个话题,和上一讲有关,这次我 ...

  8. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  9. 【RL-TCPnet网络教程】第16章 UDP用户数据报协议基础知识

    第16章      UDP用户数据报协议基础知识 本章节为大家讲解UDP(User Datagram Protocol,用户数据报协议),需要大家对UDP有个基础的认识,方便后面章节UDP实战操作. ...

随机推荐

  1. 20145202马超《Java程序设计》第十周学习总结

    一.网络编程 1.网络概述 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据 ...

  2. PHP.TP框架下商品项目的优化1-时间插件、鼠标所在行高亮、布局规划页面

    1.优化搜索表单中按时间搜索的功能 添加一个时间插件datetimepicker,在lst.html中,注意要导入jquery.min.js,此处从前文的在线编辑器中导入 <!-- 导入 --& ...

  3. 1864: [Zjoi2006]三色二叉树

    1864: [Zjoi2006]三色二叉树 链接 分析: 做得最智障的一题了... 首先中间输出两个数之间没空格(换行居然也过了...), 写了dp[i][0/1/2],后来知道其实dp[i][0/1 ...

  4. Error:Java home supplied via 'org.gradle.java.home' is invalid

    Finally i found my solution. In the project root i found gradle.properties configure this java home ...

  5. WPFDataGrid可以编辑某列Bug,困惑已久

    这个问题困扰了好几天,最近在做DataGrid编辑列,有一个添加按钮,当我点击添加按钮的时候自动生成一行,并别生成序列号,然后按回车键完成添加,但是有一个问题就是:当我点击完添加按钮以后,然后继续添加 ...

  6. Canvas 给图形绘制阴影

    /** * 图形绘制阴影 */ function initDemo6() { var canvas = document.getElementById("demo6"); if ( ...

  7. python学习_循环结构 and 类型判断

    # 循环结构 ### 循环结构(while) - 格式 ```python while 表达式: 语句块 ``` > 执行流程:当程序执行到while语句时,首先判断表达式的真假.若表达式的值为 ...

  8. U-Net卷积神经网络

    由于项目需要,用U-NET跑一个程序来对医学影像进行分割(segmentation),因此跑去看了下这篇论文(paper),下面会介绍一下U-Net的框架及要点,如果哪里有写的不对的,或者好的建议,欢 ...

  9. Python中关于split和splitext的差别和运用

    在使用Python的过程中,在处理字符串的时候会遇到split()和os.path.split()两个函数,他们的主要区别可以概括为一个从前往后搜索字符串,后者则是从后往前搜索 '.'(reverse ...

  10. 转载:PHP 协程实现

    转自:https://newt0n.github.io/2017/02/10/PHP-%E5%8D%8F%E7%A8%8B%E5%8E%9F%E7%90%86/ 实现 PHP 协程需要了解的基本内容. ...