6.3. Алгоритм маршрутизации Pseudo-Algol
На рисунке 1 показан алгоритм pseudo-Algol, который должны использовать шлюзы. Ниже приведены определения использованный при описании алгоритма терминов.
RouteLink(хост)
Функция, принимающая адрес хоста в качестве параметра и возвращающая канал для первого интервала пути отшлюза к хосту.
RouteHost(хост)
Эта функция аналогична предыдущей, но возвращает адрес хоста на первом интервале.
ResolveAddress(хост)
Эта функция возвращает аппаратный адрес хоста по адресу IP.
IncomingLink
Канал, на который прибывает пакет.
OutgoingLinkSet
Набор каналов, в которые пакет должен быть передан.
OutgoingHardwareHost
Аппаратный адрес хоста, которому передается пакет.
Destination.host
Связанная с хостом часть адреса получателя (номер хоста).
Destination.subnet
Номер подсети в адресе получателя.
Destination.ipnet
Номер сети IP в адресе получателя.
BEGIN IF Destination.ipnet IN AllLinks THEN BEGIN IF IsSubnetted(Destination.ipnet) THEN BEGIN IF Destination.subnet = BroadcastSubnet THEN BEGIN /* используется Reverse Path Forwarding алгоритм */ IF IncomingLink = RouteLink(Source) THEN BEGIN IF Destination.host = BroadcastHost THEN OutgoingLinkSet <- AllLinks - IncomingLink; OutgoingHost <- BroadcastHost; Проверка возможности внутреннего использования пакета; END ELSE /* отбрасывание дубликатов от других шлюзов */ Discard; END ELSE IF Destination.subnet = IncomingLink.subnet THEN BEGIN /* пересылка будет порождать петлю */ IF Destination.host = BroadcastHost THEN Проверка возможности внутреннего использования пакета; Discard; END ELSE BEGIN /* пересылка в (возможно локальную) подсеть */ OutgoingLinkSet <- RouteLink(Destination); OutgoingHost <- RouteHost(Destination); END END ELSE BEGIN /* пакет адресован в одну из локальных сетей */ IF Destination.ipnet = IncomingLink.ipnet THEN BEGIN /* пересылка будет порождать петлю */ IF Destination.host = BroadcastHost THEN Examine packet for possible internal use; Discard; END ELSE BEGIN /* может быть широковещательным */ OutgoingLinkSet <- RouteLink(Destination); OutgoingHost <- RouteHost(Destination); END END END ELSE BEGIN /* пересылка в удаленную сеть IP */ OutgoingLinkSet <- RouteLink(Destination); OutgoingHost <- RouteHost(Destination); END OutgoingHardwareHost <- ResolveAddress(OutgoingHost); END Рисунок 1: Алгоритм Pseudo-Algol для маршрутизации широковещательных дейтаграмм.