title: How does TCP slow start increase throughput?
body: <p>TCP slow start came about in a time when the Internet began experiencing "congestion collapses".  The anecdotal example from <a href="http://ee.lbl.gov/papers/congavoid.pdf" rel="nofollow">Van Jacobson and Michael Karels paper</a> goes:</p>
  
  <pre><code>During this period, the data throughput from LBL to UC Berkeley (sites separated
  by 400 yards and two IMP hops) dropped from 32 Kbps to 40 bps.
  </code></pre>
  
  <p>The congestion problem is often described as being caused by the transition from a high-speed link to a slow-speed link, and packet build up/dropping at the buffer at this bottleneck.<br>
  What I'm trying to understand is how such a build up would cause a drop in end-to-end <em>throughput</em>, as opposed to simply causing superfluous activity/retransmits on the high-speed portion of the link leading into the full buffer.  As an example, consider the following network:</p>
  
  <pre><code>    fast       slow       fast
  A ======== B -------- C ======== D
  </code></pre>
  
  <p>A and D are the endpoints and B and C are the packet buffers at a transition from a high speed to low speed network.  So e.g. the link between A/B and C/D is 10Mbps, and link between B/C is 56Kbps.  Now if A transmits a <em>large</em> (let's say theoretically infinite) message to D, what I'm trying to understand is why it would take it any longer to get through if it just hammered the TCP connection with data versus adapting to the slower link speed in the middle of the connection.  I'm envisaging B as just being some thing whose buffer drains at a fixed rate of 56Kbps, regardless of how heavily its buffer is being hammered by A, and regardless of how many packets it has to discard because of a full buffer.  So if A is always keeping B's buffer full (or overfull as may be the case), and B is always transmitting at it's maximum rate of 56Kbps, how would the throughput get any better by using slow-start instead?  </p>
  
  <p>The only thing I could think of was if the <em>same</em> packets D had already received were having to be retransmitted over the slow B/C link under congestion, and this was blocking new packets.  But wouldn't D have typically ACK'd any packets it had received, so retransmitted packets should be mostly those which legitimately hadn't been received by D because they were dropped at B's buffer?</p>