2012-03-30 4 views
8

Мне было интересно, как именно TCP реализует доставку в порядке.Как TCP реализует/гарантирует передачу данных в порядке?

позволяет сказать, что это список событий

  1. packet1 послал, Ack получил.
  2. упаковка2 отправлен, ack не принимаем.
  3. упаковка3 отправлен.
  4. пакет4 отправлен.
  5. ack4 получив.
  6. ack3 получив.
  7. ack2 получив.

Можете ли вы описать мне, что именно происходит последовательно?

ответ

7

Короткий ответ заключается в том, что каждый пакет содержит информацию о смещении (замаскированный под порядковый номер), указав, где находится в потоке его полезная нагрузка.

Скажем, произошло следующее: принимается пакет 1, пакет 2 не принимается, и принимаются пакеты 3 и 4. На данный момент прием TCP-стека знает, где скопировать содержимое пакетов 3 и 4 в буфер, и он знает, что он еще не получил ранее данные, поэтому он сделает данные пакета 1 доступными для чтения, но он не будет данные пакета 3 или 4 до получения пакета 2.

Передача TCP-стека обычно не дожидается подтверждения для какого-либо одного пакета перед отправкой следующего, но если он не получает подтверждение для данного пакета (и ACK могут и объединяются вместе в одном пакете для повышения эффективности), он будет повторно передавать его до получения ACK.

Точная последовательность событий зависит от условий сети, реализации стека TCP, выбрана политика TCP, параметры сокета и другие факторы.

4

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

enter image description here

Таким образом, вы могли бы в конечном итоге с ситуацией, как :

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