Синдром ученика мага - Sorcerers Apprentice Syndrome - Wikipedia

Статуя Микки Мауса в образе ученика чародея в Фантазия в Гонконгский Диснейленд. По сюжету заколдованная метла ученика бесконтрольно размножается.

Синдром ученика чародея (SAS) это сетевой протокол недостаток в оригинальных версиях TFTP. Он был назван в честь Гете Поэма 1797 г. "Der Zauberlehrling "(популяризировано"Ученик колдуна "отрывок из мультфильма 1940 г. Фантазия ), потому что детали его работы очень напоминают катастрофу, постигающую ученика чародея: проблема привела к постоянно растущему воспроизведению каждого пакет в передаче.

Проблема возникла из-за известного режима отказа объединенная сеть который по ошибке разработчиков протокола TFTP не был учтен при разработке протокола; режим отказа взаимодействует с некоторыми деталями механизмов TFTP для создания SAS.

Техническое образование

TFTP работает простым ступенька: в любой момент времени существует только один ожидающий пакет, и каждый пакет, полученный любой из сторон, вызывал отправку одного пакета в ответ (до завершения передачи). В спецификации TFTP сказано, что в любое время любой пакет был получен, получатель был требуется для отправки соответствующего ответного пакета. Таким образом, получение блока данные инициировал отправку «подтверждения», а получение подтверждения инициировало отправку следующего блока данных.

TFTP также, как и все протоколы, предназначенные для работы в ненадежной сети, включает: таймауты. После отправки пакета он ожидает ответа, поэтому запускает таймер. Если таймер истекает без ответа, выполняется какое-то действие; обычно повторная отправка оригинальный пакет.

Подробности

SAS произошел, когда пакет не был потерял в объединенной сети, а просто отложенный, а затем успешно доставлен по истечении тайм-аута (с обеих сторон).

Тайм-аут вызывает отправку второй копии предыдущего пакета для замены «потерянного» пакета. Однако первая копия не была потеряна, и поскольку, согласно спецификации TFTP, получение любого пакета всегда принудительно сгенерировал ответный пакет, было сгенерировано два ответа (по одному на каждую копию). Те заставили сгенерировать на них два ответа и так далее. Типичный сценарий выглядел следующим образом:

  • Компьютер S (источник) отправляет блок данных X на компьютер D (место назначения)
  • Компьютер D получает блок X и отправляет подтверждение для X обратно в S
  • Пакет, содержащий подтверждение для X, задерживается во внутренней сети.
  • Время ожидания компьютера S истекает и повторно отправляет блок данных X в D
  • Компьютер S получает отложенное подтверждение для X и отправляет блок данных X + 1.
  • Компьютер D получает вторую копию блока X и отправляет еще одно подтверждение для X обратно в S
  • Компьютер D получает блок X + 1 и отправляет подтверждение для X + 1 обратно в S
  • Компьютер S получает второе подтверждение для X и отправляет вторую копию блока данных X + 1.
  • Компьютер S получает подтверждение для X + 1 и отправляет блок данных X + 2.
  • Компьютер D получает вторую копию блока X + 1 и отправляет еще одно подтверждение для X + 1 обратно в S
  • Компьютер D принимает блок X + 2 и отправляет подтверждение для X + 2 обратно в S

Будет видно, что на данный момент ситуация стабильна и повторяется; каждый пакет с этого момента происходит дублирование (то есть две идентичные копии отправляются по объединенной сети).

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

Для небольшого файла передача будет завершена, и дублирующиеся пакеты в конечном итоге исчезнут из межсетевого взаимодействия. Однако если файл был большим, застойный коллапс Это приведет к тому, что масса пакетов истечет из объединенной сети только в случае сбоя передачи.

Решение

Исправление для SAS включало изменение спецификации TFTP, чтобы разорвать цикл.[1] Только первый экземпляр полученного подтверждения должен вызвать отправку следующего блока данных; дальнейшие копии подтверждения для конкретного блока данных будут игнорироваться, тем самым разрывая цикл повторной передачи. В новой версии протокола блок будет повторно передаваться только по таймауту.

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

Рекомендации

  1. ^ Брейден, Роберт, изд. (Октябрь 1989 г.). «Синдром ученика чародея». Требования к Интернет-хостам - применение и поддержка (RFC). IETF. С. 43–45. сек. 4.2.3.1. Дои:10.17487 / RFC1123. RFC 1123. Получено 2012-10-05.