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
, тогда оба они будут отправлены вверх для доставки.