Classic TCP
AIMD
AIMD - a distributed, asynchronous algorithm - has been shown to:
- optimize congested flow rates network wide.
- have desirable stability properties.
Approach: senders can increase sending rate until packet loss occurs, then decrease sending rate on loss event.
Additive Increase: Increase sending rate by 1 maximum segment size every RTT until loss detected.
Multiplicative Decrease: Cut sending rate in half at each loss event by triple duplicate ACK (TCP Reno). Or cut to 1 maximum segment size when loss is detected by timeout (TCP Tahoe)
TCP Congestion Control Details
sender sequence number space:
TCP rate ~= \(\frac{cwnd}{RTT}\) bytes/sec
- TCP sender limits transmission : LastByteSent - LastByteAcked <= cwnd
- cwnd is dynamically adjusted in response to observed network congestion
TCP slow start
initially cwnd = 1 MSS. double cwnd every RTT. done by incrementing cwnd for every ACK received.
When cwnd gets to 1/2 of its value before, we should switch to linear
CUBIC
TCP CUBIC is default in Linux, most popular TCP for popular Web servers.
Enhanced TCPs
Delay-based TCP congestion control
"Just full enough, but not fuller": keep bottleneck link busy transmitting, but avoid high delays/buffering
Explicit congestion notification (ECN)
TCP deployments often implement network-assisted congestion control.
- two bits in IP header (ToS field) marked by network router to indicate congestion
- policy to determine marking chosen by network operator
- congestion indication carried to destination
- destination sets ECE bit on ACK segment to notify sender of congestion
- involves both IP (IP header ECN bit marking) and TCP (TCP header C,E bit marking)
TCP fairness
Goal: Multiple TCP sessions share the equal resource of network.
However, there is no Internet police policing use of congestion control.