[Iccrg] improvement of tcp slow start

Lachlan Andrew lachlan.andrew at gmail.com
Fri Mar 16 03:46:08 GMT 2007


Greetings Stefan,

The main problem with increasing the rate of increase of slow start is
that it creates larger overshoot when the correct rate is reached.  If
we triple the rate each RTT instead of doubling it (or multiplying by
1.5 -- see the recent discussion on the end2end-interest list), then
we are transmitting at three times too fast when we finish.

What would be more useful would be something which can detect when
slow-start is nearing its end -- like measuring queueing delay or some
property of the RTT-level burstiness -- so that we can start
aggressively but back off when we're nearing the end.

There are also fairness issues with having some sources using
"improved" slow start and some using the existing algorithm, although
I think they're often overstated.

Cheers,
Lachlan

On 16/03/07, Stefan Hirschmann <krasnoj at gmx.at> wrote:
> Hi!
>
> I made a few thoughts about the tcp slow start behavior (each paket
> increases the window by 1, so that the value is doubled each RTT). But I
> think this behaviour is to slow, so that most of the connection can not
> use the maximum speed.
>
> I wrote a TCP slow start simulator <http://nopaste.debianforum.de/5415>
> . The output is:
> time[ms]   currend send window[1]      current used bandwith[KB/s]
> already sended data[KByte]
>
> If you look at the output:
> =============================================================
> $: ./slowStartSimulator 102400 1.5 500 1 1
> bandWith = 102400
> time   snd_cwnd  used_bandWith   alreadySended
> 0           1          3.0             0.0
> 500         2          6.0             1.5
> 1000        4         12.0             4.5
> 1500        8         24.0            10.5
> 2000       16         48.0            22.5
> 2500       32         96.0            46.5
> 3000       64        192.0            94.5
> 3500      128        384.0           190.5
> 4000      256        768.0           382.5
> 4500      512       1536.0           766.5
> 5000     1024       3072.0          1534.5
> 5500     2048       6144.0          3070.5
> 6000     4096      12288.0          6142.5
> 6500     8192      24576.0         12286.5
> 7000    16384      49152.0         24574.5
> 7500    32768      98304.0         49150.5
> 8000    65536     196608.0         98302.5
> USAGE: ./slowStartSimulator bandwith packetSize pingTime [adder multiplier]
>         everything in KB and ms
> =============================================================
> You see that it takes 8 seconds till the TCP flow reaches 100MB/s at a
> pingTime from 500ms (realistic for satellite uplinks distance = 4 * 36000).
>
> So I thought about improvements. If you change the std behaviour
> (tp->snd_cwnd++;) with multiply by 3(tp->snd_cwnd+=2) you get this output:
> =============================================================
> $slowStartSimulator 102400 1.5 500 2 1
> bandWith = 102400
> time   snd_cwnd  used_bandWith   alreadySended
> 0           1          3.0             0.0
> 500         3          9.0             1.5
> 1000        9         27.0             6.0
> 1500       27         81.0            19.5
> 2000       81        243.0            60.0
> 2500      243        729.0           181.5
> 3000      729       2187.0           546.0
> 3500     2187       6561.0          1639.5
> 4000     6561      19683.0          4920.0
> 4500    19683      59049.0         14761.5
> 5000    59049     177147.0         44286.0
> USAGE: ./slowStartSimulator bandwith packetSize pingTime [adder multiplier]
>         everything in KB and ms
> =============================================================
> Now it takes only 5 seconds till the 100 MB/s is reached.
>
>
> If you use (tp->snd_cwnd+=3); you get this output:
> =============================================================
> slowStartSimulator 102400 1.5 500 3 1
> bandWith = 102400
> time   snd_cwnd  used_bandWith   alreadySended
> 0           1          3.0             0.0
> 500         4         12.0             1.5
> 1000       16         48.0             7.5
> 1500       64        192.0            31.5
> 2000      256        768.0           127.5
> 2500     1024       3072.0           511.5
> 3000     4096      12288.0          2047.5
> 3500    16384      49152.0          8191.5
> 4000    65536     196608.0         32767.5
> USAGE: ./slowStartSimulator bandwith packetSize pingTime [adder multiplier]
>         everything in KB and ms
> =============================================================
> Now it takes only 4 seconds, till the 100MB/s is reached.
>
> I also tried to replace (tp->snd_cwnd++;) with something like
> (tp->snd_cwnd *= 2) but I think this is to aggressive and should not be
> used:
> =============================================================
> $slowStartSimulator 1024 1.5 500 0 2
> bandWith = 1024
> time   snd_cwnd  used_bandWith   alreadySended
> 0           1          3.0             0.0
> 500         2          6.0             1.5
> 1000        8         24.0             4.5
> 1500     2048       6144.0            16.5
> =============================================================
>
> Summary:
> The slowstart algorithm is from a time, where 56k modems where state of
> the art, but it is too less aggressive for todays networks. So I suggest
> to replace it with +=2 or +=3.
>
> What do you think about this? I made the programm with much care, but
> maybe I overlooked a bug, so if you want, check it too.
>
>
> Stefan
>
>
> _______________________________________________
> Iccrg mailing list
> Iccrg at cs.ucl.ac.uk
> http://oakham.cs.ucl.ac.uk/mailman/listinfo/iccrg
>


-- 
Lachlan Andrew  Dept of Computer Science, Caltech
1200 E California Blvd, Mail Code 256-80, Pasadena CA 91125, USA
Phone: +1 (626) 395-8820    Fax: +1 (626) 568-3603



More information about the Iccrg mailing list