流量控制
对于一个带宽1Gbps, RTT为100ms的网络来说
BDP=1,000,000,000*0.1/8=12,500,000字节=12207K=12M
传统TCP接收窗口大小=65535byte=64K, 显然满足不了
udt使用包大小1500byte, 默认接口窗口大小为8192, 因此
接收窗口的大小为=1500*8192=12,288,000字节=12000K=11.7M
因此, 可以看到udt的默认设置已经足够.
Congestion Control(拥塞控制)
1. 两个重要的参数:
congestion window size and the inter-packet sending interval
2. 主要的接口
1) init: when the UDT socket is connected.
2) close: when the UDT socket is closed.
3) onACK: when ACK is received.
4) onLOSS: when NACK is received.
5) onTimeout: when timeout occurs.
6) onPktSent: when a data packet is sent.
7) onPktRecv: when a data packet is received.
3. udt的拥塞算法:
On ACK packet received:
1) If the current status is in the slow start phase, set the
congestion window size to the product of packet arrival rate and
(RTT + SYN). Slow Start ends. Stop.
2) Set the congestion window size (CWND) to: CWND = A * (RTT + SYN) +
16.
3) The number of sent packets to be increased in the next SYN period
(inc) is calculated as:
if (B <= C)
inc = 1/PS;
else
inc = max(10^(ceil(log10((B-C)*PS*8))) * Beta/PS, 1/PS);
where B is the estimated link capacity and C is the current
sending speed. All are counted as packets per second. PS is the
fixed size of UDT packet counted in bytes. Beta is a constant
value of 0.0000015.
4) The SND period is updated as:
SND = (SND * SYN) / (SND * inc + SYN).
*/ public void onACK(long ackSeqno){ //increase window during slow start if(slowStartPhase){ congestionWindowSize+=ackSeqno-lastAckSeqNumber; lastAckSeqNumber = ackSeqno; //but not beyond a maximum size if(congestionWindowSize>session.getFlowWindowSize()){ slowStartPhase=false; if(packetArrivalRate>0){ packetSendingPeriod=1000000.0/packetArrivalRate; } else{ packetSendingPeriod=(double)congestionWindowSize/(roundTripTime+Util.getSYNTimeD()); } } }else{ //1.if it is not in slow start phase,set the congestion window size //to the product of packet arrival rate and(rtt +SYN) double A=packetArrivalRate/1000000.0*(roundTripTime+Util.getSYNTimeD()); congestionWindowSize=(long)A+16; if(logger.isLoggable(Level.FINER)){ logger.finer("receive rate "+packetArrivalRate+" rtt "+roundTripTime+" set to window size: "+(A+16)); } } //no rate increase during slow start if(slowStartPhase)return; //no rate increase "immediately" after a NAK if(loss){ loss=false; return; } //4. compute the increase in sent packets for the next SYN period double numOfIncreasingPacket=computeNumOfIncreasingPacket(); //5. update the send period double factor=Util.getSYNTimeD()/(packetSendingPeriod*numOfIncreasingPacket+Util.getSYNTimeD()); packetSendingPeriod=factor*packetSendingPeriod; //packetSendingPeriod=0.995*packetSendingPeriod; statistics.setSendPeriod(packetSendingPeriod); }
On NAK packet received:
1) If it is in slow start phase, set inter-packet interval to
1/recvrate. Slow start ends. Stop.
2) If this NAK starts a new congestion period, increase inter-packet
interval (snd) to snd = snd * 1.125; Update AvgNAKNum, reset
NAKCount to 1, and compute DecRandom to a random (average
distribution) number between 1 and AvgNAKNum. Update LastDecSeq.
Stop.
3) If DecCount <= 5, and NAKCount == DecCount * DecRandom:
a. Update SND period: SND = SND * 1.125;
b. Increase DecCount by 1;
c. Record the current largest sent sequence number (LastDecSeq).
/* (non-Javadoc) * @see udt.CongestionControl#onNAK(java.util.List) */ public void onLoss(List<Integer>lossInfo){ loss=true; long firstBiggestlossSeqNo=lossInfo.get(0); nACKCount++; /*1) If it is in slow start phase, set inter-packet interval to 1/recvrate. Slow start ends. Stop. */ if(slowStartPhase){ if(packetArrivalRate>0){ packetSendingPeriod = 100000.0/packetArrivalRate; } else{ packetSendingPeriod=congestionWindowSize/(roundTripTime+Util.getSYNTime()); } slowStartPhase = false; return; } long currentMaxSequenceNumber=session.getSocket().getSender().getCurrentSequenceNumber(); // 2)If this NAK starts a new congestion epoch if(firstBiggestlossSeqNo>lastDecreaseSeqNo){ // -increase inter-packet interval packetSendingPeriod = Math.ceil(packetSendingPeriod*1.125); // -Update AvgNAKNum(the average number of NAKs per congestion) averageNACKNum = (int)Math.ceil(averageNACKNum*0.875 + nACKCount*0.125); // -reset NAKCount and DecCount to 1, nACKCount=1; decCount=1; /* - compute DecRandom to a random (average distribution) number between 1 and AvgNAKNum */ decreaseRandom =(int)Math.ceil((averageNACKNum-1)*Math.random()+1); // -Update LastDecSeq lastDecreaseSeqNo = currentMaxSequenceNumber; // -Stop. } //* 3) If DecCount <= 5, and NAKCount == DecCount * DecRandom: else if(decCount<=5 && nACKCount==decCount*decreaseRandom){ // a. Update SND period: SND = SND * 1.125; packetSendingPeriod = Math.ceil(packetSendingPeriod*1.125); // b. Increase DecCount by 1; decCount++; // c. Record the current largest sent sequence number (LastDecSeq). lastDecreaseSeqNo= currentMaxSequenceNumber; } statistics.setSendPeriod(packetSendingPeriod); return; }
相关推荐
UDT协议的源码分析可以帮助我们深入理解其工作原理,如何在不牺牲可靠性的前提下实现高效的UDP数据传输。通过阅读源码,我们可以学习到如何设计和实现一个高性能的传输层协议,这对于网络编程和大数据传输领域的研究...
UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,设计目的是为了解决在高带宽延迟乘积(Bandwidth-Delay Product, BDP)环境中,传统的TCP协议效率低下的问题。...
UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计用于解决在高带宽时延乘积(BDP)网络环境下的传输效率和公平性问题。传统的TCP协议在BDP较大时表现不佳,因为其拥塞...
UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,主要设计用于处理高带宽时延乘积(BDP)环境下的高效数据传输。在传统的TCP协议中,由于Additive Increase ...
UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计初衷是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务,尤其适用于大数据量传输场景,如网格...
另一个重要的应用场景是,允许网络研究人员、学生和应用程序开发人员在UDT框架下轻松地实现和部署新的数据传输算法和协议。此外,UDT也可用于更好地支持防火墙穿透。 UDT完全构建在UDP之上。但是,UDT是有连接的,...
7. **API设计**:UDT提供了用户友好的API,使得开发者能够方便地集成到自己的应用程序中,进行可靠的UDP数据传输。 总的来说,UDT协议在保持UDP的高效性的同时,提供了类似TCP的可靠性,是那些对传输速度和可靠性都...
UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计目的是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务。传统的TCP协议在面对高BDP时表现不佳...
UDT(UDP-based Data Transfer Protocol)是为了解决TCP在大数据传输时的效率问题而设计的一种用户数据报协议(UDP)上的可靠传输协议。UDT的设计目标是在保持UDP的低延迟和高带宽利用率的同时,提供类似TCP的可靠性...
通过这种方式,虽然基础是不可靠的UDP协议,但通过应用层的停等协议,我们可以实现可靠的数据传输,保证了数据的正确性和完整性,适用于对实时性要求较高但又需要基本可靠性的场景。在实际应用中,还可以考虑优化,...
UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议。UDP本身是一种无连接的、不可靠的传输协议,它不保证数据的顺序和完整性,也不进行拥塞控制。然而,UDT针对UDP的这些不足...
UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议,设计用于在高带宽时延乘积(Bandwidth-Delay Product, BDP)环境中提供高效、公平和稳定的传输服务。传统的TCP协议在面对...
UDT(UDP-based Data Transfer Protocol)是一种用于高速数据传输的协议,它建立在用户数据报协议(UDP)之上,但提供了TCP(传输控制协议)类似的可靠性。UDT的设计目标是解决在大规模网络环境下,尤其是互联网上的...
UDT结合了UDP的低延迟和TCP的可靠性,通过引入一系列优化技术,实现了在不可靠的UDP基础上实现可靠的数据传输。 1. **UDT的可靠性机制** UDT采用了类似TCP的序列号和确认机制,确保数据包按序到达且无丢失。同时,...
UDT(UDP-based Data Transport)是一种专为大数据传输设计的开源传输协议,它构建于用户数据报协议(UDP)之上,旨在提供比TCP更高效、更可靠的传输服务。UDT结合了UDP的低延迟和高带宽利用率特性,并通过自定义的...
UDT(UDP-based Data Transfer Protocol)是一种专为高带宽时延乘积网络设计的传输协议,它在TCP(Transmission Control Protocol)的基础上进行了优化,旨在提高数据传输速度和效率。UDT4是UDT协议的第四个版本,...
UDT旨在提供类似TCP的可靠性和拥塞控制,但同时保持UDP的低延迟和高吞吐量特性,这使得UDT特别适合于大数据传输、实时流媒体和高性能计算等领域。 UDT-C是UDT协议的C语言实现版本,它提供了C语言接口,方便开发者在...
与TCP相比,UDP不提供流控制、拥塞控制和连接管理等服务,这使得它在某些实时性要求高的应用场景中更受欢迎,如视频会议、在线游戏或大数据传输。然而,UDP的不可靠性(如数据包可能丢失、重复或乱序)限制了它的...