`
jimmee
  • 浏览: 539979 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

UDT协议-基于UDP的可靠数据传输协议的实现分析(7)-流量和拥塞控制

阅读更多

流量控制
 
对于一个带宽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实现源码

    UDT协议的源码分析可以帮助我们深入理解其工作原理,如何在不牺牲可靠性的前提下实现高效的UDP数据传输。通过阅读源码,我们可以学习到如何设计和实现一个高性能的传输层协议,这对于网络编程和大数据传输领域的研究...

    UDT协议-基于UDP的可靠数据传输协议.docx

    UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,设计目的是为了解决在高带宽延迟乘积(Bandwidth-Delay Product, BDP)环境中,传统的TCP协议效率低下的问题。...

    UDT协议-基于UDP的可靠数据传输协议.pdf

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计用于解决在高带宽时延乘积(BDP)网络环境下的传输效率和公平性问题。传统的TCP协议在BDP较大时表现不佳,因为其拥塞...

    UDT协议-基于UDP的可靠数据传输协议 (2).pdf

    UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,主要设计用于处理高带宽时延乘积(BDP)环境下的高效数据传输。在传统的TCP协议中,由于Additive Increase ...

    UDT协议-基于UDP的可靠数据传输协议 (2).docx

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计初衷是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务,尤其适用于大数据量传输场景,如网格...

    UDT-基于UDP的可靠数据传输协议【中文版】

    另一个重要的应用场景是,允许网络研究人员、学生和应用程序开发人员在UDT框架下轻松地实现和部署新的数据传输算法和协议。此外,UDT也可用于更好地支持防火墙穿透。 UDT完全构建在UDP之上。但是,UDT是有连接的,...

    udt UDT网络传输协议开源包,是基于UDP的可靠传输协议

    7. **API设计**:UDT提供了用户友好的API,使得开发者能够方便地集成到自己的应用程序中,进行可靠的UDP数据传输。 总的来说,UDT协议在保持UDP的高效性的同时,提供了类似TCP的可靠性,是那些对传输速度和可靠性都...

    UDT协议基于UDP的可靠数据传输协议.pdf

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计目的是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务。传统的TCP协议在面对高BDP时表现不佳...

    udt-java 可靠UDP传输 源码

    UDT(UDP-based Data Transfer Protocol)是为了解决TCP在大数据传输时的效率问题而设计的一种用户数据报协议(UDP)上的可靠传输协议。UDT的设计目标是在保持UDP的低延迟和高带宽利用率的同时,提供类似TCP的可靠性...

    基于UDP的可靠传输(停等协议)

    通过这种方式,虽然基础是不可靠的UDP协议,但通过应用层的停等协议,我们可以实现可靠的数据传输,保证了数据的正确性和完整性,适用于对实时性要求较高但又需要基本可靠性的场景。在实际应用中,还可以考虑优化,...

    UDT协议UDP可靠数据传输协议.pdf

    UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议。UDP本身是一种无连接的、不可靠的传输协议,它不保证数据的顺序和完整性,也不进行拥塞控制。然而,UDT针对UDP的这些不足...

    UDT协议UDP可靠数据传输协议.docx

    UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议,设计用于在高带宽时延乘积(Bandwidth-Delay Product, BDP)环境中提供高效、公平和稳定的传输服务。传统的TCP协议在面对...

    udt 基于udp的可靠连接

    UDT(UDP-based Data Transfer Protocol)是一种用于高速数据传输的协议,它建立在用户数据报协议(UDP)之上,但提供了TCP(传输控制协议)类似的可靠性。UDT的设计目标是解决在大规模网络环境下,尤其是互联网上的...

    基于UDP的高速传输协议--UDT.zip

    UDT结合了UDP的低延迟和TCP的可靠性,通过引入一系列优化技术,实现了在不可靠的UDP基础上实现可靠的数据传输。 1. **UDT的可靠性机制** UDT采用了类似TCP的序列号和确认机制,确保数据包按序到达且无丢失。同时,...

    udt源码 udp可靠性传输

    UDT(UDP-based Data Transport)是一种专为大数据传输设计的开源传输协议,它构建于用户数据报协议(UDP)之上,旨在提供比TCP更高效、更可靠的传输服务。UDT结合了UDP的低延迟和高带宽利用率特性,并通过自定义的...

    基于UDP的高速传输协议UDT4 详解

    UDT(UDP-based Data Transfer Protocol)是一种专为高带宽时延乘积网络设计的传输协议,它在TCP(Transmission Control Protocol)的基础上进行了优化,旨在提高数据传输速度和效率。UDT4是UDT协议的第四个版本,...

    UDT-C,UDT库C语言版本

    UDT旨在提供类似TCP的可靠性和拥塞控制,但同时保持UDP的低延迟和高吞吐量特性,这使得UDT特别适合于大数据传输、实时流媒体和高性能计算等领域。 UDT-C是UDT协议的C语言实现版本,它提供了C语言接口,方便开发者在...

    udt 4.8 基于udp的可靠通讯

    与TCP相比,UDP不提供流控制、拥塞控制和连接管理等服务,这使得它在某些实时性要求高的应用场景中更受欢迎,如视频会议、在线游戏或大数据传输。然而,UDP的不可靠性(如数据包可能丢失、重复或乱序)限制了它的...

Global site tag (gtag.js) - Google Analytics