【NS3网络仿真】节点、接口、接口地址的映射关系


前言

若一个节点有i个相邻的节点,则该节点就有i个接口,每个接口都会有一个ipv4地址,有时我们需要得到某个节点接口的ip,有时我们需要根据一个ipv4地址得到它属于哪个节点。
这部分建议阅读node.cc、ipv4-interface.cc、ipv4-interface-container.cc、ipv4address.cc等源码,官方的源码中有很多很实用的接口。


一、获得节点n第i个接口的ip地址(i为接口索引)

c为节点容器,首先获取到节点的ipv4对象,然后得到第i个接口的地址,具体代码如下:

Ptr<Ipv4> ippp = c.Get(n)-> GetObject<Ipv4> ();
Ipv4Address ipaddress = ippp->GetAddress(i,0).GetLocal();

二、根据ipv4地址得到节点序号

这个过程我在ns3中没有找到相应的接口函数,所以只能自己写。
基本原理:将该ipv4地址与网络中所有节点接口的ipv4地址做对比,找到对应的节点并输出节点序号。

for (int n = 0; n < 14; ++n)//假设网络中有14个节点,需要对所有节点进行遍历
  {
    Ptr<Ipv4> ippp = c.Get(n)-> GetObject<Ipv4> ();
    int interfacenumber = ippp->GetNInterfaces();//得到该节点的接口数目
    for (int iterate = 1; iterate < interfacenumber; ++iterate)//遍历该节点的每一个接口
    {
      Ipv4Address ipaddress = ippp->GetAddress(iterate,0).GetLocal();//获取到所有节点的接口IP地址
      if (ipaddress == Destination)//将获取的所有接口IP与目的节点IP比较,并输出节点序号
      {
        std::cout << "destination node:" << n << endl;
        
        node_number = current_node;
        //在接收端将网络观测值Destination_node记录至SDObs中
        SDObs[node_number].Destination_node.push_back(i);
      }
      if (ipaddress == Source)//将获取的所有接口IP与源节点IP比较,并输出节点序号
      {
        std::cout << "source node:" << i << endl;
      }
    }
  }


# 总结学习NS3首先需要清楚节点、接口及接口地址的一一对应关系,有助于后续理解协议栈安装及应用安装等过程。

版权声明:本文为weixin_42659457原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。