Most of today's Internet traffic is generated by traditional data transfer applications such as HTTP, NNTP or FTP connections. These applications which are usually not sensitive to the delivery time of each individual packet, but rather to the total transfer time of the data, are often referred to as elastic applications, as opposed to real-time applications. They use largely TCP, which provides end-to-end control over the ``best-effort'' service of IP. The role of TCP, apart from ensuring a reliable delivery of the packets, is to adapt the sending rate of the source to the capacity of the network. Without flow control, the source could indeed saturate one or several routers, which would cause many losses and retransmissions, resulting in a low ``goodput''. Thus TCP must face the trade-off of achieving a high utilization of the network resources while keeping the amount of data in the buffers as low as possible.
In order to ensure the end-to-end control of packet transmission, the destination sends an acknowledgment to the source each time it receives a packet (see below). The packets are numbered so as to retransmit lost packets, to detect duplicated packets and to deliver the packets in order. The control mechanism of TCP consists in limiting the number of unacknowledged packets in transit in the network, to a maximal value W called the window (W=4 in the example below). The window is dynamic so as to adapt the sending rate of the source to static parameters of the network (speed of the routers, propagation delays,...) as well as dynamic parameters the network (available bandwidth, loss rate,...).