UDT协议实现分析总结

Wesley13
• 阅读 781

UDT的整体结构

UDT Socket是UDT中的核心,同时它也是一座桥梁,它将UDT的使用者应用程序与内部实现部分对于数据结构的管理、网络数据的传输连接起来。

应用程序通过它将数据放进发送缓冲待发送,或者借由它来获取从网络接收数据。而与网络进行交互的部分,则从它那里拿到要发送的数据进行发送,或者在收到packet时将packet dispatch给它。

UDT的数据接收部分框架:

UDT协议实现分析总结

UDT的数据发送部分框架:

UDT协议实现分析总结

UDT的一些问题

1. 接口的合理性。

分析了UDT的这许多code,给人的感觉就是,socket接口设计的似乎并不是特别的合理。socket的两种类型,即用于进行数据传输的socket和服务器端用于接受连接的socket,两者之间的差别非常的明显。它们所能提供的操作,它们的状态转换过程都很不一样,服务器端用于接受连接的socket支持listen和accept操作,而用于进行数据收发的socket则不支持;同样用于进行数据收发的socket支持send和recv,服务器端用于接受连接的socket则不支持。但当前的socket接口统一用一个socket来表示。也就是有多种其实毫不相干的职责都被堆在一个socket结构上了。

socket接口这样的设计所带来的问题就是使用起来比较容易混淆,对用户的友好度比较低。即在执行某个操作之后才能通过返回值检测出来,而不能在调用函数时,就通过编译error之类的提前报出来。而实现起来呢,则不得不增添许多额外的状态检查,大大增加了实现的复杂度。

2. 有些地方存在大段大段的重复code。

比如CUDTUnited::updateMux()函数,CUDTUnited的两个bind()函数之间,CUDT::sendmsg()和CUDT::send()中等待发送缓冲区有空间部分的code,CUDT中两个connect()函数中初始化CUDT的操作等等。

3. 在CUDT中竟然用了m_bOpened,m_bListening等8个bool变量来表示UDT Socket的状态,这使得状态管理的复杂度大为增加。

4. Code中还是有一些历史遗留问题,比如DelayWarning/CongestionWarning消息,定时器中对于NAK消息的发送等,这些机制被移除掉,但是又被移除的不是很彻底。

5. 消息类型这种本应该定义为enum或者类似的东西的常量,却是magic number满天飞。

在github上建了一个repo,https://github.com/hanpfei/hudt,目前基本上还是原始的UDT code,后面有机会了希望能有人一起改善现有UDT的一些问题。

Done。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
UDT协议实现分析——bind、listen与accept
UDTServer启动之后,基于UDT协议的UDP数据可靠传输才成为可能,因而接下来分析与UDTServer有关的几个主要API的实现,来了解下UDTServer是如何listening在特定UDP端口上的。主要有UDT::bind(),UDT::listen()和UDT::accept()等几个函数。bind过程通常UDTSe
Wesley13 Wesley13
2年前
UDT协议实现分析——数据的接收
看了UDT中数据发送的部分之后,我们转换一个角度,来看一下接收端发生的故事。如我们前面在UDT协议实现分析——连接的建立(http://my.oschina.net/wolfcs/blog/505253)一文中看到的那样,CUDT在connect()的后半场,会通过调用CRcvQueue::removeConnector()把它自己从它的CCha
Wesley13 Wesley13
2年前
UDT协议实现分析——UDT初始化和销毁
UDT协议是一个用于在高速Internet上传输大量数据的基于UDP的可靠传输协议。我们可以将UDT协议的实现看作一个比较复杂的状态机。更准确的说,是一个主状态机,外加多个子状态机。主状态机是指协议实现中全局唯一、全局共享的状态与数据结构,主要对应于CUDTUnited类。子状态机则是对于一次UDT连接或一个Listening的UDTServer的抽象
Wesley13 Wesley13
2年前
UDT协议实现分析——发送窗口大小及发送速率的调整
UDT主要通过在数据收发的过程中进行精细的控制来实现对于网络带宽更加有效的利用,并使网络中数据传输的速率尽可能快。如我们前面在分析数据发送的控制(http://my.oschina.net/wolfcs/blog/508259)中看到的,对于正常的顺序packet发送,发送控制主要在于两个方面,一是发送窗口的大小,也就是某个时刻已经发送但未得到相
Wesley13 Wesley13
2年前
UDT协议实现分析——数据的发送
连接建立起来之后,我们就可以通过UDTSocket进行数据的收发了。先来看用来发送数据的几个函数。UDT提供了如下的几个函数用于不同目的下的数据发送:UDT_APIintsend(UDTSOCKETu,constcharbuf,intlen,intflags);UDT_APIintsendmsg(U
Wesley13 Wesley13
2年前
UDT协议实现分析——UDT数据收发的可靠性保障
不管是数据的发送还是数据的接收,大体的流程我们基本上是都理了一下,还分析了数据收发过程中用的数据结构,接下来就看一些UDT中数据收发更精细的一些控制。UDT数据收发的可靠性保障来看一下UDT中数据收发的可靠性保障。接收包丢失列表CRcvLossList先来看一下CRcvLos
Stella981 Stella981
2年前
Linux应急响应(二):捕捉短连接
0x00前言​短连接(shortconnnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。在系统维护中,一般很难去察觉,需要借助网络安全设备或者抓包分析,才能够去发现。0x01应急场景​
Wesley13 Wesley13
2年前
UDT协议实现分析——数据发送控制
在前文(http://my.oschina.net/wolfcs/blog/506021)中,我们有看到,数据发送的过程,大体是发送者CUDT将要发送的数据放进它的CSndBufferm\_pSndBuffer,并将它自己添加进它的CSndQueuem\_pSndQueue的CSndUListm\_pSndUList的堆里,后面CSndQueue