Предположим, что в нашем примере сообщение в четыре раза длиннее максимального размера пакета. Поэтому сетевой уровень должен разбить его на четыре части (1, 2, 3 и 4) и отправить их все поочередно на маршрутизатор А с использованием какого-нибудь протокола двухточечного соединения, например PPP. Здесь в игру вступает провайдер. Каждый маршрутизатор имеет свою внутреннюю таблицу, по которой он определяет дальнейший путь пакета до любого возможного пункта назначения. Каждая запись таблицы состоит из двух полей: адресат и ведущая к нему исходящая линия. Во втором поле могут использоваться только линии, непосредственно соединенные с данным маршрутизатором. Так, например, на илл. 5.2 у маршрутизатора А имеются только две исходящие линии: к В и к С. Поэтому все входящие пакеты передаются в какую-то из этих двух точек, даже если они не являются адресатами. Изначальная таблица маршрутизации А показана на илл. 5.2 с пометкой «в начале».
В маршрутизаторе A пакеты 1, 2 и 3, поступившие на вход, кратковременно сохраняются для верификации контрольной суммы. Затем в соответствии с таблицей А каждый пакет отправляется в новом фрейме по исходящему соединению на маршрутизатор С. Далее пакет 1 уходит на Е, затем — на F. После этого он передается внутри фрейма по LAN на хост Н2. Пакеты 2 и 3 следуют по тому же маршруту.
Илл. 5.2. Маршрутизация внутри дейтаграммной сети
Однако с пакетом 4 происходит нечто другое. После прибытия на А он пересылается на маршрутизатор В, несмотря на то что его адресат — F, как и у первых трех пакетов. По какой-то причине А решил отправить пакет 4 по новому пути. Может быть, в результате отправки трех пакетов на линии ACE возник затор и маршрутизатор решил обновить свою таблицу (она показана на илл. 5.2 с пометкой «в конце»). Алгоритмы, управляющие таблицами и принимающие решения о выборе маршрута, называются алгоритмами маршрутизации (routing algorithms). Им будет уделено основное внимание в этой главе. Как мы увидим, существует несколько типов таких алгоритмов.
Протокол IP, составляющий основу всего интернета, является наиболее ярким примером сетевой службы без установления соединения. Каждый пакет содержит IP-адрес назначения, по которому маршрутизатор осуществляет индивидуальную отправку пакета. В пакетах IPv4 используются адреса длиной 32 бита, а в IPv6 — 128 бит. Далее мы подробно обсудим IP и его версии.
5.1.4. Реализация службы с установлением соединения
Службе, ориентированной на установление соединения, нужна сеть виртуального канала. Давайте разберемся, как она работает. Идея виртуальных каналов состоит том, чтобы не выбирать новый маршрут для каждого пакета, как на илл. 5.2. Вместо этого путь от источника до адресата выбирается в процессе установления соединения и хранится в специальных таблицах, встроенных в маршрутизаторы. Один и тот же маршрут используется для всего трафика, проходящего через данное соединение. Именно так работает телефонная система. Когда соединение разрывается, виртуальный канал прекращает свое существование. При использовании службы с установлением соединения каждый пакет включает в себя идентификатор виртуального канала.
В качестве примера рассмотрим ситуацию, изображенную на илл. 5.3. Хост Н1 установил соединение с хостом Н2. Это соединение запоминается и становится первой записью во всех таблицах маршрутизации. Так, первая строчка таблицы маршрутизатора А говорит о том, что если пакет с идентификатором соединения 1 пришел с хоста Н1, то его нужно направить на С с идентификатором соединения 1. Точно так же первая запись С направляет пакет на Е все с тем же идентификатором соединения 1.
Илл. 5.3. Маршрутизация в сети виртуального канала
Теперь выясним, что произойдет, если хост Н3 захочет установить соединение с Н2. Он выбирает идентификатор соединения 1 (на данный момент это первое и единственное соединение) и просит сеть установить виртуальный канал. Таким образом, в таблице появляется вторая запись. Обратите внимание, что здесь возникает конфликт: А может отличить пакеты соединения 1, пришедшие с Н1, от пакетов соединения 1, пришедших с Н3, но С такой возможности не имеет. Поэтому А присваивает новый идентификатор соединения исходящему трафику и тем самым создает второе соединение. Для предотвращения таких конфликтов маршрутизаторы получили возможность менять идентификаторы соединения в исходящих пакетах.