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

基于UDP高性能传输协议UDT相关推荐

  1. 基于TCP的应用层协议 与基于UDP的应用层协议分别有哪些

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 基于TC ...

  2. qq服务器 udp协议,基于UDP傳输协议的实时通信系统的开发(仿qq聊天程序).doc

    基于UDP傳输协议的实时通信系统的开发(仿qq聊天程序) 基于UDP传输协议的实时通信系统的开发(仿qq聊天程序) 摘 要 互联网的高速发展正改变着人类的生活,它的多姿多彩正一点一滴的渗透到人们生活的 ...

  3. 要做个P2P应用,先收集点相关基于UDP可靠传输的资料

    因为是做一个简单的P2P应用(麻雀虽小,五脏俱全.我最喜欢做此类应用,开发周期不算长,但能学到用到很多比较新的东西),要涉及到内网NAT穿透,UDP打洞相对比较容易,所以打算用基于UDP.但本应用上传 ...

  4. kcp 协议分析 基于udp的可靠协议

    项目地址:https://github.com/skywind3000/kcp 此项目是基于c语言的 其他语言实现自行搜索 简介 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价 ...

  5. UDP可靠性传输协议(QUIC)

    目录 UDP与TCP对比 可靠性机制 ACK机制 重传机制 流控控制 序号机制 重排机制 窗口机制 UDP可靠性设计 UDP窗口流控 KCP(出于实时性考虑) QUIC 简述 优点 缺点 报文格式 建 ...

  6. JAVA初学者如何实现基于UDP和TCP协议的网络编程

    首先,我们需要先了解UDP协议.TCP协议的概念: 一.UDP协议:用户数据报协议,是一种无连接协议 二.TCP协议:文件传输协议,是一种面向连接的协议 他们都位于TCP/IP模型中的传输层,为整个网 ...

  7. 自制Linux功能板-新增功能(基于RTMP流媒体传输协议的视频监控)

    目录 一.ffmpeg工具 1.简介 2.移植相关库 二.RTMP的nginx服务器 1.简介 2.移植 三.运行测试 1.启动nginx 2.使用 FFmpeg 推流 引言:小板子能联网还有摄像头, ...

  8. 基于TCP的应用层协议、与基于UDP的应用层协议分别有哪些?

    参考:https://zhidao.baidu.com/question/337954440.html 基于TCP的有FTP.Telnet.SMTP.HTTP.POP3与DNS 基于UDP的有TFTP ...

  9. 几种常见的可靠UDP传输协议(包含C#实现)

    几种UDP网络库的整理Raknet,UDT,ENet,lidgren-network-gen3 http://blog.csdn.net/u014630768/article/details/3489 ...

最新文章

  1. MySQL 数据库常用命令—where like union 排序 分组 连接
  2. 中国计算机学科建设,计算机学科建设战略研讨会暨“十四五”规划务虚会召开...
  3. 云资源管理有助于减少服务滥用和开支
  4. python 字符串
  5. 装修好的房子多久能住 入住需要注意什么?
  6. 6 DHCPV6原理
  7. 脉宽调制功能(PWM)
  8. 谷歌hosts laod
  9. python项目实战:实现游戏敏感词汇过滤器
  10. HTML Purifier --非常好用的XSS过滤器
  11. 数据库将表的字段值查询为字段名
  12. 在HTML中把文本变成斜体的是,CSS/HTML:什么是使文本斜体的正确方法?
  13. weblogic10.3.6升级补丁时间慢的问题
  14. 利用facebook graph api发送图片
  15. 【gdgzezoi】Problem A: 玩具谜题
  16. 初次办流量卡,怎么才能区分是不是物联卡?
  17. 数据复盘 Phanta Bear和TheHeart Project:亚洲名人项目正席卷 NFT 市场
  18. 大数据程序员这9大行业上班最赚钱!
  19. winamp播放ape文件
  20. Linux--1.初识Linux(基本指令)

热门文章

  1. mysql备份还原(视图、存储过程)
  2. AutoHomeRefreshListView仿汽车之家下拉刷新 《IT蓝豹》
  3. 【iHMI43 4.3寸液晶模块】demo例程(版本1.03)发布
  4. 8大排序算法图文讲解转
  5. 好久没有写了,今天就谈谈微信吧!
  6. 数据库系统常用的存取方法
  7. armeabi和armeabi-v7a的区别
  8. 用matlab简单电路模型,基于MATLAB的电路模型仿真应用
  9. python 爬虫 包_python爬虫学习之路-抓包分析
  10. mysql集群怎么实现状态机_分布式中的状态机