Есть ли способ реализовать динамическую обрезку/прививку узлов в многоадресной сети с помощью ns3. На ресурсах мне удалось найти все реализующие только статическую маршрутизацию для многоадресных сетей.
Как реализовать многоадресное динамическое соединение/обрезку с помощью ns3
Ответы (1)
В ns-3 мы устанавливаем многоадресный маршрут по умолчанию для таблицы маршрутизации узла, выполняющей SetDefaultMulticastRoute(dev,nd)
, что, как указано в документации, эквивалентно выполнению следующего:
route add 224.0.0.0 netmask 240.0.0.0 dev nd
При настройке многоадресной рассылки для Linux-сервера в физическом мире нам необходимо иметь маршрут для многоадресных адресов в таблице маршрутизации. В мире моделирования ns-3 мы должны делать то же самое для каждого узла, который мы создаем с помощью SetDefaultMulticastRoute(dev,nd)
.
Статические многоадресные маршруты предназначены для маршрутизации из одной локальной сети в другую. В реальном мире нам нужен маршрутизатор, который умеет маршрутизировать многоадресную рассылку. В мире моделирования ns-3 нам нужен маршрутизатор, который умеет маршрутизировать многоадресную рассылку. Таким образом, в ns-3 нам нужно настроить статический маршрут из одной локальной сети в другую, используя AddMulticastRoute()
, который установлен на узле в моделировании, выступающем в качестве маршрутизатора.
Было бы неплохо иметь помощника ns-3, который устанавливал бы многоадресный маршрут по умолчанию на NodeContainer
и NetDeviceContainer
. Однако методу нужен один узел и связанный с ним NetDevice
, поэтому вам нужно использовать цикл, чтобы установить их все, предполагая, что 0..N
узлы в NodeContainer
напрямую связаны с 0..N
узлами в NetDeviceContainer
.
for (int i = 0; i < N; i++) {
Ptr<Node> sender = nodecontainer.Get (i);
Ptr<NetDevice> senderIf = netdevicecontainer.Get (i);
multicast.SetDefaultMulticastRoute (sender, senderIf);
}
Ссылка на это: http://www.nsnam.org/docs/release/3.16/doxygen/csma-multicast_8cc_source.html
Вы можете увидеть, как настроены отправитель и получатель многоадресных пакетов. Он включает статический маршрут между двумя локальными сетями. У приемника в этом примере нет настройки многоадресного маршрута по умолчанию. Во встроенных комментариях указано, что все узлы получат многоадресный кадр из источника, причем источником является узел, для которого мы выполняем SetDefaultMulticastRoute(source,sourceIf)
.
Обратите внимание, что комментарии к этому коду указывают на то, что источник получает отправленный им многоадресный кадр.
Ссылка на это: http://www.nsnam.org/docs/release/3.16/doxygen/udp-echo-server_8cc_source.html
Приложение ns3, которое вы пишете, выполняет фактическое присоединение к группе многоадресной рассылки.
78 if (m_socket == 0)
79 {
80 TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
81 m_socket = Socket::CreateSocket (GetNode (), tid);
82 InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), m_port);
83 m_socket->Bind (local);
84 if (addressUtils::IsMulticast (m_local))
85 {
86 Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket> (m_socket);
87 if (udpSocket)
88 {
89 // equivalent to setsockopt (MCAST_JOIN_GROUP)
90 udpSocket->MulticastJoinGroup (0, m_local);
91 }
92 else
93 {
94 NS_FATAL_ERROR ("Error: Failed to join multicast group");
95 }
96 }
97 }