Описание команды route

Как превратить карту дорог OpenStreetMap в дорожную сеть для роутинга

Простейший путь заключается в поиске и нумерации всех пересечений улиц и разбиении всех дорог на участки между найденными точками пересечения. Точки пересечения будут узлами дорожного графа (сети), а участки — ребрами этого графа. Узлы необходимы в процессе построения дорожной сети, а для роутинга они не нужны, хотя их удобно использовать для поиска ближайших узлов графа для заданных домов (адресов). В чем минусы такого простого подхода, хорошо описанного в документации? В первую очередь тем, что мы никак не можем ограничить пересечения дорог — и полученные маршруты будут в шахматном порядке обходить дома по обе стороны каждой дороги, что выглядит странно, в случае широких улиц такой маршрут очень далек от оптимального и, вдобавок, вовсе не все дороги можно пересечь в произвольном месте. Кроме того, по умолчанию односторонние улицы или полностью исключаются из дорожной сети, или доступны в обоих направлениях. Зато такой вариант очень прост в реализациии для него существуют и специальные утилиты и функции PgRouting.

В предложенной в репозитории дорожной сети каждое ребро разделено на два односторонних (два направления движения транспорта или два тротуара для пешеходов) и добавлены соединяющие кратчайшие пути между дорогами и домами так, чтобы добавленные сегменты соответствовали принятому направлению движения (напомню, в разных странах бывает как левостороннее, так и правостороннее движение) и необходимые узлы сети. Таким образом, сменить направление движения можно только на перекрестках и мы избегаем лишних пересечений дорог и обеспечиваем непрерывную нумерацию домов по каждую сторону каждого участка дорог. При необходимости, протяженные участки можно разбить на более короткие для возможности смены направления движения. Заметим, что такой вариант дорожной сети оптимизирован для автомобильных маршрутов.

На рисунке выше показана визуализация виртуальной дорожной сети из репозитория. На самом деле, геометрически синие и зеленые сегменты накладываются друг на друга, а здесь сделано смещение между ними только для наглядности. Здесь нумерация точек маршрута на каждой стороне последовательная, при этом направление движения на одной из сторон (синей) игнорируется, поскольку у нас пока нет поддержки однонаправленных дорог.

Для пешеходных маршрутов лучше для каждого добавленного узла связи с домами также добавить узел к парному ребру (обратного направления) и определить короткие сегменты между этими узлами, так как во многих случаях пешеходу удобнее пересекать небольшие улицы, нежели двигаться по одной стороне от перекрестка до перекрестка. Для автотранспортных маршрутов такой вариант тоже подходит, только нужно увеличить расстояние между виртуальными узлами. Скажем, 10 м для пешеходного маршрута и 100 м для автомобильного разумная оценка для каждой смены направления вне перекрестка.

Возможно, вас интересует вопрос, почему мы тратим время на создание сложной дорожной сети вместо использования более «продвинутых» методов построения оптимального маршрута? Все очень просто — по хорошей дорожной сети даже простой алгоритм быстро (секунды) построит отличные маршруты, в то время как по посредственной дорожной сети даже лучшие из существующих алгоритмов за разумное время (минуты, часы или дни, в зависимости от задачи) построят плохие маршруты или вообще не смогут завершить вычисления. Это следствие невероятной вычислительной сложности задачи. К примеру, если мы желаем посетить 10 или 100 адресов по обе стороны одной улицы и при этом у нас определены два направления движения и только два перехода между ними, скажем, в начале и в конце улицы — задача имеет единственное решение и любой алгоритм его найдет почти мгновенно! В случае же, когда у нас нет заданных направлений движения и разрешено пересечение улицы около каждого заданного адреса — задача становится не решаемой вычислительно уже для нескольких десятков адресов и разные алгоритмы и для разного числа адресов вернут разные и весьма не оптимальные маршруты

Таким образом, критически важно именно построить дорожную сеть с такими ограничениями, которые запрещают большинство (неоптимальных) маршрутов, так что пространство перебора становится несравнимо меньше и достаточно оптимальный результат гарантирован любым из методов. Именно ограничения на направление движения и допустимые повороты являются самыми эффективными

Overview

Router keeps routing information in several separate spaces:

  • (Forwarding Information Base), that is used to make packet forwarding decisions. It contains a copy of the necessary routing information.
  • Each routing protocol (except BGP) has it’s own internal tables. This is where per-protocol routing decisions are made. BGP does not have internal routing tables and stores complete routing information from all peers in the RIB.
  • contains routes grouped in separate routing tables based on their value of routing-mark. All routes without routing-mark are kept in the main routing table. These tables are used for best route selection. The main table is also used for nexthop lookup.

Что такое односторонние дороги и зачем они нужны

В первую очередь, мы говорим об односторонних дорогах на карте, то есть таких, по которым движение разрешено только в одну сторону. Разумеется, двигаться по ним в другую сторону запрещено. Особенно часто такое ограничение встречается на мостах, в туннелях и на высокоскоростных шоссе, где движение в противоположную сторону опасно для жизни.

Разумеется, нам необходимо соблюдать направление движения для автотранспортных средств, здесь не может быть компромиссов. В то же время, для пешеходного роутинга это не является обязательным, хотя и удобно двигаться по маршруту по направлению движения автомобилей — проще ориентироваться, можно воспользоваться общественным транспортом или такси и т.п. Замечу, что некоторые (многие, на самом деле) открытые системы роутинга игнорируют это правило, то есть они подразумевают пешеходный роутинг (по пешеходным дорогам и по окружающим не пешеходные дороги тротуарам, которые могут и отсутствовать в действительности), независимо от длины маршрута и наличия тротуаров в туннелях и на скоростных шоссе.

Кроме того, поддержка односторонних дорог позволяет улучшить маршрутную сеть — заданные направления движения заметно упрощают поиск оптимального маршрута за счет очень значительного снижения количества возможных вариантов, можно учесть рельеф местности (довольно трудно с грузом или без подняться по множеству ступенек крутой лестницы, особенно, если можно вместо того спускаться по ней) и принудительно сделать некоторые участки односторонними, можно сделать односторонними виртуальные соединения между домами и улицами (так что маршрут будет построен с последовательной нумерацией, даже если он несколько раз проходит по одной улице — поскольку длина маршрута в таком случае не меняется, сам PgRouting никак не гарантирует, что все адреса на такой улице будут посещены в один и тот же проход по ней). И так далее, есть еще много возможностей, доступных для роутинга с поддержкой направлений движения.

Таблицы маршрутизации

Вывести таблицы маршрутизации. Ядро принимает решение о применении той или иной таблицы на основании адреса источника пакета. Эти таблицы применимы для всех пакетов.

# ip rule list
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default

Вывести содержимое таблицы local.

# ip route show table local

Таблица local. Пакет при выборе пути к месту назначения проверяется правилом с наименьшим приоритетом. Правило 0 отправит поиск маршрута в таблицу «local».

Таблица local проверяет не адресован ли пакет локальной машине (широковещательный или сетевой адреса интерфейсов). Таблицу local автоматически заполняют команды конфигурации сетевых интерфейсов.

  • Таблица main — является основной и именно она используется, если в команде, связанной с маршрутизацией, не указано какую таблицу использовать. При поднятии интерфейсов в неё прописываются маршруты к подсетям интерфейсов, стартовые скрипты также заносят в эту таблицу значение шлюза по-умолчанию. Использование команды route add администратором также может дополнить таблицу маршрутами. В общем случае, таблица main всегда содержит подходящий для пакета маршрут (например шлюз по-умолчанию).
  • Таблица default изначально пуста.
  • Модификация таблицы маршрутизации:

    Добавление маршрута через шлюз: ip route add 172.16.10.0/24 via 192.168.1.1
    Добавление маршрута через интерфейс: ip route add 172.16.10.0/24 dev eth0
    Маршрут с метрикой: ip route add 172.16.10.0/24 dev eth0 metric 100

    Кроме add также поддерживаются и другие действия: del — удалить маршрут; replace — заменить маршрут другим; change — изменить параметры маршрута.

Policy-Routing. Маршрутизация для двух ISP

  • Статическая маршрутизация в Linux

  • Роутинг и policy-routing в Linux при помощи iproute2

  • Принцип работы Routing Policy DataBase

Пример 1. Создание таблицы для маршрутизации пакетов с определенного IP- адреса. Локальная сеть 10.26.95.0/24 имеет выход в Интернет с двух разных провайдеров – основной ISP1 (статика) и резервный ISP2 (Настройка DHCP сервера Linux, FreeBSD).

В файле /etc/iproute2/rt_tables для удобства задаются символьные имена таблиц, это не обязательно так как все таблицы имеют цифровые идентификаторы. Напримерecho ’82 velton’ >> /etc/iproute2/rt_tables

  • Маршрут по умолчанию для таблицы ’82 velton’

    ip route add default via 82.117.232.1 table 82
  • Внесем правила маршрутизация для пользователя с IP 10.26.95.5, после чего эта таблица станет доступна в выводе команды ip rule list. Теперь все пользователи шлют пакеты через ISP1, кроме пользователя с IP 10.26.95.251

    ip rule add from 10.26.95.25132 table 82
  • Очистить кеш маршрутизатора для вступления в силу сделанных изменений

    ip route flush cache

Пример 2. Создание таблицы для маршрутизации, когда часть сетей (AS) нужно маршрутизировать через резервного провайдер ISP2. Например, это может быть дешевая точка обменом трафика или ресурсы провайдера.

  • Создаем как в предыдущем примере маршрут по умолчанию для таблицы ’82 velton’

    ip route add default via 82.117.232.1 table 82
  • Прописываем статические маршруты на сети ISP2

    ip route add 82.117.224.019 via 82.117.234.15
    ip route add 85.90.192.019 via 82.117.234.15
  • Добавим rule для всех сетей

    ip rule add to 82.117.224.019 table 82
    ip rule add to 85.90.192.019 table 82
  • Очистить кеш маршрутизатора для вступления в силу сделанных изменений

    ip route flush cache

IP route command example

For demonstration purpose we will use Packet Tracer network simulator software. Beside Packet Tracer you can use any other network simulator software such RouterSim, GNS, Boson or even better if you could afford, use real Cisco devices for follow this practice.

Create a practice topology as shown in fowling figure. Alternatively you can download this topology.

Device Connected from Connected to IP Address
PC0 FastEthernet0 Router0’s FastEthernet0/0 10.0.0.2/8
Router0 FastEthernet0/0 PC0’s FastEthernet0 10.0.0.1/8
Router0 Serial 0/0/0 Router1’s serial0/0/0 192.168.0.253/30
Router1 Serial 0/0/0/ Router0’s serial0/0/0 192.168.0.254/30
Router1 FastEthernet0/0 PC1’s FastEthernet0 20.0.0.1/8
PC1 FastEthernet0 Router1’s FastEthernet0/0 20.0.0.2/8

Assign IP address 10.0.0.2/8 to PC0.

Repeat same process for PC1 and assign IP address 20.0.0.2/8.

Assign IP address to interfaces of router

Double click Router0 and click CLI and press Enter key to access command prompt of router.

Two interfaces FastEthernet0/0 and Serial0/0/0 of Router0 are used in this topology.
By default interfaces on router are remain administratively down during the start up.
We need to configure IP address and other parameters on interfaces before we could actually use them for routing.
Interface mode is used to assign IP address and other parameters.
Interface mode can be accessed from global configuration mode.
Following commands are used to access global configuration mode.

Router>enable
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#

From global configuration mode we can enter in interface mode.
From there we can configure the interface.
Following commands will assign IP address on FastEthernet0/0.

Router(config)#interface fastEthernet 0/0
Router(config-if)#ip address 10.0.0.2 255.0.0.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#

interface fastEthernet 0/0 command is used to enter in interface mode.

ip address 10.0.0.2 255.0.0.0 command will assign IP address to interface.

no shutdown command will bring the interface up.

exit command is used to return in global configuration mode.

Serial interface needs two additional parameters clock rate and bandwidth. Every serial cable has two ends DTE and DCE.
These parameters are always configured at DCE end.
We can use show controllers interface command from privilege mode to check the cable’s end.

Router#show controllers serial 0/0/0
Interface Serial0/0/0
Hardware is PowerQUICC MPC860
DCE V.35, clock rate 2000000

Fourth line of output confirms that DCE end of serial cable is attached. If you see DTE here instead of DCE skip these parameters.

Now we have necessary information let’s assign IP address to serial interface.

Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#interface serial 0/0/0
Router(config-if)#ip address 192.168.0.253 255.255.255.252
Router(config-if)#clock rate 64000
Router(config-if)#bandwidth 64
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#

Router#configure terminal Command is used to enter in global configuration mode.

Router(config)#interface serial 0/0/0 Command is used to enter in interface mode.

Router(config-if)#ip address 192.168.0.253 255.255.255.252 Command assigns IP address to interface. For serial link we usually use IP address from /30 subnet.

Router(config-if)#clock rate 64000 And Router(config-if)#bandwidth 64 In real life environment these parameters control the data flow between serial links and need to be set at service providers end. In lab environment we need not to worry about these values. We can use these values.

Router(config-if)#no shutdown Command brings interface up.

Router(config-if)#exit Command is used to return in global configuration mode.

We will use same commands to assign IP addresses on interfaces of Router1. Since we have provided clock rate and bandwidth on serial interface of Router0 we need not to assign them on serial interface of Router1. Following command will assign IP addresses on interface of Router1.

Router>enable
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#interface fastEthernet 0/0
Router(config-if)#ip address 20.0.0.1 255.0.0.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface serial 0/0/0
Router(config-if)#ip address 192.168.0.254 255.255.255.252
Router(config-if)#no shutdown
Router(config-if)#exit

Add a Static Route to the Windows Routing Table

To add a static route to the table, you’ll type a command using the following syntax:

route ADD destination_network MASK subnet_mask  gateway_ip metric_cost

The and components are optional to the command. If you don’t specify a subnet mask, 255.255.255.0 will be used automatically. If you don’t specify a metric cost, a cost one greater than the 0.0.0.0 destination entry will be used. The metric cost value is just a cost that is relative to other costs in the table and is used when Windows decides between multiple routes that could reach the same destination.

So, for example, if you wanted to add a route specifying that all traffic bound for the 192.168.35.0 subnet went to a gateway at 192.168.0.2 and you just wanted to use the automatic metric cost, you would use the following command:

route ADD 192.168.35.0 MASK 255.255.255.0 192.168.0.2

If you were to use the command to look at the table now, you’d see your new static route.

That’s all easy enough, but there is one extra little catch. When you add a static route, by default it only lasts until the next time you start Windows. The reason for this is that many companies use a coordinated list of static routes that gets updated fairly often. Rather than adding and updating all those routes on every machine, they just distribute a batch script file that adds the newest routes during Windows startup. This keeps the routing table relatively uncluttered.

RELATED: How to Write a Batch Script on Windows

You could certainly use the batch script method yourself. Writing batch scripts isn’t hard. But if you’re just adding one or two static routes that you don’t expect to change often, you can instead just add the option to the command to make the route persistent. A persistent route stays in place even when Windows starts up. Using the same command we used earlier, you could make that route persistent with the following modification:

route -p ADD 192.168.35.0 MASK 255.255.255.0 192.168.0.2

Настройка маршрутов в Linux

Вы можете настраивать таблицу маршрутизации с помощью команды ip. Например, чтобы изменить маршрут по умолчанию достаточно выполнить:

Так вы можете добавить маршрут для любого IP адреса, например, для 243.143.5.25:

Все очень просто, сначала указывается IP адрес цели, а затем шлюз в локальной сети, через который можно достичь этого адреса. Но такие маршруты будут активны только до перезагрузки, после перезагрузки компьютера они будут автоматически удалены. Чтобы маршруты сохранились их нужно добавить в файл конфигурации.

В операционных системах семейства Red Hat используются конфигурационные файлы /etc/sysconfig/network-scripts/route-ethX. Каждый файл может описывать несколько маршрутов, например:

Здесь gateway — шлюз по умолчанию для этого интерфейса, netmask — маска сети, а ipaddr — ip адрес интерфейса. В Debian и основанных на нем дистрибутивах можно настроить маршруты в файле /etc/network/interfaces. Здесь команда route добавляется в секцию iface. Например:

С помощью опции -net мы указываем целевую сеть, netmask — это маска сети, а gw — шлюз. Все очень просто. Теперь добавленные маршруты останутся даже после перезагрузки.

Пару вступительных слов о маршрутизации

Итак, из основных понятий сетей мы знаем, если сетевой пакет предназначен для локальной сети, к которой подключен интерфейс, то он направляется прямо в сеть. Маршрут для такого пакета создается автоматически при поднятии настроенного интерфейса. Если пакет предназначен не локальной сети, то ядро просматривает таблицу маршрутизации на наличие маршрута для данного пакета и отправляет по маршруту, в котором адрес назначения пакета соответствует заданному в маршруте параметру — на адрес шлюза, который указан в поле gateway в маршруте.  При этом, может существовать несколько маршрутов для данного пакета. В таком случае выбирается тот маршрут, в котором в заданной подсети меньше всего компьютеров. Если для текущего пакета маршрут не обнаружен, то он направляется на маршрут «по-умолчанию». Это классическая маршрутизация протокола IPv4, основанная на поиске маршрута по адресу назначения в заголовках IP.

Маршруты в  Linux могут появляться различными способами. Во-первых, как я уже говорил, при поднятии сетевого интерфейса появляется соответствующий маршрут в локальную сеть, куда смотрит интерфейс. Во-вторых, маршруты могут добавляться в ручную. Это называется статическая маршрутизация. В-третьих, маршруты могут формироваться динамически, базируясь на информации о топологии и состоянии сети, получаемой с помощью протокола динамической маршрутизации. Это называется динамической маршрутизацией. Динамической маршрутизацией в Linux заведует демон gated или routed, возможно еще какой-то о котором я не знаю

Классическую маршрутизацию на основе адреса назначения применяют в небольших сетях. Данную маршрутизацию можно сравнить с походом из дома, например, в торговый центр. При этом, дорога к торговому центру может быть разделена перекрестком и на перекрестке вы выбираете пойти вам на право или налево, основываясь лишь на том, по какой из дорог вы попадете к ТЦ.

II. A Sample Network Architecture (to understand routing)

Let us use the following sample network architecture for the rest of the examples.

In the diagram below, we have 2 individual networks ( 192.168.1.0 and 192.168.3.0, with subnet mask of 255.255.255.0 ).

We also have a “GATEWAY” machine with 3 network cards. 1st card is connected to 192.168.1.0, 2nd card is connected to 192.168.3.0, and the 3rd card is connected to the external world.

5. Make 192.168.3.* Accessible from 192.168.1.*

Now we need to add a routing entry such that we are able to ping 192.168.3. series ip-addresses from 192.168.1. series. The common point we have is the GATEWAY machine.

So, on each machine in 192.168.1.* network a default gateway will be added as shown below.

$ route add default gw 192.168.1.10

Now when 192.168.1.1 pings 192.168.3.1, it will go to the GATEWAY via 192.168.1.10.

In GATEWAY, add the following routing entry.

$ route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.3.10

Now all the packets addressed to 192.168.3.* network will be forwarded via the 192.168.3.10 interface, which then delivers the packets to the addressed machine.

6. Make 192.168.1.* Accessible from 192.168.3.*

It is very similar to what we did earlier.

So, on each machine in 192.168.3.* network a default gateway will be added as shown below.

$ route add default gw 192.168.3.10

In GATEWAY, add the following routing entry.

$ route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.10

Now 192.168.3.* machines can ping 192.168.1.* machines.

7. Allow Internet Access ( External World )

In the previous two example, we have interconnected the 2 different networks.

Now we need to access the internet from these 2 different networks. For that, we can add a default routing ( when no routing rule matches ) to the 125.250.60.59 which is connected to the external world as follows.

$ route add default gw 125.250.60.59

This is how it works:

  1. Now when you try to access the internet (for example: ping google.com) from any of these machines (for example, from 192.168.3.2), the following is the sequence of events that happens.
  2. Since the destination (google.com) is not within 3.* series, it will be forwarded to GATEWAY via 3.10 interface
  3. In GATEWAY, it checks whether the destination is within 1.* range. In this example, it is not.
  4. It then checks whether the destination is within 2.* range. IN this example, it is not
  5. Finally, it takes the default route to forward the packets (i.e using the 125.250.60.59 interface, which is connected to the external world).

If you enjoyed this article, you might also like..

  1. 50 Linux Sysadmin Tutorials
  2. 50 Most Frequently Used Linux Commands (With Examples)
  3. Top 25 Best Linux Performance Monitoring and Debugging Tools
  4. Mommy, I found it! – 15 Practical Linux Find Command Examples
  5. Linux 101 Hacks 2nd Edition eBook 
  • Awk Introduction – 7 Awk Print Examples
  • Advanced Sed Substitution Examples
  • 8 Essential Vim Editor Navigation Fundamentals
  • 25 Most Frequently Used Linux IPTables Rules Examples
  • Turbocharge PuTTY with 12 Powerful Add-Ons

Средства мониторинга и анализа сети со статической маршрутизацией

Вследствие того, что статические маршруты требуют ручной конфигурации, каждый раз при изменении топологии сети или других факторов важным моментом является наличие средств мониторинга сети для своевременного выявления неработающих узлов или шлюзов. Как правило, возможностей стандартных утилит ping (проверка соединения с узлом), ifconfig, traceroute (трассировка маршрутов следования до узла – по умолчанию в пределах 30 «прыжков»), route и netstat, входящих в состав любого дистрибутива GNU/Linux, оказывается достаточно для диагностики проблемы. Одной из полезных утилит, служащих для анализа сетевого трафика и отладки сетевой конфигурации, также является tcpdump.

Для графического отображения трассировки к хостам используется утилита tracemap3, написанная на Perl. С ее помощью можно строить графические карты для нескольких удаленных узлов, например, отдельной филиальной сети.

3http://xgu.ru/wiki/Tracemap

Просмотр маршрутов в Linux

Команда выводит на экран все содержимое таблицы IP-маршрутизации и позволяет изменять записи.

$ $ route --help
Использование: route    Отобразить таблицу маршрутизации ядра
       route   {add|del|flush} ... Изменить таблицу маршрутизации для AF.

       route {-h|--help}  Детальное описание использование указанной AF.
       route {-V|--version} Отобразить версию/автора и выйти.

        -v, --verbose более детальный вывод
        -n, --numeric не преобразовывать адреса в имена
        -e, --extend отображать другую/больше информации
        -F, -fib отобразить информацию форвардинга базы (по умолчанию)
        -C, --cache отобразить кэш маршрутизации вместо FIB

  <AF>=Use -4, -6, '-A <af>' or '--<af>'; default: inet
  Список возможный адресных семейств (которые поддерживают маршрутизацию):
    inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25) 
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) 
    x25 (CCITT X.25)

Просмотр таблицы маршрутизации:

$ route
Таблица маршрутизации ядра протокола IP
Destination     Gateway    Genmask         Flags   Metric   Ref   Use   Iface
default         _gateway   0.0.0.0         UG      100      0     0     enp0s3
link-local      0.0.0.0    255.255.0.0     U       1000     0     0     enp0s3
192.168.110.0   0.0.0.0    255.255.255.0   U       100      0     0     enp0s3
$ route -n
Таблица маршрутизации ядра протокола IP
Destination     Gateway         Genmask         Flags   Metric   Ref   Use   Iface
0.0.0.0         192.168.110.1   0.0.0.0         UG      100      0     0     enp0s3
169.254.0.0     0.0.0.0         255.255.0.0     U       1000     0     0     enp0s3
192.168.110.0   0.0.0.0         255.255.255.0   U       100      0     0     enp0s3

Утилита предоставляет возможность определить маршрут, по которому проходит пакет до заданного узла:

$ sudo apt install traceroute
$ traceroute ya.ru
traceroute to ya.ru (87.250.250.242), 30 hops max, 60 byte packets
 1  _gateway (192.168.110.1)  0.697 ms  0.607 ms  0.584 ms
 2  78.107.125.69 (78.107.125.69)  2.050 ms  1.967 ms  1.777 ms
 3  stpert-bng1-local.msk.corbina.net (85.21.0.172)  1.679 ms  1.605 ms  1.499 ms
 4  10.2.254.10 (10.2.254.10)  2.215 ms  2.180 ms  2.167 ms
 5  korova-bb-be5.corbina.net (195.14.54.195)  3.577 ms  3.544 ms  3.824 ms
 6  85.21.224.96 (85.21.224.96)  2.645 ms  2.208 ms  2.149 ms
 7  m9-crs-be13.corbina.net (85.21.224.54)  3.762 ms  3.207 ms  3.794 ms
 8  m9-br-be3.corbina.net (195.14.62.85)  3.716 ms  3.639 ms m9-br-be1.corbina.net (195.14.54.79)  3.559 ms
 9  corbina-gw.dante.yandex.net (83.102.145.178)  6.750 ms  11.716 ms  16.226 ms
10  ya.ru (87.250.250.242)  5.330 ms  8.678 ms  8.628 ms

Поиск:
Linux • Windows • Локальная сеть • route • Маска сети • Шлюз • Маршрут • Таблица • Адрес • Команда

Преимущества и недостатки динамической маршрутизации

Динамическая маршрутизация используется преимущественно в средних и крупных сетях со сложной, часто меняющейся инфраструктурой, где прежде всего важна оперативность отслеживания и устранения проблем связи. Это достигается за счет программного управления таблицами маршрутизации при помощи демонов (в unix-подобных системах для этих целей используются процессы routed и gated). Периодический обмен информацией между маршрутизаторами осуществляется с помощью соответствующих протоколов — на основании полученных данных корректируются записи в таблицах маршрутизации.

Использование протоколов динамической маршрутизации значительно сокращает затраты труда системного администратора по обслуживанию сети

Однако следует принимать во внимание тот факт, что при этом повышается нагрузка на процессоры маршрутизаторов и, как следствие, на сеть в целом. Отчасти данная проблема решается за счет использования динамической балансировки сетевой нагрузки и прописывания статических маршрутов отдельным сегментам сети

Но динамическая маршрутизация обладает и другим серьезным недостатком — возрастает риск DDOS-атак или перехвата сетевого трафика. В данных условиях повышение безопасности сети становится одной из приоритетных задач системного администратора.

Поиск оптимального маршрута

Смотрите на следующем рисунке участок дорожной сети с узлами и построенного маршрута с порядковыми номерами посещенных домов:

Кроме уже означенной проблемы с направлениями движения, местами можно заметить странный порядок нумерации — например, смотрите номера 245,246,247 и другие. Вы можете захотеть «покрутить» доступные параметры для алгоритма отжига — но, даже если это удастся сделать, найденные подходящие параметры для конкретного маршрута не помогут с любым другим маршрутом. Вместо попыток подбора параметров и увеличения времени вычисления следует заняться улучшением дорожной сети (и матрицы расстояний), например, за счет жесткого указания направлений движения.

Заключение

В этой статье мы улучшили возможности PgRouting, добавив к нему несколько своих функций. Теперь мы можем двигаться по дорогам в правильном направлении, что необходимо для построения реальных маршрутов и позволяет значительно улучшить итоговый маршрут, поскольку при этом количество возможных маршрутов кардинально снижается.

Если рассмотреть весь маршрут детально, то его еще можно улучшить, в том числе, с помощью оптимизации параметров функции pgr_TSP(). Но дело в том, что только путем оптимизации этих параметров подобного полученному выше результату добиться не удастся — в самом деле, алгоритм оптимизации маршрутов PgRouting ничего «не знает» про наши предпочтения о последовательной нумерации и другие. Так что поддержка односторонних дорог, на самом деле, дает нам намного больше, чем можно было бы ожидать.

Можно ли добиться аналогичного результата с последовательной нумерацией зданий между перекрестками иначе, не увеличивая матрицу весов с соответствующим замедлением построения маршрута? Да, можно. Более того, можно еще и значительно ускорить построение маршрута (например, на один-два десятичных порядка), в том числе, с учетом односторонних дорог. Об этом мы и поговорим в следующий раз.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *