基于 UDP 的协议 (UDT) 是一种高性能数据传输协议。用于广域高速网络上的分布式数据密集型应用程序。 UDT 使用 UDP 传输具有自己的可靠性控制和拥塞控制机制的批量数据。 新协议可以以比 TCP 高得多的速度传输数据。 UDT 也是一个高度可配置的框架,可以适应各种拥塞控制算法。

为什么需要使用UDT?

UDT 的最初(和主要)目的是为广域网上的分布式数据密集型应用程序提供高性能传输接口,因为效率和公平原因,TCP 很少能很好地工作。它也可以用于 TCP 不适合的其他情况(例如,多媒体流、防火墙穿孔、部分可靠性等)

没有明确的标准来确定何时使用 UDT 或何时不使用。一般来说,如果对 TCP 的性能或功能不满意,UDT 可能是你所需要的,尤其是在少量批量源共享丰富带宽的高速网络中。

UDT数据包

UDT有两种包:数据包和控制包;数据包。 它们通过第 1 位(标志位)来区分包头。

数据包头从 0 开始。包序号使用标志位之后的 31 位。 UDT 使用基于数据包的排序,即每发送一次,序列号加1数据包按照包发送的顺序。序号是将其增加到最大数量 (2^31 - 1) 后进行包装。

数据包头结构如下:


以上是发送数据包时的 32 位时间戳和目标套接字 ID。时间戳是一个相对值开始。

UDT控制包和类型信息

UDT中有8种类型的控制包和类型信息被放在标题的位域 1 - 15 中。 内容以下字段取决于数据包类型。 前 128 位必须存在于数据包头中,而可能存在空控件信息字段,取决于数据包类型。

特别是,UDT 对 ACK 数据包使用子序列。 每个 ACK 包被分配一个唯一递增的 16 位序列号,即与数据包序号无关。 ACK序列number 使用控制数据包中的第 32 - 63 位。 ACK 序列号范围从 0 到 (2^31 - 1)。

协议连接握手

握手包有如下信息(假设UDT 套接字 A 将此握手发送给 B):

Version: 32 位,UDT 版本。
Type:32 位,套接字类型(STREAM 或 DGRAM)。
Initial Sequence Number:32位,初始包序号。
MTU:32 位,最大数据包大小(包括 UDP/IP 标头)。
Flow Window:32位,最大流窗口大小。
Requested Type: 32 位,连接类型(常规或集合) 。
ID:32位,套接字ID。
SYN cookie:32 位,SYN cookie。
Peer IP Address:128位,对端UDP套接字的IP地址 。

当服务器第一次收到客户端的连接请求时,它根据客户端地址和一个密钥并将其发送回客户端。然后客户端必须发送将相同的 cookie 返回到服务器。

服务器在收到握手包和正确的cookie时,将数据包大小和最大窗口大小与其自己的值进行比较并将其自己的值设置为较小的值。

来自客户端的连接类型应设置为 1。

来自服务器的响应应设置为 -1


客户端还应该检查响应是否来自服务器原始请求已发送至。

保持活动状态


确认(ACK)

在收到 ACK 数据包时:更新最大的确认序列号。 在这个ACK中发回一个ACK序列号相同的ACK2。更新 RTT 和 RTTVar。将 ACK 和 NAK 周期都更新为 4 * RTT + RTTVar + SYN。 更新流窗口大小、更新估计的链路容量、更新发送者的缓冲区、更新发件人的丢失列表。


Ack Squence Number:32 bits,所有数据包的序号以前的数据包已经收到。
RTT (microseconds):32 位,RTT(以微秒为单位)。
RTT Variance (microseconds):32位,RTT方差。
Buffer Available (packets):32位,可用缓冲区大小(以字节为单位)。
Rate (packets/second):32 位:数据包接收率(以数据包数量计/ 每秒)。
Link Capacity (packets/second):32 位,估计的链路容量(以数据包数计/每秒) 。

否定确认 (NAK)

在收到 NAK 数据包时:将 NAK 中携带的所有序列号添加到发送者的损失中列表。

Missing Sequence Number:32位压缩丢失信息的整数数组。

关机

如果其中一个连接的 UDT 实体正在关闭,它将发送一个关闭消息给对端。对端,收到此信息后
消息,也将被关闭。

此关闭消息,使用 UDP,只发送一次,不保证能收到。

确认(ACK2)

在收到 ACK2 数据包时: 在 ACK History Window 中根据 此 ACK2 中的 ACK 序列号。更新已确认的最大 ACK 号。根据ACK2到达时间和ACK计算新的rtt出发时间。

UDT协议解析C/C++代码实现

static void dissect_udt(u_char *udt_data, int offset, int Payload_len)
{udt_conv = (udt_conversation *)malloc(sizeof(udt_conversation));if (udt_conv == NULL) {return ;}if (dissect_udt_heur(udt_data, offset, Payload_len))return ;if (is_control) {const char *typestr = val_to_str(type, udt_packet_types);switch (type) {case UDT_PACKET_TYPE_ACK:...break;case UDT_PACKET_TYPE_ACK2:...break;case UDT_PACKET_TYPE_NAK: {unsigned int max = Payload_len;if (max > UDT_MAX_NAK_LENGTH)max = UDT_MAX_NAK_LENGTH;for (i = UDT_CONTROL_OFFSET; i <= (max-4) ; i = i + 4) {uint32_t start, finish;int     is_range;is_range = ntohl(*(uint32_t*)(udt_data + offset + i)) & 0x80000000;start = get_sqn(udt_conv, ntohl(*(uint32_t*)(udt_data + offset + i)) & 0x7fffffff);if (is_range) {if (i > (max-8)) {...break;}finish = get_sqn(udt_conv, ntohl(*(uint32_t*)(udt_data + offset + i + 4)) & 0x7fffffff);...i = i + 4;} else {...}}...break;}default:...break;}}else {...}

运行结果:

总结

UDT是一种高性能数据传输协议。它专为通过高速广域网 (WAN) 大量传输大型数据集而设计。基于 UDP 的协议是 TCP 协议的一种更有效的替代方案,并且可以以更高的速度传输数据。

欢迎关注微信公众号【程序猿编码】,需要UDT协议解析完整源码的添加本人微信号(c17865354792)

参考:http://tools.ietf.org/search/draft-gg-udt-03

UDT协议解析及C/C++代码实现相关推荐

  1. TFTP协议解析及C/C++代码实现

    TFTP 用于以非常简单的方式传输文件.与其他文件传输协议(如:FTP 或 HTTP)相比,TFTP 更简单,代码量也更小,因此更易于实现. 通常,TFTP 使用 UDP 作为其传输协议.众所周知的 ...

  2. MongoDB数据库协议解析及C/C++代码实现

    MongoDB 是由 MongoDB Inc 开发的 NoSQL 数据库,它是无模式的.它是使用 c++ 和 javascript 设计和创建的,允许更高的连接性. MongoDB 是一个 NoSQL ...

  3. Oracle(TNS)协议解析及C/C++代码解析

    Oracle客户端和服务器使用TNS作为其数据交换协议. 它提供了一种对用户透明的层, 为不同的工业标准协议提供统一, 通用的接口. 基本上是TNS以这样的方式指定了端口1521上的会话是" ...

  4. MySQL协议解析及C/C++代码实现

    MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...

  5. SMTP协议解析及C/C++代码实现

    SMTP 是一种应用层协议. 要发送邮件的客户端打开到 SMTP 服务器的 TCP 连接,然后通过该连接发送邮件. SMTP 服务器是一种永远在线的侦听模式. 一旦它侦听来自任何客户端的 TCP 连接 ...

  6. 英雄远征Erlang源码分析(5)-协议解析与玩家登录处理

    现在,客户端与服务器的连接算是正式建立了,此时用户需要做的第一件事就是登陆.不过在登录之前,我们要先研究下前后端通信的协议. 客户端与服务端建立连接后,通过提前制定好的协议进行交互.具体的协议文档在d ...

  7. iOS 边学边记 直播SRT、UDT协议详解

    什么是SRT协议? 概述 SRT协议是基于UDT的传输协议,保留了UDT的核心思想和机制,抗丢包能力强,适用于复杂的网络.在LiveVideoStack线上分享中,新浪音视频架构师 施维对SRT协议的 ...

  8. wireshark协议解析器 源码分析 封装调用

    源码分析 Wireshark启动时,所有解析器进行初始化和注册.要注册的信息包括协议名称.各个字段的信息.过滤用的关键字.要关联的下层协议与端口(handoff)等.在解析过程,每个解析器负责解析自己 ...

  9. wireshark协议解析器原理与插件编写

    工作原理 每个解析器解码自己的协议部分, 然后把封装协议的解码传递给后续协议. 因此它可能总是从一个Frame解析器开始, Frame解析器解析捕获文件自己的数据包细节(如:时间戳), 将数据交给一个 ...

最新文章

  1. Java中的增强for循环的实现原理与坑
  2. linux安全体系分析与编程pdf下载,linux内核printk调试(摘录《Linux安全体系分析与编程》)...
  3. 华为: 即将发布5G+VR的颠覆式智能眼镜
  4. CSS魔法堂:你一定误解过的Normal flow
  5. 【Java】猜数字小游戏设计由浅入深
  6. 线上频繁发生Full GC 如何调优?如何快速定位OOM、cpu飙升、线程死锁等问题
  7. 为什么显卡更新换代极快,每年都会有更强的新系列,而声卡却永远停留在了“兼容DX9的集成声卡“?
  8. 关于C#窗体程序dataGridView控件的用法
  9. 关于 sinc函数和rect函数 傅里叶变换的思考
  10. IELTS11 Test2 laws are needed to make people recycle more of their waste
  11. 很多人不理解这个参数的 nl,nh:ESC * m nL nH d1... dk
  12. 个人web前段学习心得
  13. pandas之美国2012年总统候选人政治献金数据分析
  14. 程序人生-hit计统大作业
  15. Tomat介绍--1
  16. CCIG:智能文档处理「新未来」
  17. Mathon 的快捷键
  18. Odoo产品分析 (三) -- 人力资源板块(5) -- 出勤(1)
  19. 浙江大华流媒体服务器型号,大华DAHUA网络视频存储服务器DH-EVS7024S-DY产品中心_DAV数字音视工程网...
  20. 数据分析方法和思维—RFM用户分群

热门文章

  1. 淘宝/天猫API接口,买家卖家订单信息获取
  2. 爱点击ICLK.US增持畅移,深度协同催生更多增长机会
  3. 计算机防火墙不能更改,win7无法更改防火墙设置提示系统报错怎么办
  4. FBI查封泄露数据售卖网站WeLeakInfo.com
  5. java 百万级数据处理_一次性查询百万级数据应该怎么处理?
  6. java二维数组遍历与元素查找
  7. 个人计算机cache是什么意思,cache在计算机中的作用是什么?
  8. Vue生命周期中mounted和created的区别
  9. Windows程序开机自启动
  10. 企业微信消息多久可以撤回?企业微信怎么查看撤回的消息?