基于UDP传输协议的实现分析之流量和拥塞控制

UDP的概念

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

流量控制

对于一个带宽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).

Java代码

复制代码

代码如下:

<strong></strong>1.Java代码
2.*/
3.publicvoidonACK(longackSeqno){
4.//increasewindowduringslowstart
5.if(slowStartPhase){
6.congestionWindowSize+=ackSeqno-lastAckSeqNumber;
7.lastAckSeqNumber=ackSeqno;
8.//butnotbeyondamaximumsize
9.if(congestionWindowSize>session.getFlowWindowSize()){
10.slowStartPhase=false;
11.if(packetArrivalRate>0){
12.packetSendingPeriod=1000000.0/packetArrivalRate;
13.}
14.else{
15.packetSendingPeriod=(double)congestionWindowSize/(roundTripTime+Util.getSYNTimeD());
16.}
17.}
18.
19.}else{
20.//1.ifitisnotinslowstartphase,setthecongestionwindowsize
21.//totheproductofpacketarrivalrateand(rtt+SYN)
22.doubleA=packetArrivalRate/1000000.0*(roundTripTime+Util.getSYNTimeD());
23.congestionWindowSize=(long)A+16;
24.if(logger.isLoggable(Level.FINER)){
25.logger.finer("receiverate"+packetArrivalRate+"rtt"+roundTripTime+"settowindowsize:"+(A+16));
26.}
27.}
28.
29.//norateincreaseduringslowstart
30.if(slowStartPhase)return;
31.
32.//norateincrease"immediately"afteraNAK
33.if(loss){
34.loss=false;
35.return;
36.}
37.
38.//4.computetheincreaseinsentpacketsforthenextSYNperiod
39.doublenumOfIncreasingPacket=computeNumOfIncreasingPacket();
40.
41.//5.updatethesendperiod
42.doublefactor=Util.getSYNTimeD()/(packetSendingPeriod*numOfIncreasingPacket+Util.getSYNTimeD());
43.packetSendingPeriod=factor*packetSendingPeriod;
44.//packetSendingPeriod=0.995*packetSendingPeriod;
45.
46.statistics.setSendPeriod(packetSendingPeriod);
47.}

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).

Java代码

复制代码

代码如下:

1./*(non-Javadoc)
2.*@seeudt.CongestionControl#onNAK(java.util.List)
3.*/
4.publicvoidonLoss(List<Integer>lossInfo){
5.loss=true;
6.longfirstBiggestlossSeqNo=lossInfo.get(0);
7.nACKCount++;
8./*1)Ifitisinslowstartphase,setinter-packetintervalto
9.1/recvrate.Slowstartends.Stop.*/
10.if(slowStartPhase){
11.if(packetArrivalRate>0){
12.packetSendingPeriod=100000.0/packetArrivalRate;
13.}
14.else{
15.packetSendingPeriod=congestionWindowSize/(roundTripTime+Util.getSYNTime());
16.}
17.slowStartPhase=false;
18.return;
19.}
20.
21.longcurrentMaxSequenceNumber=session.getSocket().getSender().getCurrentSequenceNumber();
22.//2)IfthisNAKstartsanewcongestionepoch
23.if(firstBiggestlossSeqNo>lastDecreaseSeqNo){
24.//-increaseinter-packetinterval
25.packetSendingPeriod=Math.ceil(packetSendingPeriod*1.125);
26.//-UpdateAvgNAKNum(theaveragenumberofNAKspercongestion)
27.averageNACKNum=(int)Math.ceil(averageNACKNum*0.875+nACKCount*0.125);
28.//-resetNAKCountandDecCountto1,
29.nACKCount=1;
30.decCount=1;
31./*-computeDecRandomtoarandom(averagedistribution)numberbetween1andAvgNAKNum*/
32.decreaseRandom=(int)Math.ceil((averageNACKNum-1)*Math.random()+1);
33.//-UpdateLastDecSeq
34.lastDecreaseSeqNo=currentMaxSequenceNumber;
35.//-Stop.
36.}
37.//*3)IfDecCount<=5,andNAKCount==DecCount*DecRandom:
38.elseif(decCount<=5&&nACKCount==decCount*decreaseRandom){
39.//a.UpdateSNDperiod:SNDSND=SND*1.125;
40.packetSendingPeriod=Math.ceil(packetSendingPeriod*1.125);
41.//b.IncreaseDecCountby1;
42.decCount++;
43.//c.Recordthecurrentlargestsentsequencenumber(LastDecSeq).
44.lastDecreaseSeqNo=currentMaxSequenceNumber;
45.}
46.
47.statistics.setSendPeriod(packetSendingPeriod);
48.return;
49.}

以上就是基于UDP传输协议的流量和拥塞控制的代码,希望能帮到大家,谢谢阅读。

(0)

相关推荐

  • 网络摄像机的传输协议

    操作方法 01 网络摄像机传输协议有哪些?各是什么意思? 02 TCP/IP协议 TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控 ...

  • https是什么意思?(安全超文本传输协议)

    在逛论坛的时候发现有网友说到IE打不开HTTPS的情况,在论坛上的留言发现有部分网友说到还不知道什么是HTTPS?那么HTTPS是什么意思?所以脚本之家就在这里跟大家详细讲解HTTP的具体含义。内容如 ...

  • 基于openstack网络模式的vlan分析

    OpenStack概念 OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目。、 OpenStack是一个旨在为公共及 ...

  • UDP什么时候比TCP更有优势

    随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP.<linux就该这么学>,学习linux更能方便查看TCP,与UDP情况. 操 ...

  • linux nc命令传输文件(远程复制文件)

    nc 到底干嘛用的我不多描述,今天主要讲下用nc 传输文件.由于公司的设备sudo 后没有ssh ,scp 等远程接入命令,或host.deny 里面设置了ssh 的deny ,不管怎样的原因.我今天 ...

  • Openvpn在麒麟操作系统上的配置方法

    网上关于Openvpn的帖子已经很多了,我这里也就不多讲了,初学者可以去狗狗上搜一下,总有几篇不错的帖子,自己看了一下,大部分是将windows平台和Linux平台的,都还可以的。这里呢,洒家只想讲一 ...

  • Linux必学的网络操作命令

    因为Linux系统是在Internet上起源和发展的,它与生俱来拥有强大的网络功能和丰富的网络应用软件,尤其是TCP/IP网络协议的实现尤为成熟。Linux的网络命令比较多,其中一些命令像ping、f ...

  • 网络管理人员经常遇到的十个问题

    当前网络迅速发展,并承载了许多重要的商业应用和服务,同时网络用户也越来越多。在这种网络环境下,网络工程师除了要完成诸如将设备添加至网络的简单任务外,更多时候他们还需要去即时处理和解决一些复杂的网络问题 ...

  • 详解Linux系统中安装配置Samba服务器的步骤

    一.获取源代码包并进行解压 从samba的官方网站可以下载最新的samba源代码包.下面我们以samba-3.5.9.tar.gz的源代码包作为案例进行解析.本例中,我们将源代码包放在目录/home/ ...