16.4. Протоколы
317
должать выполнение протокола как обычно. Если сообщение, на которое мы
ответили, было создано злоумышленником, выполнение протокола рано или
поздно даст сбой, поскольку криптографические протоколы специально раз-
рабатываются таким образом, чтобы помешать злоумышленнику успешно за-
вершить протокол с одним из его участников.
16.4.3
Время ожидания
Выполнение каждого протокола включает в себя ожидание ответа. Если
вы не получаете ответ на сообщение в течение определенного периода вре-
мени, вы можете повторно отослать последнее сообщение. После нескольких
безуспешных попыток отослать сообщение с этой идеей придется расстаться.
Зачем продолжать выполнение протокола, если вы не можете взаимодейство-
вать со вторым участником?
Самый простой
способ реализовать время ожидания — это отсылать со-
стоянию протокола сообщения об истекшем времени. Для контроля за вре-
менем ожидания можно применять таймеры, значения которых явно уста-
навливаются протоколом, или же сообщения, которые отсылаются каждые
несколько секунд или около того.
Одним из распространенных типов атак является отправка на конкрет-
ный компьютер огромного количества сообщений типа “начало протокола”.
Каждый раз, когда система получает подобное сообщение, она инициирует
новое состояние выполнения протокола. Через несколько миллионов подоб-
ных сообщений у компьютера заканчивается память и система “зависает”.
В качестве хорошего примера подобной атаки можно привести
синхронную
атаку (SYN flood attack)
. Защититься от таких атак очень сложно, но они
показывают, как важно удалять устаревшие состояния протокола. Если вы-
полнение протокола замерло и не возобновляется в течение слишком долгого
времени, его состояние необходимо удалить.
Величина времени ожидания постоянно является предметом ожесточен-
ных споров. По своему опыту мы знаем, что пакет, отправленный по Internet,
доходит до адресата примерно через секунду или же не доходит вообще. Если
в течение пяти секунд на сообщение не было получено ответа, имеет смысл
отправить его еще раз. Трех попыток должно быть вполне достаточно; если
уровень потери сообщений настолько высок, что мы потеряли четыре по-
следовательных сообщения за 15 с, данное соединение вряд ли годится для
выполнения протокола. Мы предпочитаем проинформировать пользователя
о
проблеме уже через 20 с, а не заставлять его пребывать в напрасном ожи-
дании ответа несколько минут или более.