tanenbaum_seti_all.pages (525408), страница 152
Текст из файла (страница 152)
$69 Глава б. Транспортный уровень Представьте себе подсеть настолько перегруженную, что подтверждения практически никогда не доходят вовремя, каждый пакет опаздывает и пересылается повторно по два-три раза. Предположим, что подсеть основана на дейтаграммах и что каждый пакет следует по своему маршруту. Некоторые пакеты могут застрять в давке и прийти с большим опозданием. Самый кошмарный сценарий выглядит следующим образом. Пользователь устанавливает соединение с банком и посылает сообщение с требованием банку перевести крупную сумму денег на счет не совсем надежного человека, после чего разрывает соединение.
К несчастью, каждый пакет этого сценария дублируется и сохраняется в подсети. После разрыва соединения эти дубликаты пакетов наконец, добираются до адресата в нужном порядке. У банка нет способа определить, что это дубликаты. Он решает, что это вторая независимая транзакция, и еше раз переводит деньги. В оставшейся части этого раздела мы будем изучать проблему задержавшихся дубликатов, уделяя особое внимание алгоритмам, устанавливающим соединение надежным образом. Основная проблема заключается в наличии задержавшихся дубликатов.
Эту проблему можно попытаться решить несколькими способами, ни один из которых, на самом деле, не является удовлетворительным. Так, например, можно использовать одноразовые транспортные адреса. При таком подходе каждый раз, когда требуется транспортный адрес, генерируется новый адрес.
Когда соединение разрывается, этот адрес уничтожается. Такая стратегия делает невозможной реализацию модели обрабатывающего сервера, изображенной на рис. 6.6. Другая возможность состоит в том, что каждому соединению присваивается идентификатор соединения (то есть последовательный номер, который возрастает на единицу для каждого установленного соединения), выбираемый инициатором соединения и помешаемый в каждый ТРР()-модуль, включая тот, который содержит запрос на соединение. После разрыва каждого соединения каждая транспортная сущность может обновить таблицу, в которой хранятся устаревшие соединения в виде пар (одноранговая транспортная сушпость, идентификатор соединения). Для каждого приходящего запроса соединения может быть проверено, не хранится ли уже его идентификатор в таблице (он мог остаться там со времен разорванного ранее соединения).
К сожалению, у этой схемы есть сушественный изъян: требуется, чтобы каждая транспортная сущность хранила неопределенно долго некоторое количество информации об истории соединений. Если машина выйдет из строя и потеряет свою память, она не сможет определить, какие соединения уже использовались, а какие нет. Вместо этого можно применить другой подход. Следует разработать механизм, уничтожающий устаревшие заблудившиеся пакеты и не позволявший им существовать в сети бесконечно долго, Если мы сможем гарантировать, что ни один пакет не сможет жить дольше определенного периода времени, проблема станет более управляемой. Время жизни пакета может быть ограничено до известного максимума с помощью одного из следующих методов: 1. Проектирование подсети с ограничениями. Элементы транспортных протоколов 569 2. Помещение в каждый пакет счетчика транзитных участков.
3. Помещение в каждый пакет временного штампа, К первому способу относятся все методы, предотвращающие зацикливание пакетов, в комбинации с ограничением задержки, вызванной перегрузкой по самому длинному возможному пути. Второй метод заключается в начальной установке счетчика па определенное значение и уменьшении на единицу этого значения на каждом маршрутизаторе. Сетевой протокол передачи данных просто игнорирует все пакеты, значение счетчика которых дошло до нуля. Третий метод состоит в том, что в кажлый пакет помещается время его создания, а маршрутизаторы договариваются игнорировать всс пакеты старше определенного времени.
Для последнего метода требуется синхронизация часов маршрутизаторов, что само по себе является нетривиальной задачей. Впрочем, иногда синхронизацию удается производить с помощью внешнего источника, например СР8 илн радиостанции, передающей сигналы точного времени. На практике нужно гарантировать не только то, что пакет мертв, но и что все его подтвержления также мертвы. Поэтому вводится некий интервал времени Т, который в несколько раз превышает максимальное время жизни пакета. На какое число умножается максимальное время жизни пакета, зависит от протокола, и это влияет только на длительность интервала времени Т.
Если подождать в течение интервала времени Т секунд момента отправки пакета, то можно быть уверенным, что все его следы уничтожены и что пакет не возникнет вдруг как гром среди ясного неба. При ограниченном времени жизни пакетов можно разработать надежный способ безопасной установки соединений. Автором описанного далее метола является Томлинсон (Тош!1пзоп) (1975). Этот метод решает проблему, но привносит некоторые собственные странности. Впоследствии (в 1978 году) этот метод был улучшен Саншайном (Бппз!т1пе) и Далалом (1)а1а!). Его варианты широко применяются на практике, и одним из примеров применения является ТСР.
Чтобы обойти проблему потери машиной памяти предыдугцих состояний (при выходе се из строя), Томлинсоп предложил снабдить каждый хост часами. Часы разных хостов нужно было синхронизировать. Предполагалось, что часы представляют собой двоичный счетчик, увеличивающийся через равные интервалы времени. Кроме того, число разрядов счетчика должно равняться числу битов в последовательных номерах (или превосходить его). Последнее и самое важное предположение состоит в том, что часы продолжают идти, даже если хост зависает. Основная идея заключается в том, что два одинаково пронумерованных ТР1)П-модуля никогда не отправляются одновременно. При установке соединения младшие к битов часов используются в качестве начального порядкового номера (также Й битов).
Таким образом, в отличие от протоколов, описанных в главе 3, каждое соединение начинает нумерацию своих ТР1И1-модулей с разных чисел. Диапазон этих номеров должен быть достаточно большим, чтобы к тому моменту, когда порядковые номера сделают полный круг, старые ТРР()-модули с такими же номерами уже давно исчезли. Линейная зависимость порядковых номеров от времени показана на рис. 6.7. $70 Глава 6. Транспортный уровень 2х-1 е 120 о е ВО $ ТО о ВО осле ем 70 сх о о с 0 30 60 90 120 160 100 Время е Время б Рио.
67. Трп()-модуля не могут заходить е запретную зону (а); проблема ресннхроннзецнн(б) Как только обе транспортные сущности договариваются о начальном порядковом номере, для управления потоком данных может применяться любой протокол скользящего окна. В действительности график порядковых номеров (показанный жирной линией) не прямой, а ступенчатый, так как показания часов увеличиваются дискретно. Впрочем, для простоты мы проигнорируем эту деталь. Проблема возникает при выходе хоста из строя.
Когда он снова включается, его транспортная сущность не помнит, где она находилась в пространстве порядковых номеров. Одно из решений заключается в том, что транспортная сущность должна подождать Т секунд после восстановления, чтобы всех старых ТРОП-модулей в сети не осталось. Однако в сложных сетях такая стратегия выглядит непривлекательно, так как значение Т может оказаться довольно большим. Чтобы не терять дополнительно 7 секунд после восстановления, необходимо ввести новое ограничение на использование порядковых номеров. Легче всего понять необходимость этого ограничения на примере.
Пусть максимальное время жизни пакета Т= 60 с, а часы тикают один раз в секунду, Как показано жирной линией на рис. 6.7, а, начальный порядковый номер для соединения, открываемого в момент времени х, будет равен х. Представим себе, что в момент времени г= 30 с по соединению номер 5 (открытому ранее) посылается обычный информационный ТР1И1-модуль, которому дается порядковый номер 80.
Назовем его ТРОП Х. Немедленно после ТР(И) Х хост сбрасывается и затем быстро переза"ружается. В момент времени г= 60 с он начинает повторно открывать соединения с 0 по 4. В момент времени с= 70 с хост открывает повторно соединение 5, используя, как и требуется, начальный порядковый номер 70. В течение последующих (5 с он посылает ТРОП-модули с порядковыми номерами от 70 до 80. Таким образом, в момент времени с= 85 с новый ТР))П-модуль с порядковым номером 80 и номером соединения 5 попадает в подсеть.
К несчастью, ТР()П Х еще жив. Если он прибудет к получателю ранее нового ТРГ)П 80, ТРОП Х будет принят, а правильный ТРП() 80 будет отвергнут как дубликат. Элементы транспортных протоколов 671 Чтобы избежать подобных ситуаций, необходимо запретить использование порядковых номеров на период времени Т.
Недопустимые комбинации времени и порядкового номера обозначены на рис. 6.7, а в виде запретной зоны. Прежде чем послать ТР1И)-модуль по любому соединению, транспортная сущность должна сначала прочитать показания часов и убедиться, что она не находится в запретной зоне. Неприятности у протокола могут возникнуть по двум причинам. Если хост посылает слишком быстро и слишком много данных, кривая используемых в действительности порядковых номеров может оказаться круче линии зависимости начальных номеров от времени. Это означает, что скорость передачи данных в каждом открытом соединении должна быть ограничена одним ТРЕ)()-модулем за единицу времени.
Кроме того, это означает, что транспортная сущность после восстановления, прежде чем открывать новое соединение, должна подождать, пока изменят свое состояние часы, чтобы один и тот же номер не использовался дважды. Следовательно, интервал изменения состояния часов должен быть коротким (несколько миллисекунд). К сожалению, в запретную зону можно попасть не только снизу, передавая данные слишком быстро. Как видно из рис. 6.7, б, при любой скорости передачи данных, меньшей скорости часов, кривая используемых в действительности порядковых номеров попадет в запретную зону слева. Чем круче наклон этой кривой, тем дольше придется ждать этого события.
Как уже упоминалось, непосредственно перед отправкой ТР))13-модуля транспортная сущность должна проверить, не попадет ли она в ближайшее время в запретную зону, — и, если она находится близко от запрепюй зоны, отложить оправку ТРЕ)11-модуля на Т секунд либо изменить синхронизацию порядковых номеров. Использующий показания часов метод решает проблему опаздывающих дубликатов для информационных ТР1)()-модулей, но чтобы воспользоваться этим методом, соединение необходимо вначале установить. Так как управляющие ТР1И1-модули также могут задержаться в пути, возникает потенциальная проблема договоренности обеих сторон о начальном порядковом номере, Предположим, что для установления соединения хост 1 посылает ТР1И1-модуль с запросом соелинения СОММЕСТ10М МЕООЕ5Т, содержащим предлагаемый начальный порядковый номер и номер порта получателя, удаленному хосту 2.