
568 Глава 6. Транспортный уровень
Представьте себе подсеть настолько перегруженную, что подтверждения
практически никогда не доходят вовремя, каждый пакет опаздывает и пересыла-
ется повторно по два-три раза. Предположим, что подсеть основана на дейтаграм-
мах и что каждый пакет следует по своему маршруту. Некоторые пакеты могут
застрять в давке и прийти с большим опозданием.
Самый кошмарный сценарий выглядит следующим образом. Пользователь
устанавливает соединение с банком и посылает сообщение с требованием банку
перевести крупную сумму денег на счет не совсем надежного человека, после че-
го разрывает соединение. К несчастью, каждый пакет этого сценария дублирует-
ся и сохраняется в подсети. После разрыва соединения эти дубликаты пакетов
наконец, добираются до адресата в нужном порядке. У банка нет способа опреде-
лить, что это дубликаты. Он решает, что это вторая независимая транзакция, и еще
раз переводит деньги. В оставшейся части этого раздела мы будем изучать про-
блему задержавшихся дубликатов, уделяя особое внимание алгоритмам, уста-
навливающим соединение надежным образом.
Основная проблема заключается в наличии задержавшихся дубликатов. Эту
проблему можно попытаться решить несколькими способами, ни один из кото-
рых, на самом деле, не является удовлетворительным. Так, например, можно ис-
пользовать одноразовые транспортные адреса. При таком подходе каждый раз,
когда требуется транспортный адрес, генерируется новый адрес. Когда соедине-
ние разрывается, этот адрес уничтожается. Такая стратегия делает невозможной
реализацию модели обрабатывающего сервера, изображенной на рис. 6.6.
Другая возможность состоит в том, что каждому соединению присваивается
идентификатор соединения (то есть последовательный номер, который возраста-
ет на единицу для каждого установленного соединения), выбираемый инициато-
ром соединения и помещаемый в каждый TPDU-модуль, включая тот, который
содержит запрос на соединение. После разрыва каждого соединения каждая
транспортная сущность может обновить таблицу, в которой хранятся устаревшие
соединения в виде пар (одноранговая транспортная сущность, идентификатор со-
единения). Для каждого приходящего запроса соединения может быть провере-
но, не хранится ли уже его идентификатор в таблице (он мог остаться там со вре-
мен разорванного ранее соединения).
К сожалению, у этой схемы есть существенный изъян: требуется, чтобы каж-
дая транспортная сущность хранила неопределенно долго некоторое количество
информации об истории соединений. Если машина выйдет из строя и потеряет
свою память, она не сможет определить, какие соединения уже использовались,
а какие нет.
Вместо этого можно применить другой подход. Следует разработать меха-
низм, уничтожающий устаревшие заблудившиеся пакеты и не позволяющий им
существовать в сети бесконечно долго. Если мы сможем гарантировать, что ни
один пакет не сможет жить дольше определенного периода времени, проблема
станет более управляемой.
Время жизни пакета может быть ограничено до известного максимума с по-
мощью одного из следующих методов:
1. Проектирование подсети с ограничениями.
Элементы транспортных протоколов 569
2. Помещение в каждый пакет счетчика транзитных участков.
3. Помещение в каждый пакет временного штампа.
К первому способу относятся все методы, предотвращающие зацикливание
пакетов, в комбинации с ограничением задержки, вызванной перегрузкой по са-
мому длинному возможному пути. Второй метод заключается в начальной уста-
новке счетчика на определенное значение и уменьшении на единицу этого значе-
ния на каждом маршрутизаторе. Сетевой протокол передачи данных просто
игнорирует все пакеты, значение счетчика которых дошло до нуля. Третий метод
состоит в том, что в каждый пакет помещается время его создания, а маршрути-
заторы договариваются игнорировать все пакеты старше определенного време-
ни. Для последнего метода требуется синхронизация часов маршрутизаторов,
что само по себе является нетривиальной задачей. Впрочем, иногда синхрониза-
цию удается производить с помощью внешнего источника, например GPS или
радиостанции, передающей сигналы точного времени.
На практике нужно гарантировать не только то, что пакет мертв, но и что все
его подтверждения также мертвы. Поэтому вводится некий интервал времени Т,
который в несколько раз превышает максимальное время жизни пакета. На ка-
кое число умножается максимальное время жизни пакета, зависит от протокола,
и это влияет только на длительность интервала времени Т. Если подождать в те-
чение интервала времени Т секунд момента отправки пакета, то можно быть уве-
ренным, что все его следы уничтожены и что пакет не возникнет вдруг как гром
среди ясного неба.
При ограниченном времени жизни пакетов можно разработать надежный спо-
соб безопасной установки соединений. Автором описанного далее метода явля-
ется Томлинсон (Tomlinson) (1975). Этот метод решает проблему, но привносит
некоторые собственные странности. Впоследствии (в 1978 году) этот метод был
улучшен Саншайном (Sunshine) и Далалом (Dalai). Его варианты широко при-
меняются на практике, и одним из примеров применения является TCP.
Чтобы обойти проблему потери машиной памяти предыдущих состояний (при
выходе ее из строя), Томлинсон предложил снабдить каждый хост часами. Часы
разных хостов нужно было синхронизировать. Предполагалось, что часы пред-
ставляют собой двоичный счетчик, увеличивающийся через равные интервалы
времени. Кроме того, число разрядов счетчика должно равняться числу битов в
последовательных номерах (или превосходить его). Последнее и самое важное
предположение состоит в том, что часы продолжают идти, даже если хост зави-
сает.
Основная идея заключается в том, что два одинаково пронумерованных
TPDU-модуля никогда не отправляются одновременно. При установке соедине-
ния младшие k битов часов используются в качестве начального порядкового но-
мера (также k битов). Таким образом, в отличие от протоколов, описанных в гла-
ве 3, каждое соединение начинает нумерацию своих TPDU-модулей с разных
чисел. Диапазон этих номеров должен быть достаточно большим, чтобы к тому
моменту, когда порядковые номера сделают полный круг, старые TPDU-модули
с такими же номерами уже давно исчезли. Линейная зависимость порядковых
номеров от времени показана на рис. 6.7.