TCP-пакеты имеют порядковые номера (байт смещения с самого начала, из памяти) и ACK сообщения признают, что конкретное смещение было получено:

Таким образом, вы могли бы в конечном итоге с ситуацией, как :
data 1 (10 bytes) ->
<- ack (10, data1)
data 2 (15 bytes) ->
data 3 (10 bytes) ->
data 4 (8 bytes) ->
<- ack (25, data1/2/3)
<- ack (33, data1/2/3/4)
другими словами, отправитель может продолжать посылать независимо от подтверждения до того момента, когда его буферы полны (он должен держать неподтвержденных пакетов в случае ему необходимо повторно передать их).
Это «разъединение» между отправлениями и подтверждениями может значительно ускорить поток данных.
На стороне приема пакеты могут выходить из строя, и они сохраняются до тех пор, пока что-то не будет доставлено на более высокие уровни по порядку.
Например, если data 3
прибыл до data 2
, то принимающий конец будет держаться за него до тех пор, пока не поступит data 2
, тогда оба они будут отправлены вверх для доставки.