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 для маршрутизации широковещательных дейтаграмм.