[Udt-java-commits] SF.net SVN: udt-java:[22] udt-java/trunk/src
Status: Alpha
Brought to you by:
bschuller
From: <bsc...@us...> - 2010-04-21 20:36:43
|
Revision: 22 http://udt-java.svn.sourceforge.net/udt-java/?rev=22&view=rev Author: bschuller Date: 2010-04-21 20:36:36 +0000 (Wed, 21 Apr 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/receiver/PacketPairWindow.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-21 15:45:00 UTC (rev 21) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-21 20:36:36 UTC (rev 22) @@ -7,62 +7,61 @@ import udt.util.UDTStatistics; import udt.util.Util; +/** + * default UDT congestion control.<br/> + * + * The algorithm is adapted from the C++ reference implementation. + */ public class UDTCongestionControl implements CongestionControl { private static final Logger logger=Logger.getLogger(UDTCongestionControl.class.getName()); private final UDTSession session; - + private final UDTStatistics statistics; - + //round trip time in microseconds private long roundTripTime=2*Util.getSYNTime(); - + //rate in packets per second private long packetArrivalRate=0; - + //link capacity in packets per second private long estimatedLinkCapacity=0; - - long maxControlWindowSize=128; // Packet sending period = packet send interval, in microseconds private double packetSendingPeriod=1; + // Congestion window size, in packets private long congestionWindowSize=16; - - //number of packets to be increased in the next SYN period - private double numOfIncreasingPacket; - + //last rate increase time (microsecond value) long lastRateIncreaseTime=Util.getCurrentTime(); - + /*if in slow start phase*/ boolean slowStartPhase=true; - + /*last ACKed seq no*/ long lastAckSeqNumber=-1; - + /*max packet seq. no. sent out when last decrease happened*/ private long lastDecreaseSeqNo; - //value of packetSendPeriod when last decrease happened - long lastDecreasePeriod; - //NAK counter - long nACKCount=1; - + private long nACKCount=1; + //number of decreases in a congestion epoch long decCount=1; - + //random threshold on decrease by number of loss events long decreaseRandom=1; - + //average number of NAKs per congestion long averageNACKNum; - boolean loss=false; - + //this flag avoids immediate rate increase after a NAK + private boolean loss=false; + public UDTCongestionControl(UDTSession session){ this.session=session; this.statistics=session.getStatistics(); @@ -108,7 +107,7 @@ public double getSendInterval(){ return packetSendingPeriod; } - + /** * congestionWindowSize * @return @@ -125,7 +124,7 @@ if(slowStartPhase){ congestionWindowSize+=ackSeqno-lastAckSeqNumber; lastAckSeqNumber = ackSeqno; - + //but not beyond a maximum size if(congestionWindowSize>session.getFlowWindowSize()){ System.out.println("slow start ends on ACK"); @@ -137,7 +136,7 @@ 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) @@ -148,51 +147,51 @@ } } - //no rate increase in slow start + //no rate increase during slow start if(slowStartPhase)return; - + + //no rate increase "immediately" after a NAK if(loss){ loss=false; return; } - - //4.compute the number of sent packets to be increase in the next SYN period - //and update the send intervall - numOfIncreasingPacket=computeNumOfIncreasingPacket(); - - //4.update the send period : + + //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; //System.out.println("dec snd factor "+factor+" to "+packetSendingPeriod); - + statistics.setSendPeriod(packetSendingPeriod); } private final long PS=UDPEndPoint.DATAGRAM_SIZE; private final double BetaDivPS=0.0000015/PS; - + //see spec page 16 private double computeNumOfIncreasingPacket (){ - //link capacity and sending speed, in packets per second - double B=estimatedLinkCapacity; - double C=1000000.0/packetSendingPeriod; - - if(B<=C)return 1.0/UDPEndPoint.DATAGRAM_SIZE; - - double exp=Math.ceil(Math.log10((B-C)*PS*8)); - double power10 = Math.pow( 10.0, exp)* BetaDivPS; - double inc = Math.max(power10, 1/PS); - return inc; + //difference in link capacity and sending speed, in packets per second + double remaining=estimatedLinkCapacity-1000000.0/packetSendingPeriod; + + if(remaining<=0){ + return 1.0/UDPEndPoint.DATAGRAM_SIZE; + } + else{ + double exp=Math.ceil(Math.log10(remaining*PS*8)); + double power10 = Math.pow( 10.0, exp)* BetaDivPS; + return Math.max(power10, 1/PS); + } } - + /* (non-Javadoc) * @see udt.CongestionControl#onNAK(java.util.List) */ public void onNAK(List<Integer>lossInfo){ loss=true; - long firstBiggestlossSeqNo=lossInfo.get(lossInfo.size()-1); - + 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. */ @@ -206,12 +205,10 @@ 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) @@ -224,20 +221,19 @@ // -Update LastDecSeq lastDecreaseSeqNo = currentMaxSequenceNumber; // -Stop. - statistics.setSendPeriod(packetSendingPeriod); } - //* 3) If DecCount <= 5, and NAKCount == DecCount * DecRandom: - if(decCount<=5 && nACKCount==decCount*decreaseRandom){ + 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; } + + statistics.setSendPeriod(packetSendingPeriod); + return; } /* (non-Javadoc) Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-21 15:45:00 UTC (rev 21) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-21 20:36:36 UTC (rev 22) @@ -253,10 +253,10 @@ statistics.incNumberOfNAKReceived(); statistics.storeParameters(); - //if(logger.isLoggable(Level.FINER)){ - System.out.println("NAK for "+nak.getDecodedLossInfo().size()+" packets lost, " + if(logger.isLoggable(Level.FINER)){ + logger.finer("NAK for "+nak.getDecodedLossInfo().size()+" packets lost, " +"set send period to "+session.getCongestionControl().getSendInterval()); - //} + } return; } @@ -315,12 +315,9 @@ if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() && unAcknowledged<session.getFlowWindowSize()){ -// if(lastSentTime>0 && Util.getCurrentTime()-lastSentTime<snd){ -// statistics.incNumberOfCCSlowDownEvents(); -// return; -// } + if(sendQueue.size()==0){ - Thread.yield(); + //Thread.yield(); return; } DataPacket dp=sendQueue.poll(20,TimeUnit.MILLISECONDS); @@ -340,10 +337,12 @@ //wait double snd=session.getCongestionControl().getSendInterval(); long passed=Util.getCurrentTime()-iterationStart; + int x=0; while(snd-passed>0){ - //busy wait, but we cannot wait with microsecond precision + if(x++==0)statistics.incNumberOfCCSlowDownEvents(); + //we cannot wait with microsecond precision if(snd-passed>750)Thread.sleep(1); - statistics.incNumberOfCCSlowDownEvents(); + else Thread.yield(); passed=Util.getCurrentTime()-iterationStart; } @@ -394,8 +393,9 @@ return largestSentSequenceNumber>=sequenceNumber; } + boolean haveLostPackets(){ - return senderLossList.isEmpty(); + return !senderLossList.isEmpty(); } /** Modified: udt-java/trunk/src/main/java/udt/receiver/PacketPairWindow.java =================================================================== --- udt-java/trunk/src/main/java/udt/receiver/PacketPairWindow.java 2010-04-21 15:45:00 UTC (rev 21) +++ udt-java/trunk/src/main/java/udt/receiver/PacketPairWindow.java 2010-04-21 20:36:36 UTC (rev 22) @@ -79,7 +79,6 @@ } } double res=total/count; - //System.out.println("median: "+median+" filtered "+res); return res; } Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-21 15:45:00 UTC (rev 21) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-21 20:36:36 UTC (rev 22) @@ -31,7 +31,6 @@ *********************************************************************************/ package udt.sender; -import java.util.Iterator; import java.util.concurrent.PriorityBlockingQueue; /** Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-21 15:45:00 UTC (rev 21) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-21 20:36:36 UTC (rev 22) @@ -20,7 +20,7 @@ boolean running=false; //how many - int num_packets=200; + int num_packets=100; //how large is a single packet int size=1*1024*1024; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |