有没有办法使用ns3在多播网络中实现节点的动态剪枝/移植。我能找到的资源都只实现了组播网络的静态路由。
答案 0 :(得分:0)
在ns-3中,我们为执行SetDefaultMulticastRoute(dev,nd)
的节点的路由表设置了一个默认的多播路由,正如文档所述,它等同于执行以下操作:
route add 224.0.0.0 netmask 240.0.0.0 dev nd
在物理世界中为linux服务器设置组播时,我们需要在路由表中为组播地址设置路由。在ns-3模拟世界中,我们必须对使用SetDefaultMulticastRoute(dev,nd)
创建的每个节点执行相同的操作。
静态组播路由用于从一个LAN路由到另一个LAN。在现实世界中,我们需要一个知道如何路由多播的路由器。在ns-3仿真世界中,我们需要一个知道如何路由多播的路由器。因此,在ns-3中,我们需要使用AddMulticastRoute()
设置从一个LAN到另一个LAN的静态路由,该路由安装在充当路由器的模拟节点上。
如果有一个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
您可以看到如何设置组播数据包的发送方和接收方。它确实包括两个LAN之间的静态路由。此示例中的接收器没有默认的多播路由设置。内联注释表明所有节点都将从源接收多播帧 - 源是我们为其执行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 }