Путать с переупорядочением пакетов

Aug 15 2020

Я читал учебник, в котором говорится о протоколе TCP «Выборочное повторение»:

Мы предположили, что пакеты нельзя переупорядочить в канале между отправителем и получателем. Обычно это разумное предположение, когда отправитель и получатель соединены одним физическим проводом. Однако, когда «канал», соединяющий их, является сетью, может произойти переупорядочение пакетов. Подход, применяемый на практике, заключается в том, чтобы гарантировать, что порядковый номер не используется повторно, пока отправитель не будет «уверен», что любые ранее отправленные пакеты с порядковым номером x больше не находятся в сети. Это делается путем предположения, что пакет не может «жить» в сети дольше некоторого фиксированного максимального количества времени.

Я запутался, и ниже мои два вопроса.

Q1-Что означает «канал можно рассматривать как по существу буферизацию пакетов и спонтанную передачу этих пакетов в любой момент в будущем». значить? Зачем нам нужно буферизовать старый пакет? Разве не лучше, если получатель просто проигнорирует это?

Q2 - Допустим, размер окна равен 2, а доступный порядковый номер - 0,1,2,3. Отправитель сначала отправляет пакет 0, пакет 1, в то время как пакет 0 каким-то образом поражается, и его доставка занимает много времени, поэтому наступает тайм-аут, отправитель должен снова отправить пакет 0, но на этот раз пакет 0 (новый) приходит вовремя. Затем отправитель отправляет пакет 2, пакет 3, все полученные получателем. И затем отправитель собирается отправить пакет 0 (новый) и пакет 1 (новый), но старый пакет 0 поступает в получатель сейчас, поэтому приемник не может знать, что этот пакет является старым пакетом или новым пакетом. Так как же «предположение, что пакет не может« жить »в сети дольше некоторого фиксированного максимального количества времени» может решить эту проблему? Означает ли это, что в заголовке пакета указано время его отправки?

Ответы

2 Zac67 Aug 16 2020 at 07:31

Что означает «канал можно рассматривать как по существу буферизацию пакетов и спонтанную передачу этих пакетов в любой момент в будущем». значить? зачем нам буферизовать старый пакет? не лучше, если получатель просто проигнорирует это?

Такова природа очередей и буферизации, которые являются важной частью коммутации пакетов - полученные пакеты помещаются в очередь / буферизируются при входе и удаляются из очереди после того, как они были переадресованы. Буферизация необходима, поскольку в противном случае исходящий канал всегда должен быть свободным при получении пакета - это невозможно для сетей с коммутацией пакетов, только для сетей с коммутацией каналов.

Допустим, размер окна - 2, а доступный порядковый номер - 0,1,2,3.

Окно считает не пакеты / дейтаграммы, а байты . Кроме того, порядковый номер повторяется только при переполнении его 32-битного поля - это происходит только после 4 ГиБ данных. Однако этот предел означает, что во избежание двусмысленности «в полете» не может быть больше 4 гигабайт данных. Поскольку максимально возможное окно составляет (близко к) 1 ГиБ, это не проблема.

Обратите внимание, что с простыми совокупными ACK, получатель не может выборочно ACK более поздних сегментов, когда предыдущий сегмент все еще отсутствует. ACK означает, что все предыдущие данные были получены.

Например, с размером сегмента 1000 и размером окна 10 000 отправитель отправляет дейтаграммы D00-D09 (последовательность 0-9,999). D00 и D02-D09 принимаются, но D01 теряется. Получатель по-прежнему подтверждает 1000 (следующая ожидаемая последовательность данных), что заставляет отправителя переместить D0 из окна, переместить его на 1000-10999 и отправить D10.

Тем временем приемник решил, что есть проблема, поэтому он снова подтверждает 1000, чтобы сообщить об этом. Отправитель получает двойной ACK и повторно отправляет D01 (противодействующий режим) или все данные, начиная с D01 (агрессивный режим). У получателя уже есть D10 (10,000-10,999), поэтому он ACKs 11,000, что, в свою очередь, перемещает окно отправителя на 11,000-20,999 (и прерывает все еще невыполненные повторные передачи для агрессивного режима).

(Я несколько упростил процесс, на самом деле параллельное перекрытие больше и, конечно, задержка между отправкой и получением.)

РЕДАКТИРОВАТЬ: Как правильно указал Джефф (спасибо!), Поддержка выборочных подтверждений (SACK) сегодня почти дана. Используя эту опцию, получатель также может сразу SACK 2,000-9,999 (из D02-D09), чтобы отправитель не начал их повторно передавать. Он также мог начать передачу 11,000-20,999 раньше.