UDT内部代码分析

一. 报文发送

1.CSndQueue::worker中调用CChannel::sendto发送数据报文。

2.CSndQueue::sendto中调用CChannel::sendto发送其他报文, 种类较多主要有:

1)CUDT::connect中调用CSndQueue::sendto发送建立连接请求。

2) CUDT::sendCtrl中调用CSndQueue::sendto发送控制报文。

       3) CUDT::listen对客户端过来的连接建立握手包给予应答,也是调用CSndQueue::sendto发送报文。

二. 报文接收

CRcvQueue::worker 是所有报文的接收函数,调用CChannel::recvfrom从网络上接收报文。

对收到的包分别处理:

1)     Rendezvous类型的连接请求包和建立过程包都会调用 CRcvQueue::storePkt 缓存起来;  UDT::connect 中有一个接收点,调用CRcvQueue::recvfrom从这个缓冲区里面取. 非Rendezvous类型的连接请求和建立过程包会交给m_pListener的CUDT::listen处理。

2)     根据目的socketID能查到已经建立好的连接,这样的包还分数据包和控制包两种,分别调用 CUDT::processData , CUDT::processCtrl加以处理.

三. 定时器控制

1. 定时器变量和数值

CTimer::rdtsc在Linux下返回的是微秒(即1/ 1000000秒); 而在windows下则返回一个高精度计数,s_ullCPUFrequency为每微妙高精度计数个数。

经换算,一些变量的默认值:

m_ullSYNInt : 10ms

m_ullACKInt: 10ms 含义应该是一旦收到数据包,那么最多10ms后就会发出ACK

m_iRTT: 初始网络RTT为100ms

m_iRTTVar:  初始RTT变幅为 50ms

m_ullNAKInt:  m_iRTT+4×m_iRTTVar 因此初始值为300ms

m_ullMinEXPInt: 初始值为100ms

 

2. 定位器处理

       定时器处理和接收处理共用线程CRcvQueue::worker。底层socket在linux下被设置成了非阻塞,windows下是设置了1ms接收超时, 因此接收处于不断查询中,每接收一次返回处理后就进入定时器处理,调用的是CUDT::checkTimers, 主要的处理:

1) 确认应答(ACK)

       如果超过设定的下次应答时间,或者连续接收到的数据包数超过设定的应答间隔,发送应答包ACK, 发送之后更新下次应答时间,把连续接收数据包的计数清零。

       如果通过CCC设置的应答时间间隔和应答个数间隔都非常大,流程看还会每m_iSelfClockInterval(64)个包发一次应答.

2)     定应答(NAK)

如果有丢包,并且超过设定的下否定应答时间,则发送NAK, 并且更新时间。

3)     到期(老化)处理

如果超过设定的下次到期时间

1)连续16次超时并且,总无应答时间超过10秒,则关闭连接。

2)将发出后没有收到应答的包序号填入丢失列表,并马上触发重发

3)如果没有包在发送,则发送keep-alive包

4)到期次数加1,最小到期间隔根据到期次数加大间隔(倍速增长),保证最小为100ms.

更新下次到期时间.

5) 相关流程

到期次数m_iEXPCount在收到数据或者控制包后都会重置为1,同时下次到期时间也会被更新。一旦长时间无应答,m_iEXPCount就会持续增加,直到连接老化。

 

四. 报文缓存buffer组织及窗口机制

       CCC窗口参数m_dCWndSize对应的内部变量是CUDT. m_dCongestionWindow, 在CUDT::packData函数内,这个变量起到了流控的作用(同时另外一个起流控作用的参数是m_dPktSndPeriod,控制发包之间的间隔时间(因为windows下使用的定时器精确度在15ms左右,因此实际上导致如果发包间隔不为0,则发包间隔一定大于这个值,因此更合理的是按每秒发包个数来控制). UDTsocket设置UDT_SNDBUF参数则控制了发送缓冲区的大小,发送缓冲区不够时,如果设置了非同步方式,则失败返回;阻塞式连接情况下,如果设置了发送超时,则超时返回,否则一直阻塞。

       而接收缓冲区一旦不够用时,UDT会把通道内的包接收起来直接丢弃,其影响相当于网络丢包。

 

五. UDT线程

       总共三个线程, 执行函数分别是:

CSndQueue::worker : 发送处理

CRcvQueue::worker: 接收和定时器处理

CUDTUnited::garbageCollect: 垃圾(如残连接)清理

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADC采样效应及相关影响解剖

在前述文章,BUCK电路模拟补偿器的数字化过程 ,我们讨论了模拟补偿器的数字化,事实上,数字化过程的第一个重要的环节就是ADC对反馈量的采样,本文就重点探讨一下由于ADC采样频率带来的一些问题,进而讨论一下相…

2012.2.9日晚亚马逊的一个错误链接截图

1现在时间 2 问题链接 http://www.amazon.cn/%E5%81%A5%E8%BA%AB%E5%99%A8%E6%A2%B0/b/refsa_menu_sef7?ieUTF8&node42787071 3 点击后结果 http://www.amazon.cn/gp/product/B0073RWUQA/refs9_hps_bw_g200_ir05?pf_rd_mA1AJ19PSB66TGU&pf_rd_scenter-5&pf_rd_r0…

Kotlin 的 Array 转 List

Kotlin 的 Array 转 List array.toList() as List<T> 1Kotlin 的 Array 转 ArrayList array.toList() as ArrayList<String>转载于:https://www.cnblogs.com/weizhxa/p/10068944.html

[转]关于sizeof()的一些思考

关键字&#xff1a;sizeof&#xff0c;字节对齐&#xff0c;多继承&#xff0c;虚拟继承&#xff0c;成员函数指针 前向声明&#xff1a; sizeof&#xff0c;一个其貌不扬的家伙&#xff0c;引无数菜鸟竟折腰&#xff0c;小虾我当初也没少犯迷糊&#xff0c;秉着“辛苦我一个…

RCF的优势--分布式应用

RCF(远程调用框架)是一个可以移植的C进程间通信框架&#xff0c;使用C语言特性&#xff0c;提供了一个简单高效的编写分布式C软件的途径。RCF利用编译时多态清晰分开了接口和实现. 和传统的RPC框架如CORBA,DCOM,.NETRemoting,WCF,WS-*,等所支持的面向对象方式不一样&#xff0c…

深漂结束

早上起来看了勇士和凯尔特人的比赛&#xff0c;勇士还不能适应凯尔特人的防守&#xff0c;除了防守之外&#xff0c;凯尔特人这场比赛的三分球着实太高了。说到篮球&#xff0c;突然想起一个刚离开深圳去惠州工作的朋友。上周二中午&#xff0c;吃饭的时候我打开手机&#xff0…

RS 学习笔记 3-1

3-1 fence climb onto/jump off salad towel napkin ladder 转载于:https://blog.51cto.com/mingii/776041

JS的八大数据类型

js中的数据类型&#xff0c;包括基本数据类型&#xff08;Number,String,Boolean, Undefined,Null&#xff09;和 复杂&#xff08;引用&#xff09;数据类型&#xff08;Object,Array,Function&#xff09; 基本数据类型 基本数据类型指的是简单的数据段 &#xff08;Number,S…

嵌入式软件是这样debug的

【单步调试】【多线程调试】调试过多线程的都懂的。【断点调试】【递归调试】调试过递归代码的都有这种耳鸣目眩的感觉。【老旧代码调试】对于早期已经缝缝补补的庞大软件代码进行调试&#xff0c;还不如推倒重来。【生产中代码调试】【用户等待调试结果】【掩耳盗铃式调试】【…

可以直接在C++里面写类似RSL的shader了

可以直接在C里面写类似RSL的shader了 今天我搞定了一个新技术 可以直接在C里面写类似RSL的shader了 我简要介绍一下这个新技术&#xff0c;我还在考虑是否要在我们的项目中应用 这个技术的优势是可以借助现有的C编译器&#xff0c;将shader直接编译成机器码执行&#xff0c;这样…

UDT中select异常

转载&#xff1a;http://blog.csdn.net/seebit/article/details/6050428 select, selectEx的参数采用了stl的容器&#xff0c;在DLL方式下&#xff0c;会发生异常。 select传入的容器内的对象在DLL内部发生释放操作时&#xff0c;会抛出异常&#xff0c;因为主程序和DLL申请的内…

iOS中有两种支持机制:Notification和KVO(Key-Value Observing)

KVO是iOS中的一个核心概念&#xff0c;简单理解就是&#xff1a;关注Model某个数据&#xff08;Key&#xff09;的对象可以注册为监听器&#xff0c;一旦Model某个Key的Value发生变化&#xff0c;就会广播给所有的监听器&#xff08;http://blog.chinabyte.com/a/1557371.html&…

Apache与Tomcat有什么关系和区别

常在用apache和tomcat等这些服务器&#xff0c;可是总感觉还是不清楚他们之间有什么关系&#xff0c;在用tomcat的时候总出现apache&#xff0c;总感到迷惑&#xff0c;到底谁是主谁是次&#xff0c;因此特意在网上查询了一些这方面的资料&#xff0c;总结了一下&#xff1a; …

“电脑人才”是怎么炼成的

好长一阵子没有写什么了&#xff0c;其实自己一直想一些电脑方面的书籍&#xff0c;希望给那些想要学习&#xff0c;而没有人指点的朋友们做个参考&#xff0c;或者给那些低学历的朋友做指导&#xff0c;总之希望把不要像我走了那么多弯路。可惜的是要生存&#xff0c;要工作&a…

UDT源代码下载链接

对UDT有兴趣的可以下载UDT对应的源码进行研究&#xff0c;下面给出了一个开源中国的连接&#xff1a; UDT最新源码下载地址&#xff1a;http://sourceforge.net/projects/udt/files/latest/download?sourcedirectory.

声音与年龄

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;最近一年一直从事音频相关的工作&#xff0c;今天刚好看到卓老师的一篇和声音相关的文章&#xff0c;分享给大家。摘要&#xff1a;今天布置了这学期信号与系统的小论文作业。有参加了上海中学生的科技节作品评选。他们的一…

深入Django(1): 通用视图 (generic views)

如果对Django的基础部分尚不熟悉&#xff0c;请参考《Django实战》系列。 内容提要 1. 回顾Django的视图函数&#xff08;view function&#xff09; 2. 在视图函数中使用模板 3. 简化视图函数的两个工具 4. 使用通用视图函数 5. Django提供的通用视图 1. 回顾Django的视图函数…

系统字体的Regular、Light等几种名称的区别

以苹果系统中的PingFang SC系列字体为例&#xff0c;其中常见的有下面几种类型可以细分如下。 PingFang SC ExtraLight 苹方 特细 PingFang SC Light 苹方 细体 PingFang SC Regular 苹方 常规 PingFang SC Medium 苹方 中等 Pi…

J2EE WEBWORK FRAMEWORK安全隐患

TEAM : I.S.T.OAUTHOR : KJ021320转载需注明作者,未经作者同意,不得用于任何形式的商业活动 WebWork是由OpenSymphony组织开发的&#xff0c;致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。框架本身就是抽象空实现的&#xff01;一般很少会给程序带来0day漏洞,但是因为W…

使用 servlet 连接数据库

1.项目工程 web.xml 配置 1 <servlet> 2 <description>This is the description of my J2EE component</description> 3 <display-name>This is the display name of my J2EE component</display-name> 4 <servlet-name>DBSer…