TCP expects the client to acknowledge every X bytes it has received. It takes a short amount of time for the acknowledgement to reach the server, and for the data sent by the server to reach the client again. The sum of these time periods is called round trip time, while those X bytes are called window size. The window size can't be larger than 65535 bytes. But, most operating systems support window scaling, which means that a TCP client has to acknowledge every X bytes times the window scaling factor, e.g. if the window size is 32 kB and the window scaling factor is 8, then an acknowledgement has to be sent every 256 kB of data.
This also means that if you got a 10 MBit/s Internet connection, then most likely you won't be able to download at 1.25 MB/s. This page gives a rough idea what throughput one can expect from a single TCP connection. Looking at the graphs, you might see that tuning the setting which shows an exponential or linear behaviour will give you the greatest improvement. Or, if all three graphs show the same behaviour, you might tune whichever setting is the easiest one for you.
Setting | Value | Info | |
---|---|---|---|
Bandwidth: | MBit/s | ||
Round trip time: | ms | output of ping | |
Window size: | Bytes | e.g. 64240 for Ethernet, or 65340 for DSL | |
Window scaling factor: | |||
Effective window size: | Bytes | ||
MTU: | Bytes | e.g. 1500 for Ethernet, or 1492 for DSL | |
TCP/IP overhead: | Bytes | usually 40 Bytes for a TCP/IP packet without options | |
Naively expected throughput: | MB/sec | ||
Realistic throughput: | MB/sec |
Variable bandwidth | Variable window size | Variable round trip size |
---|---|---|