如何使用ns3实现组播动态join / prune

时间:2013-04-03 18:24:51

标签: c++ multicast ns-3

有没有办法使用ns3在多播网络中实现节点的动态剪枝/移植。我能找到的资源都只实现了组播网络的静态路由。

1 个答案:

答案 0 :(得分:0)

参考: http://www.nsnam.org/docs/release/3.16/doxygen/classns3_1_1_ipv4_static_routing_helper.html#ae69a07ded3139dfd4e21bb7c10eba416

在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帮助程序可以在NodeContainerNetDeviceContainer上安装默认多播路由,那就太好了。但是,该方法需要一个节点及其关联的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     }