NS3学习--dynamic-global-routing

一、学习工具:

   1.  参考资源:

        a.《ns-3网络模拟器基础及应用》

        b. NS-3中文手册

        c. NS3官网 https://www.nsnam.org/ ,下载ns-3 manual/ns-3 tutorial,

            在线ns-3 doxygen查找需要的函数跳转.  https://www.nsnam.org/docs/release/3.29/doxygen/

    2.  代码阅读撰写:

        a. Windows下使用 source insight阅读,编写代码可以自动补全以及提示错误;

        b. Linux下使用 eclipse进行代码阅读,debug调试等;

        c. 两者结合使用效果更佳。

二、学习内容:NS3目录下/examples/routing/dynamic-global-routing.cc

    1.  代码实现内容(可查看本文件注释,解释的很详细):

        该动态路由实现了点对点(point-to-point)和csma信道传输,在特定时间传输UDP数据流,并设置节点ipv4接口的开关来实现动态计算路由。

        a. 拓扑结构如下:


        b. 事件顺序:

        1s-16s 第一个CBR/UDP数据流从n1-n6,10s-16s第二个CBR/UDP数据流从n1-n6;在准备阶段,会预先计算全局路由,n1-n6的点对点最短路径;

        1s:第一个n1-n6的数据流开启;

        2s:n1节点关闭down,n1-n6链路断开,n1和n6重新计算路径,n1-n2-n5-n6;

        4s:n1节点打开up,n1-n6链路重新连接,n1和n6重新计算路径,n1-n6;

        6s:n6节点关闭down,n1-n6链路断开,n1和n6重新计算路径,n1-n2-n5-n6;

        8s:n6节点打开up,n1-n6链路重新连接,n1和n6重新计算路径,n1-n6;

        10s:第一个数据流停止传输;

        11s:第二个数据流开始传输;

        12s:n1节点关闭down,n1-n6链路断开,n1和n6重新计算路径,n1-n2-n5-n6;

        14s:n1节点打开up,n1-n6链路重新连接,n1和n6重新计算路径,n1-n6;

        16s:第二个数据流停止传输。

      2. 代码详解,主函数部分

//设置全局路由能够根据接口状态触发全局路由重新计算,默认值为假,即关闭,在这里需要设置为真开启。

Config::SetDefault("ns3::Ipv4GlobalRouting::RespondToInterfaceEvents", BooleanValue(true));

//日志,创建节点。

 NS_LOG_INFO("Create nodes.");

//使用NodeContainer 类创建七个节点,节点编号从0开始。

//点对点信道的两个节点组成一个节点容器,本例中,csma信道的四个节点还会组成一个节点容器,一共五个容器。

 NodeContainer c;

 c.Create (7);

 NodeContainer n0n2= NodeContainer (c.Get (0), c.Get (2));

 NodeContainer n1n2= NodeContainer (c.Get (1), c.Get (2));

 NodeContainer n5n6= NodeContainer (c.Get (5), c.Get (6));

 NodeContainer n1n6= NodeContainer (c.Get (1), c.Get (6));

 NodeContainern2345 = NodeContainer (c.Get (2), c.Get (3), c.Get (4), c.Get (5));

//为创建的每个节点安装协议栈,InternetStackHelper类会为每个节点安装一个网络协议栈,主要是IP层。

InternetStackHelper internet;

internet.Install (c);

//日志,创建信道

NS_LOG_INFO ("Create channels.");

//使用PointToPointHelper类帮助创建p2p信道,即类+信道名称。

PointToPointHelper p2p;

//调用PointToPointHelper类中的设置设备属性函数SetDeviceAttribute 设置数据传输速率为5Mbps(这里的数据传输速率我个人认为应该是带宽吧..),调用设置信道属性函数SetChannelAttribute设置信道传输时延为2ms(参考ns3.PointToPointHelper.h)。

p2p.SetDeviceAttribute ("DataRate", StringValue("5Mbps"));

p2p.SetChannelAttribute ("Delay", StringValue("2ms"));

//应用PointToPointHelper类中的NetDeviceContainer Install (NodeContainer c);函数将以上设置的属性应用于节点和信道中,并将对应节点和信道放入NetDeviceContainer,即对应的一个信道的两个节点设置对应的NetDevice,然后放入容器中。

NetDeviceContainer d0d2 = p2p.Install (n0n2);

//csma信道同理,调用CsmaHelper类进行相应设置操作。

CsmaHelper csma;

csma.SetChannelAttribute ("DataRate",StringValue ("5Mbps"));

csma.SetChannelAttribute ("Delay", StringValue("2ms"));

NetDeviceContainer d2345 = csma.Install (n2345);

//设置IP地址

 NS_LOG_INFO("Assign IP Addresses.");

//调用 Ipv4AddressHelper类分配地址,唯一用户可见的API是通过设置基IP地址和子网掩码分配完成的,如下从10.1.1.0开始以子网掩码为

255.255.255.0分配地址,地址默认是从1开始单调增长。

 Ipv4AddressHelperipv4;

 ipv4.SetBase("10.1.1.0", "255.255.255.0");

//然后为上述设置的NetDevice容器中的每个节点设置一个地址,如下,节点n0对应的设备d0的ip地址为10.1.1.1,节点n2对应的设备d2的ip地址为10.1.1.2,若还有其他设备依次按照顺序分配地址。

//完整函数为Ipv4InterfaceContainer中的Ipv4AddressHelper::Assign

(const NetDeviceContainer &c),使用Ipv4接口容器对象将一个IP地址同一个设备关联起来。

//每个NetDevice都有一个关联的IPv4接口,一个ipv4接口可以有一个或者与之相关的ipv4地址。

 ipv4.Assign(d0d2);

 ipv4.SetBase("10.1.3.0", "255.255.255.0");

 Ipv4InterfaceContaineri5i6 = ipv4.Assign (d5d6);

//调用Ipv4GlobalRoutingHelper类中的PopulateRoutingTables

()成员函数,主要是建立路由数据库然后对仿真中的所有节点初始化路由表,让仿真中所有节点都会带有一个路由器。

 Ipv4GlobalRoutingHelper::PopulateRoutingTables();

/*在ipv4-global-routing-helper.cc文件中对PopulateRoutingTables

()函数定义如下,实则是调用建立全局路由数据库和初始化路由表的函数。

void

Ipv4GlobalRoutingHelper::PopulateRoutingTables (void)

{

 GlobalRouteManager::BuildGlobalRoutingDatabase ();

 GlobalRouteManager::InitializeRoutes ();

}

*/

//日志,开始创建应用,

NS_LOG_INFO ("Create Applications.");

//指定端口

uint16_t port = 9;  // Discard port (RFC 863)

//应用 OnOffHelper类中的OnOffHelper (std::string protocol, Address address); 函数帮助创建数据流

//参考inetsocketaddress.h中 InetSocketAddress (Ipv4Address ipv4, uint16_t

port);

    函数得到OnOffHelper上述函数中的地址参数Address

/*参考ipv4-interferce-container.cc中如下函数得到,i5i6对应的ipv4接口容器中第一个接口(0代表i5,1代表n6节点的接口)的ipv4地址

Ipv4Address

Ipv4InterfaceContainer::GetAddress (uint32_t i, uint32_tj) const

*/

OnOffHelper onoff ("ns3::UdpSocketFactory",

                    InetSocketAddress (i5i6.GetAddress (1), port));

//设置应用属性,即这里的UDP数据流,数据传输速率和数据包大小。还可以设置其他属性,包括开关时间等。

onoff.SetConstantRate (DataRate ("2kbps"));

onoff.SetAttribute ("PacketSize", UintegerValue(50));

onoff2.SetAttribute ("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));

onoff2.SetAttribute ("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0]"));

//为节点设置应用并一起放置与ApplicationContainer这个容器中,参考on-off-helper.h中原型函数:

ApplicationContainer Install (Ptr<Node> node)

const;这里应该是使用了c++中的隐式转换,

利用NodeContainer中的Get()函数得到节点指针,这里是为节点1设置application应用。

//然后设置开始时间,结束时间。

ApplicationContainer apps = onoff.Install (c.Get (1));

apps.Start (Seconds (1.0));

apps.Stop (Seconds (10.0));

//利用packetsinkhelper帮助创建一个用于接收数据的对象,原函数为packet-sink-helper.h中的:

PacketSinkHelper (std::string protocol, Address address);

//Ipv4Address::GetAny (),返回值为0.0.0.0

//在创建的applicationcontainer应用容器中,将接收数据对象绑定在节点n6上,意味着n6在1s-10s接收网络中的数据。

PacketSinkHelper sink ("ns3::UdpSocketFactory",

                        Address (InetSocketAddress (Ipv4Address::GetAny (), port)));

apps = sink.Install (c.Get (6));

apps.Start (Seconds (1.0));

apps.Stop (Seconds (10.0));

//对节点n1设置接口开关,先从nodecontainer获取节点转化为指针n1

Ptr<Node> n1

= c.Get (1);

//inline

Ptr<T> GetObject (void) const;将参数转化为一个指针

Ptr<Ipv4>

ipv41 = n1->GetObject<Ipv4> ();

uint32_t

ipv4ifIndex1 = 2;

//Simulator::Schedule (Time const &delay, const

Ptr<EventImpl> &event),设置事件,包括发生时间和事件类型,

//原型函数参考simulator.h中函数:staticEventId Schedule (Time const &delay, MEM mem_ptr, OBJ obj, T1 a1);

// MEM mem_ptr成员方法指针,OBJ obj应用成员方法的对象指针,T1 a1调用的对象。

//这里是对n1节点的接口设置开关状态

Simulator::Schedule (Seconds(2),&Ipv4::SetDown,ipv41, ipv4ifIndex1);

Simulator::Schedule (Seconds (4),&Ipv4::SetUp,ipv41,ipv4ifIndex1);

//该部分就是计算计算路由,生成路由表等,关于路由下次详细解释。

Ipv4GlobalRoutingHelper g;

Ptr routingStream =Create ("dynamic-global-routing.routes",std::ios::out);

g.PrintRoutingTableAllAt (Seconds (12), routingStream);

//设置仿真参数,代码主函数完成。

NS_LOG_INFO ("Run Simulation.");

Simulator::Run ();

Simulator::Destroy ();

NS_LOG_INFO ("Done.");

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Network Layer(!) 网络层功能 网络层里最核心的两个功能是:路由(routing)与转发(forwa...
    我是小栗子阅读 4,673评论 1 10
  • 博主最近在复习HTTP,之前用书主要是《计算机网络》谢希仁版本,最近结合网上博客,进行复习和提纲式的总结。 一、概...
    stoneyang94阅读 4,138评论 1 8
  • 建议学习时长: 30分钟学习方式:深入 学习目标 知道 rem 计算值的方式。 知道如何用 rem 来做不同尺寸的...
    知行社阅读 1,494评论 0 2
  • 哪里会有人喜欢孤独,不过是不喜欢失望罢了。 绅士就是:所做的,不是自己想做之事,而是自己应做之事。 “唔,大概去了...
    skevon阅读 442评论 0 0