Experimental Evaluation of Increasing TCP Initial Congestion Window to 10 Segments
News: raw test data online now!
Overview
It is recently proposed that the permitted TCP initial window (IW) could be increased from between 2 and 4 segments, as specified in RFC 3390, to 10 segments. Refer to the Internet-Draft for the detailed discussion on the motivation behind the increase, the advantages and disadvantages of the higher initial window. Refer to this paper for some large-scale Internet measurements done by Google to support this proposal.
As a complement to the Internet measurement work, we studied the impacts of increasing TCP initial window to 10 segments through testbed experiments. In a fully controlled environment, we can emulate various network scenarios and provide a complete evaluation of the proposal. We hope our testing results could help the research community to better understand the effect of this change.
Testbed Setup

The testbed we use for this series of tests is shown above. It's a simple dumbbell topology with 14 Linux boxes and 2 switches.
The two servers in the middle use Netem to emulate a symmetric bottleneck link with given bandwidth, delay and buffer size.
The other 12 servers are grouped into 6 server/client pairs. Each pair may generate either a unidirectional long-lived flow using Iperf or a bidirectional short lived flow using Netperf. Long-lived flows are used to emulate bulk data transfer like FTP. Short-lived flows are used to emulate short request/response traffic like Web. For the short-lived flow, we generate a Poisson arrival process where you can specify the average arrival rate, how many new connections are established in each arrival (to emulate browsers that open multiple simultaneous connections), how many requests and responses are exchanged in each connection (to emulate persistent HTTP) and the size of the requests and the responses.
The metrics we measure include:
- The average throughput of each long-lived flow as well as the evolution of its cwnd and ssthresh
- The average, 50/90/95/99th percentile flow completion time of each server/client pair that generates short-lived flows
- The link utilization and packet loss rate at the bottleneck link as well as the evolution of the queue occupancy
Test Results
1. The "Scenario" column summarizes the parameter setting of the test. Note that by "short-lived flows: 4" we don't mean that there are only 4 short-lived flows. We mean that there are 4 server/client pairs. Each pair is generating many short-lived flows according to the given parameters (see the descriptions in "Testbed Setup"). Also note that "delay" indicates one-way delay. RTT is twice of that value (we emulate a symmetric link).
2. The "Results" column shows the comparison of the three major metrics among three cases: 1) when IW of all flows are set to 3 segments; 2) when IW of all flows are set to 10 segments; 3) when half of the flows use IW3 and the other half use IW10. In the "IW3+IW10" case, the metrics (such as average throughput or flow completion time) on the left side are IW3 traffic while the metrics on the right side are IW10 traffic.
3. In the absence of long-lived flows, we show link utilization, average flow completion time and packet loss rate in "Results". When long-lived flows exist, link utilization is replaced by average throughput since link utilization is typically 100% in this case.
4. The "Details" column shows three things: "Summary" gives the detailed scenario and results of each test. If you find any metric missing or any explanation of the test scenario unclear, look at this file and things should be clear. "Window" plots the cwnd/ssthresh evolution of each long-lived flow if present. "Queue" plots the queue occupancy evolution of the bottleneck link.
5. If you are interested in even more details, you can download the raw test data here. Its naming convention should be quite self-explanatory. Should you have any question, please contact Yaogong Wang (ywang15@ncsu.edu). Unfortunately, I didn't collect tcpdump log for each test.
| 64 kbps, Poisson arrival, without long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Link Utilization | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer: |
long-lived flows: 0 short-lived flows: 4 0.04 arrival/s |
|
![]() |
![]() |
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer: |
long-lived flows: 0 short-lived flows: 4 0.07 arrival/s |
|
![]() |
![]() |
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 0.10 arrival/s
|
|
|
|
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 0.13 arrival/s
|
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
| 64 kbps, Poisson arrival, with long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Throughput | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer: |
long-lived flows: 2 short-lived flows: 4 0.04 arrival/s |
|
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 0.07 arrival/s
|
![]() |
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 0.10 arrival/s
|
![]() |
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 0.13 arrival/s
|
![]() |
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
| 64 kbps, Batch arrival, without long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Link Utilization | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer: |
long-lived flows: 0 short-lived flows: 4 0.014 arrival/s |
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 0.020 arrival/s
|
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 0.026 arrival/s
|
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
| 64 kbps, Batch arrival, with long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Throughput | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer: |
long-lived flows: 2 short-lived flows: 4 0.014 arrival/s |
|
|
|
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 0.020 arrival/s
|
|
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 0.026 arrival/s
|
|
![]() |
|
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
| 20 Mbps, Poisson arrival, without long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Link Utilization | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer: |
long-lived flows: 0 short-lived flows: 4 10 arrival/s |
|
![]() |
![]() |
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 20 arrival/s |
|
|
![]() |
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 30 arrival/s
|
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 40 arrival/s
|
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
| 20 Mbps, Poisson arrival, with long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Throughput | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 10 arrival/s |
|
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 20 arrival/s
|
![]() |
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 30 arrival/s
|
![]() |
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 40 arrival/s
|
![]() |
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
| 20 Mbps, Batch arrival, without long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Link Utilization | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 2 arrival/s |
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 4 arrival/s
|
|
![]() |
![]() |
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 6 arrival/s
|
|
![]() |
|
N/A | IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 0 short-lived flows: 4 8 arrival/s
|
|
![]() |
![]() |
N/A | IW3 IW10 IW3+IW10 |
|
| 20 Mbps, Batch arrival, with long-lived flows | |||||||
| Scenario | Results | Details | |||||
| Bottleneck | Traffic | Throughput | Flow Completion Time |
Packet Loss Rate |
Summary | Window | Queue |
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 2 arrival/s |
|
![]() |
|
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 4 arrival/s
|
|
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 6 arrival/s
|
|
![]() |
![]() |
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|
|
bandwidth: delay: buffer:
|
long-lived flows: 2 short-lived flows: 4 8 arrival/s
|
|
![]() |
|
IW3 IW10 IW3+IW10 |
IW3 IW10 IW3+IW10 |
|









































































