NACK против ACK? Когда использовать один поверх другого?


19

Лично я даже не чувствую, что есть необходимость в ACK. Это быстрее, если мы просто отправим NACK (n) для потерянных пакетов вместо отправки ACK для каждого полученного пакета. Итак, когда / в каких ситуациях можно использовать ACK поверх NACK и наоборот?


Не могли бы вы дать нам больше контекста для того, о чем вы говорите? Вы вообще спрашиваете, или про TCP, или ??
Майк Пеннингтон

Общий сетевой вопрос, не связанный с TCP, UDP или любой другой конкретной областью.
nFu9DT

Ответы:


29

Причиной ACK является то, что NACK просто недостаточно. Допустим, я отправляю вам поток данных из X сегментов (скажем, 10 для простоты).

У вас плохое соединение, и вы получаете только сегменты 1, 2, 4 и 5. Ваш компьютер отправляет NACK для сегмента 3, но не понимает, что должны быть сегменты 6-10, и не NACK их.

Итак, я пересылаю сегмент 3, но затем мой компьютер ошибочно полагает, что данные успешно отправлены.

ACK обеспечивают некоторую гарантию того, что сегмент прибыл в пункт назначения.

Если вы хотите, чтобы приложение обрабатывало порядок данных и повторных передач, вы можете просто выбрать использование протокола, такого как UDP (например, как TFTP).


Хороший ответ. Но мы не можем просто обозначить первый пакет как специальный пакет - он будет включать количество сегментов, которые он отправит.
Хари

4
Это все еще оставляет проблему отправителя, не зная, получены ли данные. Без подтверждения в процессе, если отправитель ничего не слышит, он просто должен будет предположить, что все данные были получены, даже если весь поток данных был потерян. ACK гарантирует, что данные были получены.
YLearn

4

Все сводится к распределению вероятности потерь и типу трафика.

Возьмем, к примеру, типичное беспроводное соединение с устойчивым уровнем потерь 10-30%. Если вы подтвердите каждый полученный кадр (например, 802.11abg), вы быстро обнаружите, когда кадр был потерян, поэтому вы не потеряете время для ожидания тайм-аута.

Если вместо этого вы использовали NAK, вы будете зависеть от схемы трафика: - Если вы отправляете один пакет запроса и ожидаете ответа, и этот запрос теряется, у вас должен быть тайм-аут, который истекает, если вы не получаете ответ. - Если вы просто отправляете поток пакетов практически беззвучному получателю, то приемлемо получать NAK только тогда, когда получатель получит следующий пакет или около того. Но это означает, что получатель должен переупорядочить пакеты и что отправитель должен отслеживать большой список невыполненных отправленных им сообщений.

(угадайте, какое решение выберет 802.11n? и то и другое. Получатель отправляет битовую карту с переменной длиной кадра, которую он получил)

Теперь возьмем типичную сеть Интернет: у вас потеря пакетов близка к 0%, пока не случится что-то плохое, и у вас будет потеря пакетов, близкая к 100%, в течение определенного времени, следуя некоторому экспоненциальному закону распределения, от прерывания 200 мс до минуты и половина.

Захватывать каждый пакет в сети без потерь может показаться бессмысленным, пока вы не рассмотрите случай, когда связь разорвана: вы не будете получать ACK или NACK в течение возможно длительного промежутка времени, а получатель, как правило, не будет отправлять что-либо до соединения восстанавливается.

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


1

ACK полезны в протоколах скользящего окна, они позволяют передатчику A знать, что отправленные данные были получены удаленным B. Затем передатчик A может продолжить отправку следующих данных - до тех пор, пока его окно передачи не заполнится (данных, отправленных на удаленный, но еще нет). признал).

ACK могут считаться более важными, чем NAK. NAK просто обеспечивают более быстрое восстановление в случае, когда пакет / блок, отправленный A, не принят B, и B каким-то образом обнаруживает, что пакет / блок отсутствует.

Совершенно возможно разработать протокол, поддерживающий надежную передачу и управление потоком только с ACK, без NAK (с повторной передачей передатчиком в случае, если передатчик не получает ACK, механизм повторной передачи, который необходим в любом случае).


0

Здесь я хотел бы добавить одну самую важную вещь: в TCP мы НЕ отправляем ACK для каждого полученного пакета.

Однако ACK отправляются только для ПОСЛЕДНЕГО ПОЛУЧЕННОГО ПАКЕТА.

Пожалуйста, поправьте меня, если я ошибаюсь.


1
Это правда до определенного момента. Например, сегменты с только установленным флагом ACK или RST не требуют ACK. Кроме того, если используются задержанные ACK, то не может быть ACK для каждого сегмента, однако обычно для этого требуется, чтобы ACK отправлялся для каждого другого сегмента. Однако многие TCP-соединения не будут использовать задержанные ACK и будут отправлять ACK для каждого сегмента, несущего данные.
YLearn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.