有没有办法使用 ns3.js 在多播网络中实现节点的动态修剪/移植。我能找到的资源都只为多播网络实现静态路由。
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)
。
静态组播路由用于从一个 LAN 路由到另一个 LAN。在现实世界中,我们需要一个知道如何路由多播的路由器。在 ns-3 模拟世界中,我们需要一个知道如何路由多播的路由器。因此,在 ns-3 中,我们需要设置从一个 LAN 到另一个 LAN 的静态路由,该路由AddMulticastRoute()
安装在模拟中充当路由器的节点上。
如果有一个 ns-3 助手可以在 aNodeContainer
和NetDeviceContainer
. 但是,该方法需要一个 Node 及其关联的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 应用程序会实际加入 Multicast 组。
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 }