Синдром ученика чародея ( 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.
Рекомендации
- ^ Брейден, Роберт , изд. (Октябрь 1989 г.). «Синдром ученика чародея» . Требования к Интернет-хостам - применение и поддержка (RFC) . IETF . С. 43–45. сек. 4.2.3.1. DOI : 10,17487 / RFC1123 . RFC 1123 . Проверено 5 октября 2012 .