Э. Таненбаум - Компьютерные сети. (4-е издание) (DJVU) (1130092), страница 153
Текст из файла (страница 153)
Помещение в каждый пакет временного штампа. К первому способу относятся все метолы, предотвращающие зацикливание пакетов, в комбинации с ограничением задержки, вызванной перегрузкой по самому длинному возможному пути. Второй метод заключается в начальной установке счетчика на определенное значение и уменьшении иа единицу этого значения иа каждом маршрутизаторе. Сетевой протокол передачи данных просто игнорирует все пакеты, значение счетчика которых дошло до нуля. Третий метод состоит в том, что в каждый пакет помещается время его создания, а маршрутизаторы договариваются игнорировать все пакеты старше определенного времени.
Для последнего метода требуется синхронизация часов маршрутизаторов, что само по себе является нетривиальной задачей. Впрочем, иногда синхронизацию удается производить с помощью внешнего источника, например СРЯ или радиостанции, передающей сигналы точного времени.
На практике нужно гарантировать ие только то, что пакет мертв, по и что все его подтверждения также мертвы. Поэтому вволится некий интервал времени Т, который в несколько раз превышает максимальное время жизни пакета. На какое число умножается максимальное время жизни пакета, зависит от протокола, и это влияет только иа длительность интервала времени Т. Если подождать в течение интервала времени Т секунд момента отправки пакета, то можно быть уверенным, что все его следы уничтожены и что пакет ие возникнет вдруг как гром среди ясного неба. При ограниченном времени жизни пакетов можно разработать надежный способ безопасной установки соединений.
Автором описанного далее метода является Томлиисон (Тош11пзоп) (1975). Этот метод решает проблему, но привносит некоторые собственные странности. Впоследствии (в 1978 году) этот метод был улучшен Саишайиом (Вцпзп1пе) и Далалом (1)а1а1). Его варианты широко применяются иа практике, и одним из примеров применения является ТСР. Чтобы обойти проблему потери машиной памяти предыдущих состояний (при выходе ее из строя), Томлиисои предложил снабдить каждый хост часами. Часы разных хостов нужно было синхронизировать.
Предполагалось, что часы представляют собой двоичный счетчик, увеличивающийся через равные интервалы времени. Кроме того, число разрядов счетчика должно равняться числу битов в последовательных номерах (или превосходить его). Последнее и самое важное предположение состоит в том, что часы продолжают идти, даже если хост зависает. Основная идея заключается в том, что два одинаково пронумерованных ТРРУ-модуля никогда ие отправляются одновременно.
При установке соединения младшие 1г битов часов используются в качестве начального порядкового номера (также к битов). Таким образом, в отличие от протоколов, описанных в главе 3, каждое соединение начинает нумерацию своих ТРР()-модулей с разных чисел. Диапазон этих номеров должен быть достаточно большим, чтобы к тому моменту, когда порядковые номера сделают полный круг, старые ТРР()-модули с такими же номерами уже давно исчезли. Линейная зависимость порядковых номеров от времени показана иа рис. 6.7. 670 Глава 6. Транспортный уровень я о з Ф в 6 сь о с ~е 120 о 3 80 $ 70 с еле ем 70 0 30 80 90 120 180 180 Время а Время б Рис.
6.7. ТРР()-модули не могут заходить а запретную зону (а); проблема ресинхронизации (б) Как только обе транспортные сущности договариваются о начальном порядковом номере, для управления потоком данных может применяться любой протокол скользящего окна. В действительности график порядковых номеров (показанный жирной линией) не прямой, а ступенчатый, так как показания часов увеличиваются дискретно.
Впрочем, для простоты мы проигнорируем эту деталь. Проблема возникает при выходе хоста из строя. Когда он снова включается, его транспортная сущность не помнит, где она находилась в пространстве порядковых номеров. Одно из решений заключается в том, что транспортная сущность должна подождать Т секунд после восстановления, чтобы всех старых ТРПА-модулей в сети не осталось. Однако в сложных сетях такая стратегия выглядит непривлекательно, так как значение Т может оказаться довольно болыпим. Чтобы не терять дополнительно Т секунд после восстановления, необходимо ввести новое ограничение на использование порядковых номеров.
Легче всего понять необходимость этого ограничения на примере. Пусть максимальное время жизни пакета Т= 60 с, а часы тикают один раз в секунду. Как показано жирной линией на рис. 6.7, а, начальный порядковый номер для соединения, открываемого в момент времени х, будет равен х. Представим себе, что в момент времени (= ЗО с по соединению номер 5 (открытому ранее) посылается обычный информационный ТРОС-модуль, которому дается порядковый номер 80. Назовем его ТРПУ Х.
Немедленно после ТРП() Х хост сбрасывается и затем быстро перезагружается. В момент времени г= 60 с он начинает повторно открывать соединения с 0 по 4. В момент времени с= 70 с хост открывает повторно соединение 5, используя, как и требуется, начальный порядковый номер 70. В течение последующих 15 с он посылает ТР1НЗ-модули с порядковыми номерами от 70 до 80. Таким образом, в момент времени г= 85 с новый ТР1Н)-модуль с порядковым номером 80 и номером соединения 5 попадает в подсеть.
К несчастью, ТРПУ Х еще жив. Если он прибудет к получателю ранее нового ТР1Н) 80, ТРРП Х будет принят, а правильный ТР1Н3 80 будет отвергнут как дубликат. Элементы транспортных протоколов 671 Чтобы избежать подобных ситуаций, необходимо запретить использование порядковкях номеров на период времени Т. Недопустимые комбинации времени и порядкового номера обозначены на рис. 6.7, а в виде запретной зоны.
Прежде чем послать ТРП()-модуль по любому соединению, транспортная сущность должна сначала прочитать показания часов и убедиться, что она не находится в запретной зоне. Неприятности у протокола могут возникнуть по двум причинам. Если хост посылает слишком быстро и слишком много данных, кривая используемых в действительности порядковых номеров может оказаться круче линии зависимости начальных номеров от времени.
Это означает, что скорость передачи данных в каждом открытом соединении должна быть ограничена одним ТРЕ)У-модулем за единицу времени. Кроме того, это означает, что транспортная сущность после восстановления, прежде чем открывать новое соединение, должна подождать, пока изменят свое состояние часы, чтобы один и тот же номер не использовался дважды.
Следовательно, интервал изменения состояния часов должен быть коротким (несколько миллисекунд). К сожалению, в запретную зону можно попасть не только снизу, передавая данные слишком быстро. Как видно из рис. 6.7, б, при любой скорости передачи данных, меньшей скорости часов, кривая используемых в действительности порядковых номеров попадет в запретную зону слева Чем круче наклон этой кривой, тем дольше придется ждать этого события. Как уже упоминалось, непосредственно перед отправкой ТРЕ)П-модуля транспортная сущность должна проверить, не попадет ли она в ближайшее время в запретную зону, — и, если она находится близко от запретной зоны, отложить оправку ТРП()-модуля на Т секунд либо изменить синхронизацию порядковых номеров.
Использующий показания часов метод решает проблему опаздывающих дубликатов для информационных ТРП()-модулей, но чтобы воспользоваться этим методом, соединение необходимо вначале установить. Так как управляюшие ТРВП-модули также могут задержаться в пути, возникает потенциальная проблема договоренности обеих сторон о начальном порядковом номере. Предположим, что для установления соединения хост 1 посылает ТРПП-модуль с запросом соединения СОнйЕСТ!ОН кЕООЕ51, содержащим предлагаемый начальный порядковый номер и номер порта получателя, удаленному хосту 2. Получатель подтверждает получение этого запроса, посылая обратно ТРТ)ТЗ-модуль СОНИЕСТ10й яССЕРТЕО (соединение принято).
Если оригинальный ТРЕИЗ-модуль СОййЕСТ10Н дЕООЕ5Т будет потерян, а его дубликат неожиданно появится на хосте 2, соединение будет установлено некорректно. Для разрешения этой проблемы Томлинсон (1975) предложил чтройное рукопожатиеь. Этот протокол' установки соединения не требует, чтобы обе стороны начинали передачу с одинаковыми порядковыми номерами, поэтому он может применяться вместе с методами синхронизации, отличными от метода глобальных часов. Нормальная процедура установки соединения показана на рис. 6.8, а. Хост 1 инициирует установку, выбирая порядковый номер х, и посылает ТР1И1-модуль СОММЕСТ1ОМ дЕООЕ5Т, содержащий этот начальный порядковый номер, хосту 2.
Хост 2 отвечает ТРТ)П-модулем ЯСК, подтверждая х и объявляя свой начальный порядковый номер у. Наконец, хост 1 подтверждает выбранный 572 Глава б. Транспортный уровень хостом 2 начальный порядковый номер в первом посылаемом им информационном ТРОЕ)-модуле. Хост Хост 2 Хост Х тг Рис. 6.8. Три сценария установки соединения с помощью «тройного рукопожатия».