科学网

 找回密码
  注册
科学网 标签 NS2

tag 标签: NS2

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]网络拓扑生成
热度 2 damao12 2012-12-22 10:02
概述 在计算机网络研究中,经常需要对新的应用程序、体系结构或者协议等进行评估,因此基于真实网络的网络模拟就成了计算机网络研究的一种重要方法。由于网络存在多样性和复杂性,影响网络模拟稳定性的重要因素就是所使用的网络拓扑模型。用尽量能反映真实网络的模型作为对真实网络环境的一种抽象,使之作为网络模拟的基本输入,是取得正确结果的必要条件。   目前的网络拓扑生成模型主要是建立在随机模型、 层次结构 模型或幂律模型的基础上,常用的拓扑生成方法/模型有Waxman,Tiers,Transit-stub,BA,Inet等。其中Waxman为随机模型,Tiers和Transit-stub建立在 层次结构 的基础上,BA和Inet都是基于幂律模型。Brite和Inet则是典型的拓扑生成器,可以基于前述的模型进行网络拓扑的模拟生成,通过其生成的网络拓扑数据对于研究实际生活中的网络状况和协议性能有很重要的作用。   网络拓扑生成,作为网络模拟的前端输入,是网络模拟的重要内容,也是决定网络模拟真实性和可靠性的重要因素。对网络拓扑生成的研究是当今网络研究领域的重要课题,而对真实世界中网络拓扑的研究和模拟,则是优化现有网络、开发 下一代网络 协议、测试新网络协议的基础。   网络拓扑生成是一个新兴的研究领域,始于20世纪90年代,在近几年得到了较大的发展。其中Boston大学的brite、Umich大学的inet、Louis Pasteur大学的nem等都是比较流行的网络拓扑生成器。 网络拓扑模型   研究 路由协议 ,对于研究者来讲,直接在商业网络上进行路由测试是基本做不到的,并且在某个网络上测试会将测试结果局限于该网络上。此外,在特定的网络上表现良好的 路由协议 ,当该网络的拓扑结构发生变化或移植到其他不同的网络时,不一定能表现出同样的性能。因此, 路由协议 通常先在随机网络上进行测试。   从表面上看,网络中各 节点 的分布似乎是均匀的, 主机 的接入和断开具有很大的随机性,因而,网络整体的 拓扑结构 应当呈现均匀分布的特性,或者说其节点的度(degree)是均匀分布的(度指连到特定节点的链路数目)。但是通过对大量的实际数据研究表明,实际网络的 度分布 呈幂律(Power-Law)分布特性,这说明了在网络中既有大量连接松散的 节点 ,也存在一些连接紧密的节点,而且各个标度的节点都广泛存在。   利用NS-2进行网络仿真需要建立合适的网络拓扑模型来反映真实网络拓扑的某些本质的特性(如接点度的分布)。现在主流的网络拓扑模型主要有随机型、层次型和幂律型三类。   (1)随机型,即认为 网络拓扑图 处于一个完全无序的状态,在大尺度上是均一的最早的随机模型是由Waxman提出来的。Waxman认为节点之间的连接概率与其距离相关,服从泊松分布,距离越近,概率越大。   (2)层次型,来自对网络结构所具有的层次特征的认识,在同一层上的节点 出度 接近,不同层间节点出度差别很大。对同一层上的节点布置借用Waxman模型方法。   (3)幂律型,1999年,Faloutsos等人对NLANR(National Lab for Applied Network Research)在1997-1998年间的3份BGP数据以及1995年的一份tracerouter测量数据进行分析,发现网络拓扑中存在着幂律规律。 拓扑生成器的发展   拓扑生成器是拓扑生成算法的软件实现,是生成拓扑的工具,其设计目标可归纳为3点:   (1)代表性,即生成的拓扑图要能够准确反映实际网络拓扑的各个方面;   (2)包含性,即将许多生成模型合并在一起,提供一个通用的拓扑生成工具;   (3)兼容性,即为网络模拟应用程序(如NS-2)以及 可视化工具 (如CAIDA的Otter )提供接口。   为了实现这些目标,一个拓扑生成器主要包括3个功能模块:   (1)格式转换:由于目前没有统一的拓扑数据文件格式标准,所以拓扑生成器要具有在各种拓扑测量数据,拓扑生成器输入输出数据以及网络模拟软件输入数据之间进行文件格式转换的功能。   (2)拓扑生成:这是拓扑生成器的核心,除了根据已有的拓扑生成算法实现幂律之外,还要依据其他度量来产生拓扑图。   (3)拓扑分析:根据拓扑生成模块中所采用的度量来对拓扑数据进行统计分析,给出度量的值。   拓扑生成器的发展经历如下过程:    Waxman   Waxman是第一代发展起来的拓扑生成器。此生成器在Erdouml;s-Renyi随机图模型的基础上产生随机图,但是它包括一些网络特殊特征,比如把 节点 放置在平面上,利用一定的概率来连接两个节点。    GT-ITM   GT-ITM最大的特点就是提供了Transit-Stub(TS)模型,此模型集中于对 分层结构 网络的再生成。TS模型将AS域划分为Transit类和Stub类。在该模型中,Transit节点彼此互联构成一个节点群,一个或多个Transit节点群构成拓扑图的核心,而Stub 节点分布在Transit节点群四周与Transit节点相连。    Inet   Inet是密歇根大学于1999~2002年间开发的一个AS级拓扑产生器,最新发布的是3.0版本。其特点是利用route-views. oregon-ix. net上从1997年11月到2002年2月间的大量BGP数据来确定拓扑度量的值,可信性很高。Inet采用PLGR算法与优先附着实现幂律,重视连通性(最小 节点 覆盖),并针对最大团尺寸和聚类系数做了优化。Inet使用简便,只需在命令行输入拓扑图 节点 总数即可。    BRITE2.1   其特点在于“通用”。首先,它实现了Waxman模型和BA算法,并可以用自顶向下和自底向上两种方法来产生GT-ITM 层次模型 ;其次,它为多个网络模拟程序提供接口,包括NS-2、SSF、Omnet++、JSim,并支持 可视化工具 Otter。BRITE产生 路由器 层、AS层以及分层结构拓扑图,并可为连接分配带宽和延迟,具有图形 用户接口 。
个人分类: NS2|2664 次阅读|2 个评论
完美的NS2编译运行GUI环境
Jackfq 2012-7-5 16:50
完美的NS2编译运行GUI环境
Ubuntu10.04+NetBeans+NetbeansTclPlugin1.0+NS2=完美的NS2 GUI运行环境 今天试装了一下NetBeans7.1.2,接着找到了个TCL plugin,终于组成一个满足各项要求(编辑/编译/代码辅助/内置终端。。。。。。)的一个NS2 GUI 调试/运行环境,相比网上的Eclipse+NS2更好用,具体安装可百度一下:“Netbeans NS2”关键字,有不少贴子。现将Tcl plugin1.0和相关截图放上来分享一下 : Tcl plugin1.0: 1326036943_org-netbeans-modules-languages-tcl.nbm
个人分类: NS2|4367 次阅读|0 个评论
[转载]Aodv协议的研究与分析
Jackfq 2012-6-14 10:46
原址如下: http://www.cnblogs.com/pengrui/archive/2011/10/03/2198574.html 1 AODV 报文格式 AODV 有三种基本的协议报文类型:RREQ 报文、RREP 报文和RRER 报文。 1.1 RREQ 报文 a. 对RREQ 的处理 接收到RREQ 的结点做如下处理: (1)创建一个表项,先不分配有效序列号,用于记录反向路径。 (2)如果在“路由发现定时”内已收到一个具有相同标识的RREQ 报文,则抛弃该报文,不做任何处理;否则,对该表项进行更新如下: I.下一跳结点=广播RREQ 的邻居。 II.跳数=RREQ 报文的“跳计数”字段值。 III.设置表项的“过时计时器”。 (3)如果满足以下条件,则结点产生“路由回答报文”RREP,并发送到信源;否则更新RREQ 报文并广播更新后的RREQ 报文。 I.该结点是信宿。 II.结点的路由表中有到信宿的活动表项,且表项的信宿序列号大于RREQ中的信宿序列号。 (4)更新RREQ 报文并广播更新后的RREQ 报文 I.信宿序列号=本结点收到的信宿相关的最大序列号。 II.跳计数加1。 1.2 RREP 报文 (1)信宿结点产生RREP 执行如下操作: I.如果收到相应的RREQ 的信宿序列号与信宿维护的当前序列号相等,则信宿将自己维护的序列号加1,否则不变。 II.跳计数=0。 III.定时器值。 (2)中间结点产生的RREP 执行如下操作: I.本结点获取的该信宿的最大序列号。 II.跳计数=本结点到信宿的跳数(查相应表项即可得到)。 III.更新本结点维护的“前向路由表项”的下一跳和“反向路由表项”的前一跳 b. 对RREP 的处理 结点对接收到的RREP 作如下处理。 (1)如果没有与RREP 报文中的信宿相匹配的表项,则先创建一个“前向路表”空表项。 (2)否则,满足如下条件对已有表项进行更新。 条件: I.现有表项的信宿序列号小于RREP 报文中的序列号。 II.现有的表项没有激活。 III.信宿序列号相同,但RREP 报文的“跳计数”值小于表项相对应的值;通过更新或创建,产生一个新的前向路由。 更新: IV.下一跳=广播RREP 的邻居结点。 V.信宿序列号=RREP 中的信宿序列号。 VI.跳计数加1。 (3)按照上述的过程,任何转发RREP 的结点,都记录了到信宿的下一跳,当RREP到达信源时。结点地址匹配,不再转发RREP,信源到信宿的前向路由已经建立起来了。信源可以沿这条前向路径进行数据传输。 1.3 RRER 报文 邻 居间周期性的互相广播“Hello”报文,用来保持联系,若在一段时间内没有收到“Hello”报文,则认定为链路断。例如当结点X、Y 之间链路产生断路使数据无法通过此条链路传至信宿,则结点X 会产生RRER 报文向信源报告此情况。RRER 通过广播形式传送,维护路由表的结点收到此报文会更新路由表(将X、Y 间的路由设成无效),并转发RRER 报文。 2 协议从接收到一个分组开始的基本流程 AODV 路由协议主要包括以下几个组件: 1、协议实体 2、路由表 3、定时器 (1)广播定时器 (2)周期Hello 报文广播定时器 (3)用于邻居管理的定时器 (4)用于路由缓存的定时器 (5)用于本地修复的定时器 (6)缓存广播ID 的定时器 4、日志记录器 5、路由缓存队列 当协议接收到一个分组,即recv(Packet*, Handler*)函数被调用,函数根据分组类型调用不同的处理函数进行处理。 1、如果是协议分组,则将分组的ttl 值减1,并调用recvAODV(Packet*)函数进行处理。recvAODV 函数再根据分组的不同类型来调用不同的函数进行处理。 (1) 如果接收到的是路由请求分组,则调用recvRequest(Packet*)函数进行处理。如果该分组由节点自身产生或已经接收过的,会被节点丢弃,并 结束处理。否则,节点将缓存该分组的序列号,并将该分组发送来的路径添加到反向路由中,转发相应分组。然后,节点根据该分组的目的地址进行判断并调用不同 函数进行 处理。如果节点自身即为目的节点,则调用 sendReply(nsaddr_t, u_int32_t,nsaddr_t, u_int32_t, u_int32_t, double)函数进行响应。如果节点不是目的节点,但知道通往目的节点的路由,则调用sendReply 函数进行响应,并在源和目的前驱列表中分别插入到源和目的的下一跳节点。否则,不能直接响应该请求, 将 跳数加1,并调用forward(aodv_rt_entry*, Packet*, double)函数转发该分组。在sendReply 函数中,节点首先查找到达目的节点(即发送路由请求分组的节点)的路由,创建并填充分组,然后调用 Scheduler::instance().schedule()函数来发送该分组。 (2) 如果接收到的是路由响应分组,则调用recvReply(Packet*)函数进行处理。节点首先查询前往分组目的节点的路由,如果不存在则新增一条路由 项。然后,节点更新到该目的节点的路由项,并发送所有相关分组。如果节点为目的节点则更新路由发现延迟并发送所有相关的分组。如果节点不是目的节点,但知 道通往目的节点的路由,则将跳数加1,调用forward 函数转发该分组,并修改响应的前驱列表。如果节点不是目的节点,也不知道通往目的节点的路由,则丢弃该分组。 (3)如果接收到的是路由错误分组,则调用recvError(Packet*)函数进行处理。 节 点首先清除所有受到影响的路由项,丢弃所有受影响的分组。然后,如果前驱节点中存在会受该路由错误影响的分组,则调用 sendError(Packet*, bool)函数转发该分组。sendError 函数创建并填充分组, 然后调用Scheduler::instance().schedule()函数来发送该分组。 (4)如果接收到的是Hello 消息分组,则调用recvHello(Packet*)函数进行处理。节点会将该邻居的信息添加到邻居列表中(或更新该邻居的信息)。 2、如果是数据分组,则节点丢弃已经发送过或者ttl 为0 的分组,并结束处理。如果分组是由上层协议产生的,则节点添加IP 报头。随后,节点根据目的路由进行不同处理。 (1) 如果目的节点路由未知,则调用rt_resolve(Packet*)函数进行路由解析和转发。如果目的节点路由在路由表中存在,则直接调用 forward 函数进行转发。如果分组是由节点自身产生的,则将分组保存到缓冲队列中,并调用sendRequest(nsaddr_t)函数查询目的路由。如果目的路 由已知,但正在进行本地修复,则将分组保存到缓冲队列中。否则,丢弃该分组,并调用sendError 函数报错。 (2) 如果目的节点路由已知,则调用forward 进行转发。节点丢弃ttl 为0 的分组,并根据分组类型决定下一步操作。如果接收到的是数据分组,且自身为目的节点,则通过调用PortClassifier 对象的recv(Packet*, Handle*)函数将分组交递给高层协议, 并结束处理。否则, 节点设置分组属性, 并调用 Scheduler::instance().schedule (Handler*, Event*, double)函数来发送分组。其中,Handler 为基类中的属性target_(会根据脚本中的设置指向相应的协议实体), Event 为要发送的分组即可。以上就是在节点收到分组后的一个处理过程。 以下是各个定时器所做的工作。 1、 广播定时器BroadcastTimer 在到时后调用id_purge()函数删除广播项中已超时的项目,并通过调用Scheduler:: instance().schedule()函数来设置下次被调用的时间(Handler 为this 指针,Event 为类属性intr)。 2、周期Hello 报文广播定时器HelloTimer 在到时后调用sendHello()函数向邻居创建并发送Hello 消息,并调用schedule()函数来设置下次被调用的时间。 3、 邻居管理定时器NeighborTimer 在到时后调用nb_purge()函数来清除邻居列表中已超时的邻居项,并调用schedule()来设置下次被调用的时间。nb_purge会调用 nt_delete(nsaddr_t) 函数来清除超时的邻居项, 其又会调用handle_link_failure(nsaddr_t)函数来处理由于邻居节点被删除而引起的路由 变化。 4、路由缓存定时器RouteCacheTimer 在到时后调用rt_purge()函数来清除路由表中已超时的路由项,并丢弃相关的分组,再调用schedule()来设置下次被调用的时间。 5、本地修复定时器LocalRepairTimer 在调用后根据传递的分组的目的地址关闭相应的路由项。 6、缓存广播ID 定时器BroadcastID 用来保存广播分组的ID。
个人分类: NS2|2651 次阅读|0 个评论
[转载]NS2中802.11代码深入理解—packet传输的流程
Jackfq 2012-6-13 17:22
原址如下: http://loosky.net/?p=473 如何传送一个封包(How to transmit a packet?) 首先,我们要看的第一个function是在mac-802_11.cc内的recv( ),程式会先判断目前呼叫recv( )这个packet的传输方向,若是DOWN,则表示此packet是要送出去的,因此就会再呼叫send(p, h).所以接着,我们跳到send( ),此send( )首先会去检查energy model,若是目前这个node是在睡眠状态(sleep mode),则把此packet给丢弃.然后会把handler h设定给callback_.下一步,就是去呼叫sendDATA(p)和sendRTS(ETHER_ADDR(dh-dh_ra)). 底下是sendDATA的程式码. (部份英文说明和程式码,会因为长度的关系而拿掉,所以读者最好还是拿原本的程式码做对照) void Mac802_11::sendDATA(Packet *p) { hdr_cmn* ch = HDR_CMN(p); struct hdr_mac802_11* dh = HDR_MAC802_11(p); /* 更新packet的长度,把packet的长度加上PreambleLength (内定值为144 bits), PLCPHeaderLength(内定值为48bits), Mac Header Length和ETHER_FCS_LEN */ ch-size() += phymib_.getHdrLen11(); /* 填入Mac Header中frame control内的子栏位值 */ dh-dh_fc.fc_protocol_version = MAC_ProtocolVersion; dh-dh_fc.fc_type = MAC_Type_Data; dh-dh_fc.fc_subtype = MAC_Subtype_Data; //printf("…..p = %x, mac-subtype-%d\n",p,dh-dh_fc.fc_subtype); dh-dh_fc.fc_to_ds = 0; dh-dh_fc.fc_from_ds = 0; dh-dh_fc.fc_more_frag = 0; dh-dh_fc.fc_retry = 0; dh-dh_fc.fc_pwr_mgt = 0; dh-dh_fc.fc_more_data = 0; dh-dh_fc.fc_wep = 0; dh-dh_fc.fc_order = 0; /* 记录传送所需要花的时间,计算的方式(PreambleLength +PLCPHeaderLength) * 8 / PLCPDataRate + 剩于的封包长度(单位为bytes) * 8 / dataRate_ */ /* 事实上,底下的这一行程式码是个浪费,因为底下又会针对是否为broadcast或unicast的封包,再计算一次 */ ch-txtime() = txtime(ch-size(), dataRate_); /* 若是这是一个unicast的封包 */ if((u_int32_t)ETHER_ADDR(dh-dh_ra) != MAC_BROADCAST) { /* 再一次计算传送所需要花的时间 */ ch-txtime() = txtime(ch-size(), dataRate_); /* duration的意思是送出去此data packet之后,此次的通讯还需要占用channel所需要的时间,这个时间的长度为传送一个ACK和一个SIF的时间 */ dh-dh_duration = usec(txtime(phymib_.getACKlen(), basicRate_)+ phymib_.getSIFS()); } else { /* 若这是一个multicast的封包 */ ch-txtime() = txtime(ch-size(), basicRate_); /* 若是multicast packet,送出去此data packet之后,就算传送完成,不需要再等待ACK,因此duration为0 */ dh-dh_duration = 0; } /*当Mac Header中的资讯都填完后,我们先把此packet暂时地存放在Mac Layer中的local buffer,等待适当的时机再传送出去 */ pktTx_ = p; } 底下是sendRTS的程式码. (部份英文说明和程式码,会因为长度的关系而拿掉,所以读者最好还是拿原本的程式码做对照) void Mac802_11::sendRTS(int dst) { Packet *p = Packet::alloc(); hdr_cmn* ch = HDR_CMN(p); struct rts_frame *rf = (struct rts_frame*)p-access(hdr_mac::offset_); /* 检查要传送的封包大小是否是小于RTSThreshold或是不是一个broadcast的封包,若是的话,就不需要传送RTS.若是在使用者所写的 tcl中没有指定RTSThreshold,则ns2会去读取ns-default.tcl的值,内定为0,因此若是使用unicast,则一定会送出去 RTS */ if( (u_int32_t) HDR_CMN(pktTx_)-size() macmib_.getRTSThreshold() || (u_int32_t) dst == MAC_BROADCAST) { Packet::free(p); return; } ch-uid() = 0; ch-ptype() = PT_MAC; ch-size() = phymib_.getRTSlen(); ch-iface() = -2; ch-error() = 0; bzero(rf, MAC_HDR_LEN); /* 设定RTS packet中Mac Header的栏位 */ rf-rf_fc.fc_protocol_version = MAC_ProtocolVersion; rf-rf_fc.fc_type = MAC_Type_Control; rf-rf_fc.fc_subtype = MAC_Subtype_RTS; rf-rf_fc.fc_to_ds = 0; rf-rf_fc.fc_from_ds = 0; rf-rf_fc.fc_more_frag = 0; rf-rf_fc.fc_retry = 0; rf-rf_fc.fc_pwr_mgt = 0; rf-rf_fc.fc_more_data = 0; rf-rf_fc.fc_wep = 0; rf-rf_fc.fc_order = 0; /* 把要传送的目的位址存放到RA */ STORE4BYTE(dst, (rf-rf_ra)); /* 存放传送RTS所需要花的时间, RTS Frame是用basicRate_传送 */ ch-txtime() = txtime(ch-size(), basicRate_); /* 把传送端的位址放到TA */ STORE4BYTE(index_, (rf-rf_ta)); /* 计算duration,计算的公式为: SIF + T(CTS) + SIF + T(Pkt) + SIF + T(ACK) */ rf-rf_duration = usec(phymib_.getSIFS() + txtime(phymib_.getCTSlen(), basicRate_) + phymib_.getSIFS() + txtime(pktTx_) + phymib_.getSIFS() + txtime(phymib_.getACKlen(), basicRate_)); /* 把建立好的RTS packet先暂时存放到pktRTS_ */ pktRTS_ = p; } 看完sendDATA( )和sendRTS( )之后,我们再回到send( ).接着,就指定一个unique sequence number给这个data packet.为了更清处的说明,底下把剩余的程式码贴在底下. / * 这是在send( )内的程式码 */ /* 若是目前backoff timer并没有在 count down */ if(mhBackoff_.busy() == 0) { /* 此时channel又是idle */ if(is_idle()) { /* 若是节点已经再等待defer timer,则让defer timer继续,因此不做任何的设定.但是若没有defer timer,就要根据802.11的规定,需要再等待一个DIFS和一个random time才能做资料的传送,而这个random time是由 所决定的 */ if (mhDefer_.busy() == 0) { rTime = (Random::random() % cw_)*(phymib_.getSlotTime()); mhDefer_.start(phymib_.getDIFS() + rTime); } /* 此时channel若是busy */ else { mhBackoff_.start(cw_, is_idle()); } } 做完以上的事情后, send()已经完成了. 然后,当Defer timer expires的时候,程式就会去呼叫deferHandler(),在deferHandler()中会先去呼叫check_pktCTRL(),但因 为目前pktCTRL没有资料(回传-1),所以会继续去执行check_pktRTS().若是目前channel是idle的状 态,check_pktRTS()内的程 式码就会去设定传输状态为MAC_RTC,并且计算送出RTS timeout的时间,算法为: timeout = txtime(phymib_.getRTSlen(), basicRate_) + DSSS_MaxPropagationDelay // 设定为2 us,可以参考mac-802_11.h + phymib_.getSIFS() + txtime(phymib_.getCTSlen(), basicRate_) + DSSS_MaxPropagationDelay; // 设定为2 us,可以参考mac-802_11.h 设定完后,就会去执行transmit(pktRTS_, timeout),把RTS的packet送出去. 送完RTS后,我们必需等待CTS,所以我们再回到recv()中的mhRecv_.start(txtime(p)),这个程式码主要是等待整个 packet完全接收后就会去呼叫recvHandler(),而recvHandler()就会再去呼叫recv_timer(),若是判断所收到的 packet是CTS,则再呼叫recvCTS(pktRx_).在recvCTS()中,因为已收到CTS,则代表RTS已传送成功,因此把 pktRTS_ = 0和ssrc_=0,然后再呼叫tx_resume(). 在tx_resume()中,由于已成功的做完RTS/CTS,现在要准备送出data.这部份的程式如下所示 / * 若是pktTx_有资料要传送 */ else if(pktTx_) { if (mhBackoff_.busy() == 0) { hdr_cmn *ch = HDR_CMN(pktTx_); struct hdr_mac802_11 *mh = HDR_MAC802_11(pktTx_); /* 判断packet size是否小于RTSThreshold或者是不是broadcast */ if ((u_int32_t) ch-size() macmib_.getRTSThreshold() || (u_int32_t) ETHER_ADDR(mh-dh_ra) == MAC_BROADCAST) { rTime = (Random::random() % cw_) * phymib_.getSlotTime(); mhDefer_.start(phymib_.getDIFS() + rTime); } else { /* 若是unicast且packet size大于RTSThreshold,则会等待一个SIFS后,再把data packet送出去 */ mhDefer_.start(phymib_.getSIFS()); } } } 等到defer timer expires后,又会呼叫deferHandler(),而在deferHandler()又会再去呼叫check_pktTx(). check_pktTx()的程式码如下: int Mac802_11::check_pktTx() { struct hdr_mac802_11 *mh; double timeout; assert(mhBackoff_.busy() == 0); if(pktTx_ == 0) return -1; mh = HDR_MAC802_11(pktTx_); switch(mh-dh_fc.fc_subtype) { case MAC_Subtype_Data: /* 若是目前的channel是busy的话,就需要增加contention window,然后再执行一次backoff */ if(! is_idle()) { sendRTS(ETHER_ADDR(mh-dh_ra)); inc_cw(); mhBackoff_.start(cw_, is_idle()); return 0; } /* 设定传输状态为MAC_SEND */ setTxState(MAC_SEND); if((u_int32_t)ETHER_ADDR(mh-dh_ra) != MAC_BROADCAST) timeout = txtime(pktTx_) + DSSS_MaxPropagationDelay // 设定为2 us,可以参考mac-802_11.h + phymib_.getSIFS() + txtime(phymib_.getACKlen(), basicRate_) + DSSS_MaxPropagationDelay; // 设定为2 us,可以参考mac-802_11.h else timeout = txtime(pktTx_); break; default: fprintf(stderr, "check_pktTx:Invalid MAC Control subtype\n"); exit(1); } /* 把pktTx_内的data packet传送出去 */ transmit(pktTx_, timeout); return 0; } 资料送出去后,若是unicast的data packet就需要等待ACK,所以我们再回到recv()中的mhRecv_.start(txtime(p)),这个程式码主要是等待整个 packet完全接收后就会去呼叫recvHandler(),而recvHandler()就会再去呼叫recv_timer(),若是判断所收到的 packet是ACK,则会呼叫recvACK(pktRx_). 由于已成功收到ACK,则表示DATA packet已成功的送出,所以就把mhSend_.stop(),判断packet size是否有大于RTSThreshold,若是有大于的话,就把slrc_ = 0,没有的话,就把ssrc_=0.并且把pktTx_=0. 最后在结束之前,再呼叫tx_resume().而tx_resume()会呼叫callback_….然后整个DATA packet传送过程就结束了.
个人分类: NS2|3391 次阅读|0 个评论
[转载]在NS2.33下安装tcl-debug-2.0
Jackfq 2012-6-4 23:25
原文地址如下:http://blog.csdn.net/charming520/article/details/4211691,该方法也适合2.34版本,已测试通过!:—)附上TclDebug2.0: tcl-debug-2.0.tar.gz 在NS2.33下安装tcl-debug-2.0步骤: 经验证,此方法最全,并且可用于NS2.33,NS2.30,NS2.29等版本。现记录如下: 1.下载 tcl-debug-2.0;将下载的tar包拷贝到与NS-2.33平行的目录下,并解压 2. 编译tcl-debug,并且将产生的可加载的库文件复制到NS-2.33的库目录里面,具体步骤如下: 1) 进入到tcl-debug目录下面 $ cd tcl-debug-2.0 2) 配置并且编译tcl-debug 1.下载 tcl-debug-2.0;将下载的tar包拷贝到与NS-2.33平行的目录下,并解压 2. 编译tcl-debug,并且将产生的可加载的库文件复制到NS-2.33的库目录里面,具体步骤如下: 1) 进入到tcl-debug目录下面 $ cd tcl-debug-2.0 2) 配置并且编译tcl-debug $ ./configure --prefix=/home/Maxiaolin/ns-allinone-2.33/ns-2.33 --with-tcl=/home/Maxiaolin /ns-allinone-2.33/tcl8.4.18/unix $ make 3)检查可加载的库文件(*.a) 在编译之后是否被创建。 查看是否产生了一个"libtcldbg.a" 文件。他是一个tcl的库文件。 4) 复制这个库文件到NS-2 库目录里面,即 /home/Maxiaolin /ns-allinone-2.33 /lib下面 3. 编译NS-2 1) 进入ns-2.33目录下面,即 /home/Maxiaolin/ns-allinone-2.33/ns-2.33 2) 重新配置NS-2以便启用tcl-debug. $ ./configure --with-tcldebug=/home/Maxiaolin/ns-allinone-2.33/tcl-debug-2.0 注意:你可以从屏幕输出的信息查看到tcl-debug是否被验证了。 如果你没有看到以下的文字,你需要重复以前的步骤。 Checking for libtcldbg... -L/home/Maxiaolin/ns-allinone-2.33/tcl-debug-2.0 -ltcldbg 上面的文字在下面这句话之后出现 checking dmallc... not requested with --with-dmalloc 3)删除以前的编译纪录 $ make clean 注:这一步骤非常重要! 4)重新编译NS-2 $ make 现在tcl-debug已经嵌入到NS-2的可执行文件"ns.exe"中去了 5)检查NS-2是否能够正常运行。随便选择一个脚本测试一下就可以了 $ ns example.tcl 4. 检查tcl-debug是否能够正常工作。 你可以通过添加debug 1在你的脚本中设置断点。示例如下: 1)从目录~ns/tcl/ex directory 里面选择一个脚本, 如:wireless-test.tcl, 利用文本编辑器编辑该脚本: set ns_ debug 1; # 在这个位置添加这么一行代码 set chan 2) 运行 wireless-test.tcl $ ns wireless-test.tcl 运行脚本之后,如果你成功安装,将会出现以下信息提示: 2: lappend auto_path $dbg_library dbg2.0
个人分类: NS2|3835 次阅读|0 个评论
VirtualBox+Ubuntu10.4+ns2.3x安装成功
Jackfq 2012-5-15 21:04
VirtualBox+Ubuntu10.4+ns2.3x安装成功
NS2.31装好已经很久了,也遇到了不少问题,一直想整理成文字,因为没有开博客所以没有放上来,今天趁着小休把安装过程中遇到的问题整理一下: 1.安装 VirtualBox: https://www.virtualbox.org/wiki/Downloads (其他如VMWare也能装,看大家的喜好了 ) 2.下载并安装Ubuntu10.4: http://www.ubuntu.com/ (最新的 Ubuntu 12.04 LTS已经出来了,不过对于NS2的安装来说,低版本最到的问题会少一些,主要是编译器方面的问题,所以建议大家不要一味的追求高版本,对NS2也是如此。想想上个世纪我们的286、386还没充分发挥其功效,486、586。。。。。。甚至于现在的多核CPU就不断地冲击着人们的大脑,让人无从选择,硬件、软件发展得很快,有时候不如选择经典的 ) 3.安装NS2前,需要要更新部分软件: 在安装NS2之前,一些必要的库、头文件需要手动安装,可在终端下以超级用户模式来安装(CP并执行如下命令即可): sudo apt-get install build-essential tcl8.4 tcl8.4-dev tk8.4 tk8.4-dev libxmu-dev libxmu-headers 一般情况下,在Ubuntu10.4下不要再单独执行以下命令来安装编译器: sudo apt-get install gcc-4.4 sudo apt-get install g++-4.4 如果编译不了,或提出编译器版本不匹配,再执行上述命令来单独安装编译器! 4.下载 NS2.3x: http://nsnam.isi.edu/nsnam/index.php/Main_Page 目前该页面提供从2.31至2.35的下载链接 5.拷贝ns-allinone-2.3x.tar.gz至/home/xxxx (xxx为你的用户主目录)下,执行如下命令解压缩: tar -zxvf nsns-allinone-2.31.tar.gz 6.修改部分文件内容,并执行安装: (1) 如果gcc的版本大于4.0("gcc4.0版本以前是用ld-share来生成共享库的,但是到了4.0以上的版本,这个命令改为了gcc-share"),则对ns-allinone-2.34 /otcl-1.13下的两个文件进行修改:    (a)sudo gedit configure.in    把77行处的    SHLIB_LD="ld-shared"    改为    SHLIB_LD="gcc-shared"    保存退出,然后    (b)sudo gedit configure    把6304行(Ctrl+F)的    SHLIB_LD="ld-shared"    改为    SHLIB_LD="gcc-shared" (2)另一个要修改的Bug是有关NAM运行错误,如果不修改,Nam运行时会遇到以下错误: : no event type or button # or keysym while executing "bind Listbox MouseWheel { %W yview scroll units }" invoked from within "if { eq "classic" || eq "aqua"} { bind Listbox MouseWheel { %W yview scroll units } bind Li..." 解决方案: 在tk-8.4.*/generic/tkBind.c的第588行添加: #ifdef GenericEvent /* GenericEvent */ 0, #endif 经过上述两处地方的修正,就可以执行以命令进行NS2的配置与编译了: ./install 搞定,收尾! 最后对主目录下的.bashrc文件进行相关的目录变量的设置: (1)运行 gedit ~/.bashrc (2)将如下信息加入.bashrc文件中,保存退出: NS_PATH=~/ns-allinone-2.31 export PATH=$PATH:$NS_PATH/bin:$NS_PATH/ns-2.31:$NS_PATH/nam-1.13:$NS_PATH/tcl8.4.14/unix:$NS_PATH/tk8.4.14/unix export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NS_PATH/otcl-1.13:$NS_PATH/lib export TCL_LIBRARY=$TCL_LIBRARY:$NS_PATH/tcl8.4.14/library (3)运行source .bashrc命令 或 关闭并重新打开一个终端,即可以在终端下运行NS2了。 补充修正: 在Ubuntu11.10/10.04下安裝ns2.34是可行的,步骤如下: 1. 除了按上面说明进行一样的修正外,还有需要修正以下一些内容: a)修改ns-2.34/tools/中的ranvar.cc第219行, 将GammaRandomVariable::GammaRandomVariable改为GammaRandomVariable b) 修改ns-2.34/mobile/中的nakagami.cc: 第183行, 將ErlangRandomVariable::ErlangRandomVariable 改为ErlangRandomVariable; 第185行GammaRandomVariable::GammaRandomVariable改为GammaRandomVariable c)修改ns-2.34/mac/中的mac-802_11Ext.h, 加入#include cstddef 可选 2.修改 ~ns-2.34/tcl8.X.x/unix/Makefile.in and in line number 270 change @CC@ to @CC@ –V 4.4 3. ./install P.S. 現在2.35已經沒這麼麻煩了, 不需要修改otcl-1.13/中的configure, configure.in 最后附上几个有用的博客与网站: 1. http://140.116.72.80/~smallko/ns2/ns2.htm 柯志亨老师的网站,有大量的NS2学习资料,有时上不去 。 2. http://nsnam.isi.edu/nsnam/index.php/Contributed_Code 其中有不少有用的Code,值得深入学习 。 3. http://linlansworknote.blogbus.com/ 一个不错的个人博客,有不少实验举例与分析 4. http://bbs.sciencenet.cn/home.php?mod=spaceuid=281551do=blogid=390046 教你如何将Nam输出保存成动画图片 最近换了个环境:NetBeans7.x+NetBeansTcl plugin+Ubuntu10.04可以完美实现编译/运行/调试/代码辅助等功能,彻底摆脱了无GUI环境的NS2编辑/编译/运行环境,一个字:强!
个人分类: NS2|3652 次阅读|0 个评论
cygwin下NS2的安装说明
zswm27 2011-9-28 09:38
安装说明.txt 之前捣腾了很久NS2,没捣腾出什么结果,却编写了一个比NS2更酷的界面来运行NS2的仿真结果,呵呵,后来加入了新的项目组,导致NS2彻底被搁置,今天我师弟突然跑来问我NS2的相关问题,才发现其实我也忘的所剩无几了,翻出以前的记录,连安装步骤也快记不得了,哎,感叹我的记忆力是如此之差,为了保存,也为了方便网上大家的学习,把cygwin下NS2的安装说明上传,呵呵
个人分类: 学习之路|4484 次阅读|0 个评论
ubuntu上安装NS2成功
热度 1 zr99 2011-7-21 20:11
今天决定研究一下NS2下的WSN仿真了。 首先到ISI上下载了2.34版本的NS2 allinone 安装包,然后到在我原来的VMware下ubuntu 9.10上尝试安装,结果失败。 后来,在同事计算机的ubuntu 10.10上安装NS2 2.34版依旧没有成功,但是发现ubuntu园里有NS2的2.35版本可以安装成功。 卸载了ubuntu9.10,安装了NS2 2.35。 不到半天搞定,安装还算顺利。 PS: 顺便补充几个刚刚搜集到的学习NS2的网址: 1、 http://140.116.72.80/~smallko/ns2/ns2.htm ,柯志亨老师的网站,有大量的NS2学习资料。 2、 http://nsnam.isi.edu/nsnam/index.php/Contributed_Code#Wireless_and_Mobility , 诞生的地方 3、 http://linlansworknote.blogbus.com/
个人分类: 科研笔记|1833 次阅读|1 个评论
NS2仿真过程中nam动画保存成gif格式动画
zswm27 2010-12-3 20:49
Nam动画记录导出并转换为gif格式的过程: 1. 在nam动画中选择File-Recordanimation,如下图所示: 2. 设置合适的步长,开始演示,打开trace记录文件所在的文件夹,会发现产生很多.xwd格式的文件,将这些.xwd格式的文件存入一个新建文件夹内,如命名为xwd. 3. 安装相关的工具,各种工具包将在明天上传。打开cygwin命令框 (1)libtool 将libtool-1.5.22安装包解压到如C:\cygwin\tmp\netpbm目录下,然后执行以下命令: cd/tmp/netpbm/libtool-1.5.22 ./configure make makeinstall (2)jpeg 将jpeg-7安装包解压到如C:\cygwin\tmp\netpbm目录下,然后执行以下命令: cd/tmp/netpbm/jpeg-6b ./configure--enable-shared make makeinstall (3)Tiff 将tiff-3.8.2安装包解压到如C:\cygwin\tmp\netpbm目录下,然后执行以下命令: cd/tmp/netpbm/tiff-3.8.2 ./configure make makeinstall (4)Libpng 将libpng-1.2.24安装包解压到如C:\cygwin\tmp\netpbm目录下,然后执行以下命令: cd/tmp/netpbm/libpng-1.2.24 ./configure make makeinstall (5)Netpbm 将netpbm-10.35.77安装包解压到如C:\cygwin\tmp\netpbm目录下,然后执行以下命令: cd/tmp/netpbm/netpbm-10.35.77 ./configure make makepackagepkgdir=/usr/local/netpbm ./installnetpbm 补充:运行./configure时会询问你很多路径和动态链接库设置,会要求你输入yes或none,此时要在cygwin文件下搜索有没有这个动态链接库,若没有就输入none.否则netpbm会安装不成功。 4. 设置环境变量 将C:\cygwin\usr\local\netpbm\bin下所有的文件copy到C:\cygwin\bin路径下。 5. 测试是否成功。在命令框中,在你之前新建的xwd文件夹的路径下,输入以下命令: j=0 foriin*.xwd;do xwdtopnm$i| ppmtogif$j.gif j=`expr$j+1` done 此时在xwd文件夹里会产生转化好的gif图片。 6. 保存为一个动态的gif文件,输入命令: gifmerge-l0-2-229,229,229*.gifmovie.gif
个人分类: 心情日记|7703 次阅读|1 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅶ:协议添加
duankesong 2010-4-7 21:17
如果添加自组网的路由协议(可能MAC协议也是类似的),需要添加一些接口,基本可以参照AODV。当然,会涉及一些tcl文件,包括 ns-lib.tcl ns-default.tcl ns-packet.tcl ns-agent.tcl 往 NS-2.30中添加了一个新的MAC协议,暂时命名为LMAC.其实它的代码内容和SMAC一样,我只是想验证一下如何在NS-2.30中添加新的协议。 1. 在~/ns-allinone-2.30/ns-2.30/mac目录下copy原来的smac.cc和smac.h cp smac.cc lmac.cc cp smac.h lmac.h 2. 打开lmac.cc和lmac.h,把所有的SMAC替换成LMAC,把所有的smac替换成lmac,把所有的Smac替换成Lmac. 3. 修改packet.h 打开packet.h,找到匹配字符串SMAC,然后照着样子修改就可以了。 packet.h在~/ns-allinone-2.30/ns-2.30/common目录下 添加定义访问协议报头的指针 #define HDR_SMAC(p) ((hdr_smac *)hdr_mac::access(p)) #define HDR_LMAC(p) ((hdr_lmac *)hdr_mac::access(p)) // add lmac here 增加 LMAC包类型(协议标志),所有的包类型都是PT_开头,如PT_TCP,PT_UDP等,在枚举类型enum packet_t{}中找到 PT_SMAC, 添加LMAC // SMAC packet PT_SMAC, // LMAC packet PT_LMAC, 注意新添加的协议要在PT_NTYPE之前。 然后在类class p_info{}的构造函数中找到 name_ =smac; 添加 name_ =lmac;这样就可以通过协议标识寻找协议对应的字符串 同样注意要在 name_ = undefined;之前定义 4. 修改ns-default.tcl文件 ,在~/ns-allinone-2.30/ns-2.30/tcl/lib目录下 找到 # Turning on/off sleep-wakeup cycles for SMAC Mac/SMAC set syncFlag_ 1 # Nodes synchronize their schedules in SMAC Mac/SMAC set selfConfigFlag_ 1 # Default duty cycle in SMAC Mac/SMAC set dutyCycle_ 10 这里定义了otcl对象的缺省值,我们在这里添加LMAC的缺省值 #add LMAC here # Turning on/off sleep-wakeup cycles for LMAC Mac/LMAC set syncFlag_ 1 # Nodes synchronize their schedules in LMAC Mac/LMAC set selfConfigFlag_ 1 # Default duty cycle in LMAC Mac/LMAC set dutyCycle_ 10 继续寻找SMAC,找到 # Turning on/off sleep-wakeup cycles for SMAC Mac/SMAC set syncFlag_ 0 添加相应的LMAC # Turning on/off sleep-wakeup cycles for LMAC Mac/LMAC set syncFlag_ 0 5. 修改ns-packet.tcl 文件,在~/ns-allinone-2.30/ns-2.30/tcl/lib目录下 在foreach prot{}这个函数中找到Smac, Smac # Sensor-MAC 添加一行: Lmac # A new Sensor-MAC 6. 修改Makefile文件,在~/ns-allinone-2.30/ns-2.30/目录下 找到smac.o mac/mac-802_3.o mac/mac-tdma.o mac/smac.o \ 添加lmac.o到ns的目标文件列表: mac/mac-802_3.o mac/mac-tdma.o mac/smac.o mac/lmac.o\ 7. 经过以上几步,一个新的协议就一经添加成功了,但是这个新的 LMAC协议产生的trace文件格式不正确, 还要修改 cmu-trace.cc和cmu-trace.h文件,在~/ns-allinone-2.30/ns-2.30/trace目录下 修改cmu-trace.h文件,找到这一行: void format_smac(Packet *p, int offset); 增加一行: void format_lmac(Packet *p, int offset); 然后修改cmu-trace.cc文件,这个文件是修改的关键!! 在void CMUTrace::format_mac_common(Packet *p, const char *why, int offset) 这个函数中修改,添加进去LMAC struct hdr_cmn *ch = HDR_CMN(p); struct hdr_ip *ih = HDR_IP(p); struct hdr_mac802_11 *mh; struct hdr_smac *sh; struct hdr_lmac *ph; // 新添加一个指向lamc包的指针 char mactype ; strcpy(mactype, Simulator::instance().macType()); if (strcmp (mactype, Mac/SMAC) == 0) sh = HDR_SMAC(p); else if (strcmp (mactype,Mac/LMAC) == 0) // 判断是不是LMAC包,新添加的语句 ph = HDR_LMAC(p); else mh = HDR_MAC802_11(p); 继续往下找SMAC,添加LMAC if (strcmp (mactype, Mac/SMAC) == 0) { format_smac(p, offset); } else if (strcmp (mactype, Mac/LMAC) == 0) { //新添加的语句 format_lmac(p, offset); } else { format_mac(p, offset); } return; 在if(newtrace){}的判断语句中找到SMAC // mac layer extension offset = strlen(pt_-buffer()); if (strcmp(mactype, Mac/SMAC) == 0) { format_smac(p, offset); } else if (strcmp(mactype, Mac/LMAC) == 0) { //新添加的语句 format_lmac(p, offset); } else { format_mac(p, offset); } 继续找SMAC,找到: (ch-ptype() == PT_SMAC) ? ( (sh-type == RTS_PKT) ? RTS : (sh-type == CTS_PKT) ? CTS : (sh-type == ACK_PKT) ? ACK : (sh-type == SYNC_PKT) ? SYNC : UNKN) : packet_info.name(ch-ptype())), ch-size()); 添加LMAC的判断 (ch-ptype() == PT_SMAC) ? ( (sh-type == RTS_PKT) ? RTS : (sh-type == CTS_PKT) ? CTS : (sh-type == ACK_PKT) ? ACK : (sh-type == SYNC_PKT) ? SYNC : UNKN) : (ch-ptype() == PT_LMAC) ? ( //这一块代码是新添加的 (ph-type == RTS_PKT) ? RTS : (ph-type == CTS_PKT) ? CTS : (ph-type == ACK_PKT) ? ACK : (ph-type == SYNC_PKT) ? SYNC : UNKN) : packet_info.name(ch-ptype())), ch-size()); 这里要好好看看源代码,看清楚程序的结构,不要添加错了 再继续找,添加LMAC if (strncmp (mactype, Mac/SMAC, 8) == 0) { format_smac(p, offset); } else if (strncmp (mactype, Mac/LMAC, 8) == 0) { //新添加的代码 format_lmac(p, offset); } else { format_mac(p, offset); } 再往下找,找到这个函数: void CMUTrace::format_smac(Packet *p, int offset) { struct hdr_smac *sh = HDR_SMAC(p); sprintf(pt_-buffer() + offset, , sh-duration, sh-dstAddr, sh-srcAddr); } 照着样子给LMAC写一个相同功能的函数: void CMUTrace::format_lmac(Packet *p, int offset) { struct hdr_lmac *ph = HDR_LMAC(p); sprintf(pt_-buffer() + offset, , ph-duration, ph-dstAddr, ph-srcAddr); } 然后找到 void CMUTrace::format(Packet* p, const char *why)这个函数 添加 switch(ch-ptype()) { case PT_MAC: case PT_SMAC: case PT_LMAC: //这是新添加的LMAC协议 break; case PT_ARP: format_arp(p, offset); break; 最后在文件的开头找到#include smac.h 添加#include lmac.h 到此为止,协议添加完成 8. 回到目录~/ns-allinone-2.30/ns-2.30下,执行命令: make clean make depend make make结束后运行,发现报错,说 smac.h和lmac.h有函数重定义了,这是因为cmu-trace.cc文件同时include了smac.h和lmac.h, 所以当smac.h和lmac.h有相同名字的定义时,就会报错,解决方法是把lmac.h中与smac.h重名的类改成其它名字,当然在lmac.cc中要做相应的修改。 9.如何评价新的协议是否添加成功? 在添加新的协议之前,我一经运行了ns smac.tcl,把smac.tr文件备份为smac.tr.bak。添加了新的协议后,我重新运行ns smac.tcl,得到新的smac.tr文件,然后我执行命令 diff -b smac.tr smac.tr.bak 发现这两个文件内容一模一样,说明原来的协议SMAC运行正常。 然后我修改了smac.tcl,命名为lmac.tcl,调用LMAC协议,然后执行命令ns lmac.tcl,产生trace文件lmac.tr 执行命令 diff -b smac.tr lmac.tr 发现这两个trace文件的内容是一样的,这说明LMAC协议添加成功了,耶~~~~~~~~~~~~~~~~~~~~ 10.在添加新的协议中注意的一些问题和相关技巧: 添加一个新的协议,要照着原来协议的方法写。其实最简单的方法是把含有SMAC,smac,Smac字符串的文件都找出来,然后照样子添加LMAC协议就可以了。 ~/ns-allinone-2.30/ns-2.30/gen下的文件是make的时候自动生成的,不用修改 在~/ns-allinone-2.30/ns-2.30/tcl/lib下,文件ns-lib.tcl也含有SMAC的内容,主要是在tcl调用smac时大印出警告语句,告诉用户SMAC要40秒后才能同步。这个文件可以修改,也可以不修改,对运行结果(trace文件)没有影响。
个人分类: 网络仿真|9081 次阅读|0 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅵ:无线网络模拟与实例
duankesong 2010-4-7 21:17
目前无线网络可以分为两类,有固定接入点的无线网络和无固定接入点的无线网络。无固定接入点的网络,通常称为Ad Hoc网络,或自组织网络。  1. Ad hoc一词来源于拉丁语,是特别地,专门地为某一即将发生的特定目标、事件或局势而不为其他的的意思。这里提出的Ad hoc技术所标称的就是一种无线特定的网络结构,强调的是多跳、自组识、无中心的概念,所以国内一般把基于Ad hoc技术的网络译为自组网,或者多跳网络等等。   Ad hoc技术起源于20世纪70年代的美国军事领域,它是在美国国防部DARPA资助研究的战场环境中的无线分组数据网(PRNET)项目中产生的一种新型的网络构架技术。DARPA当时所提出的网络是一种服务于军方的无线分组网络,实现基于该种网络的数据通信。后来,DARPA又于1983年和1994年分别资助进行了抗毁可适应性网络(SURAN:Survivable Adaptive Network)和全球移动信息系统(GloMo:Global Information Systems)两个项目的研究,以便能够建立某些特殊环境或紧急情况下的无线通信网络。Ad hoc技术就是吸取了PRNET、SURAN以及GloMo等项目的组网思想,从而产生的一种新型的网络构架技术。   随着移动通信和移动终端技术的高速发展,Ad hoc技术不但在军事领域中得到了充分的发展,而且也在民用移动通信中得到了应用,尤其是在一些特殊的工作环境中,比如所在的工作场地没有可以利用的设备或者由于某种因素的限制(投入、安全、政策等)不能使用已有的网络通信基础设施时,用户之间的信息交流以及协同工作(Cooperative Work)就需要利用Ad hoc技术完成通信网络的立即部署,满足用户对移动数据通信的需求。在Ad hoc网络中,无线移动Ad hoc网络(WMANET)被认为是下一代移动通信系统解决方案中最有希望被采用的末端网络。   首先从总体上概括Ad hoc技术的一般概念,然后从OSI模型的角度分层次来介绍Ad hoc的技术特征以及构成Ad hoc网络的各种技术标准。最后就WMANET的网络体系结构以及其在下一代移动通信网络中的应用做了初步的探讨。 1,与其他通信网络相比,基于Ad hoc技术的Ad hoc网络具有以下特征:   ⑴ 网络的自组性。Ad hoc网络可以在任何时刻任何地方构建,而不需要现有的信息基础网络设施的支持,形成一个自由移动的通信网络。   ⑵ 动态网络的拓扑结构。从网络的网络层来看,Ad hoc网络中,移动用户可以以任意的速度和任意方式在网中移动,加上无线发送装置发送功率的变化、无线信道间的相互干扰因素、地形因素等的影响,节点间通过无线信道形成的网络拓扑结构随时都会发生变化。   ⑶ 有限的无线传输带宽。无线信道本身的物理特性使Ad hoc网络的网络带宽相对有线方式要低的多,另外还要考虑无线信道竞争时所产生的信号衰落、碰撞、阻塞、噪声干扰等因素,这使得实际带宽要小的多。   ⑷ 移动终端的有限性。Ad hoc网络中的移动用户终端内存小、CPU处理能力低、所带电源有限使得Ad hoc网络得设计更加困难。   ⑸ 安全性差。Ad hoc网络是一种无线方式的分布式结构,所以更加容易被窃听、入侵、网络攻击和拒绝服务等。   ⑹ 网络的分布式。Ad hoc网络中的移动节点都兼有独立路由和主机功能,不存在类似于基站的网络中心控制点,节点地位平等,采用分布式控制方式,增强了网络健壮性。   ⑺ 网络的可扩展性不强。由于采用TCP/IP协议中的子网技术使得INTERNET具有网络的可扩展性,而Ad hoc网络动态变化的拓扑结构使得子网技术所带来的网络可扩展性不能得到应用。   ⑻ 单向无线信道的存在。   ⑼ 生存时间短。组网通常是由于某个特定原因而临时创建的,使用结束后,网络环境将会自动消失。Ad hoc网络的生存时间相对于固定网络而言是短暂的。   我们认为Ad hoc网络是移动计算机通信网络的一种类型,后者是指用户终端可以在网内随意移动的计算机网络。所以Ad hoc网络是移动通信和计算机网络的交叉。这一点在Ad hoc网络中的体现是:一方面,网络的信息采用了计算机网络中的分组交换机制,而不是电话交换网中的电路交换机制;另一方面,用户终端是便携式的,比如笔记本电脑、PDA、掌上型电脑、车载台等,并配置有相应的无线收发设备,并且用户可以随意移动或处于静止状态。 2.Ad hoc技术的OSI模型分层   这里,作者将参照OSI七层模型,从各个层面上来分析Ad hoc网络的技术特点,并就各个层次的构成来逐一介绍。   构筑网络时如果采用Ad hoc方式,所选用各层次的构建方式是可选的。物理层完成无线信号编码译码、发送和接收等工作;数据链路层控制对共享无线信道的访问以及对逻辑链路的控制,所以数据链路层又分为MAC(媒质接入控制)层和LLC(逻辑链路控制)层;网络层是Ad hoc技术的重点,也是它与其他现有网络的主要区别所在。IPV4协议、IPV6协议或其他网络层协议提供网络层数据服务;网络层的单目标路由协议维护路由表,使其与当前的Ad hoc网络拓扑结构一致;多目标路由协议提供群组通信的底层支持;网际互联支持Ad hoc网络中与其他现有网络互联,QoS支持提供可保证的QoS服务,路由安全提供对路由协议的安全保障。传输层主要完成端到端通信的建立,目前一般的思路是对有线网中的TCP/UDP进行改造,使之适应无线环境;Ad hoc的高层主要包括的是建立在Ad hoc之上的无线应用以及接入移动通信核心网的各种业务。 2.1 Ad hoc物理层   Ad hoc OSI模型中,介绍了Ad hoc网络物理层的一些构成标准。其实在实际的应用中,Ad hoc物理层的设计要根据实际的需要而定。   基于接收发信主要功能的物理层首先要考虑的是通信信号的传送媒质,一般而言,Ad hoc网络都是基于无线通信,后面提到的Ad hoc网络均指无线移动Ad hoc网络(WMANET)。   由此看来,Ad hoc物理层所面临的首要问题就是无线频段的选择、购买以及分配。目前大家一致采用的都是基于2.4GHz的ISM频段,因为这个频段是免费的,不需要购买,成本就会得到降低。其次,物理层必须就各种无线通信机制作出选择,从而完成性能优良的收发信功能。   到目前为止,Ad hoc物理层可以选择和参考的标准主要来自构建无线局域网的各种标准,其中包括IEEE 802.11系列、蓝牙(Bluetooth)、HiperLAN等标准所定义的物理层。   具体说来,Ad hoc物理层所采用的传输技术基本上有三种:正交频分复用技术(OFDM)、采用红外线辐射传输技术、宽带扩展频谱技术。 正交频分复用技术是以多个副载频并发来传输高速数字信息,每个副载频留取足够长的时间和码元宽度来躲避多径衰落信道带来的码间干扰的影响。所采用的数字信息调制有时间差分移相健控(TDPSK)和频率差分移相键控(FDPSK),以快速傅里叶变换(FFT)算法实施数字信息调制和解调功能。   采用红外线辐射传输技术的无线局域网设备,红外线辐射技术的特点是:不能穿透物体;通信距离要远远小于通常使用的射频技术的通信距离。由于空间衰减很大,信号不易被探测,比较适用于近距离点对点传输速率较高的环境。   宽带扩展频谱技术是一种传输信息的调制制式,其传输信息的信号带宽远大于信息本身的带宽。信息带宽的扩展是通过编码方法实现的,与所传数据信息无关。在接收端将宽带的扩频信号恢复成窄带的传输信号,同时将干扰信号频谱再次进行扩展,从而提高信息解调信噪比,达到扩频通信目的。包括DSSS(直接序列扩频)和FHSS(跳频序列扩频)。DSSS是用伪噪声码(PN)作为扩频码序列,调制方式多为二相相移键控和(QPSK)。FHSS就是载波在跳频码的控制下按照某种跳频图案跳变,在接收端通过相关解跳,恢复出发送信号。频率是按跳频图案跳变的,具有CDMA和频带共享能力。 2.2 Ad hoc数据链路层   数据链路层解决的主要问题包括媒质接入控制,以及数据的传送、同步、纠错以及流量控制等。基于此,Ad hoc数据链路层又分为MAC和LLC层。在一般情况下,我们所关注的主要是MAC层,因为MAC决定了数据链路层的绝大部分功能。   从夏威夷大学的ALOHA项目组提出单跳的无线网络中进行分组数据的广播是可行的这一结论以来,针对媒质共享竞争的问题,已经有ALOHA、时隙ALOHA、CSMA(载波侦听多路访问),以及IEEE 802.11所采用的CSMA/CD。MAC层主要就是由这些媒质接入方案充当。由于ALOHA、时隙ALOHA、CSMA都存在媒质冲突、终端暴露以及终端隐藏等严重的问题,所以,后来就有带冲突检测和冲突避免的CSMA 媒质接入方案的提出,被用在了IEEE 802.11无线局域网方案中,可研究发现,基于无线Ad hoc环境的CSMA/CA仍然存在着一些问题,于是,一些学者就提出了各种相应的改进形式作为MAC层的解决方案,包括针对基于CSMA/CA MACA(Multiple Access with Collision Avoidance)的改进:MACAW(MACA for Wireless)、PAMAS(Power-Aware Multi-Access protocol with Signaling)、FAMAS(Floor Acquisition Multiple Access)、MARCH(Media Access with Reduced Handshake)、CATA(Collision-Avoidance Time Allocation)、RT-MAC(Real Time MAC),以及基于P-CDMA/MUD的MAC层协议(具有定位功能基于多用户检测的CDMA系统的MAC层协议)。   MACA采用的是CSMA/CA方案,利用RTS和CTS进行交换,完成对共享无线媒质的检测。目前的IEEE 802.11所定义的MAC层功能就是采用的MACA。   MACAW是第一个专门针对无线环境而设计的MAC层协议,该方案摒弃了原来针对以太网的避退算法,采用了新的避退算法,以便更适合无线信道的环境。MACAW在原来MACA的基础上,增加了确认数据包,用RTS-CTS-Data,以及RTS-CTS-Data-ACK实现媒质的冲突检测。仿真证明MACAW将获得更大的吞吐量以及在高负荷下的资源分配更平均。   PAMAS是基于MACA的改进,它把MACA中的信令信道单独的分离出来了,RTS-CTS信令的交换就是在这个信道上完成的。由于节点在能量控制上具有选择性,所以PAMAS能够做到功率的控制,从而能够实现移动终端的低能量消耗。   FAMA提出的目的是为了更好地解决MACA中仍然存在的终端隐藏问题,FAMA代表了一类MAC层协议,这种方案分为两个阶段,首先获取信道(通过发出大量的确认数据包),然后就是实际的发送数据包。这样就可以比较有效的避免冲突,因为每次都能保证该信道被分配后能成功传送数据而没有冲突。   MARCH是基于PAMAS的改进。RT-MAC则是专门为无线网络中传送实时业务而设计的MAC层协议。   此外,还有BTMA(Busy-Tone Multiple Access)、SRMA(Split-channel Reservation Multiple Access)、GAMA(Group Allocation Multiple Access with Packet Sensing)、DFWMAC(Distributed Foundation Wireless MAC,也就是DCF和PCF两种)、EY-NPMA(ETSI HiperLAN标准)。 2.3 Ad hoc网络层   常规的路由协议(例如:RIP和OSPF)是为有线固定网络而设计的,它们的拓扑结构是固定的,不会出现大的网络结构变化。Ad hoc网络结构则是动态变化的,那么常规路由在拓扑结构变化时,就会花很大的代价重新路由,而且协议状态将始终处于不收敛状态。   另外,Ad hoc网络不能采用常规路由协议还主要由于以下几种因素:⑴ Ad hoc网络中主机间的无线信道可能存在单向信道。⑵ 无线信道的广播特性使得常规路由的网络选路过程中产生许多冗余链路。⑶ 常规路由的周期性广播路由更新报文会消耗大量的网络带宽。⑷ 常规路由协议周期性的路由更新报文会消耗大量的主机能源。此外,某些常规路由协议需要的复杂计算使得CPU始终处于很高的负载下,这也同样消耗了大量的能源。这将对有限的主机能源带来更多的压力。   从以上的分析可以看出,一个好的Ad hoc网络层的路由协议应当满足以下特性要求:分布式运行方式;提供无环路路由;按需进行协议操作;具有可靠的安全性;提供设备休眠操作特性;对单向信道的支持等。   对一个Ad hoc网络层路由协议定量衡量比较的指标应该包括:端到端的平均时延;分组的平均递交率;路由协议开销;路由请求时间等。 正是由于Ad hoc网络层路由协议基于Ad hoc网络的重要性,它便成为了研究的一个热点。到目前为止,已经有相当多的标准推出。IETF也发布了相关的草案供讨论。   从总体上说,目前所提出的各种路由协议基本上可以归纳为三种思路:   (1)这种思路把路由协议分为三类:一类是基于路由表驱动(Table Driven)的路由协议,一种是按需驱动(On-Demand Driven)的路由协议,还有一种是两种模式的混合形式。   (2)平面结构路由和层次结构路由。这是从逻辑结构方面考虑进行的划分。平面结构中,节点地位平等,维护的信息量相同。层次结构路由中,网络结构按级分层,分为骨干网和子网,这样,维护的工作就统一由骨干网承担。像CGSR和HSR是层次路由,CEDAR也是。   (3)基于QoS的路由。多媒体业务的传输需要不同QoS保障(包括带宽、时延、时延抖动、吞吐量、丢失率等)。在Ad hoc网络路由协议中,对于QoS的支持还很不成熟,只有少数的如ABR、SSR以及清华提出的LS_QoS有此功能,它们多是以链路的稳定性作为QoS的衡量标准。目前Ad hoc网络中对QoS的支持一般借鉴INTERNET上建立区分服务和集成服务的模型,做适当的修改。 2.4 Ad hoc传输层   到目前为止,Ad hoc网络的传输层还是借鉴有线网络中传输层的方法,把TCP/UDP基于无线环境进行修改,以适应无线环境,完成传输层的功能。   传统的TCP会使无线Ad hoc网络分组丢失很严重,这是因为无线差错和节点移动性而使TCP将所有的分组丢失都归因于拥塞并启动拥塞控制和避免算法,所以若在无线Ad hoc网络中直接采用传统的TCP协议将可能导致端到端的吞吐量无谓的降低。所以,必须针对传统的TCP进行改进。到目前为止,已经有多个TCP改进方案提出,比如TCP SACK和TCP ASACK等等。   针对UDP的改进与TCP相似。 2.5 Ad hoc应用层   Ad hoc网络的应用层指定的是各种各样类型的业务。在实际的实施的时候,可以采用各种各样的应用层协议和标准,比如WAP(无线应用协议)协议等。   基于Ad hoc技术的网络所承载的业务同其他各种类型网络一样,主要是传统的业务和人们给予厚望的无线宽带数据业务。可前面也提到,Ad hoc网络自身的特性使得网络在承载同类型业务时,要考虑更多的实际问题,克服更多的困难。在解决各种困难的时候,应用层也是问题解决的一个很好的层面。 3.无线移动Ad hoc网络的构成   基于Ad hoc技术的网络可以有多种形式,有的强调无线特征,有的强调移动特征,但目前最有前途的莫过于同时强调无线和移动特征的无线移动Ad hoc网络(WMANET)。 随着研究的不断深入,WMANET越来越显现着其独特的魅力,它已经开始被当作下一代移动通信网络的一种应用方案。3GPP和3GPP2已经把Ad hoc网络作为了下一步标准化的一项重要工作。   Ad hoc技术本身所具有的个人通信的某种实现使得该项技术势必会在以后的通信领域发挥重要的作用。   但是,正是这种无中心控制、多跳等特征使得Ad hoc技术同样面临着许多难题,虽然目前许多难题已经有多个方案提出,但所有技术尚不成熟。   从Ad hoc技术开始民用以来,也有一些Ad hoc的产品面市。基于Ad hoc技术的移动终端以及网络设备已经成为一些大通信公司研发的重点,到目前为止,国外的Nokia公司已经发布了无线移动路由器,并提供了高速无线接入系统的解决方案;NEC公司也提供了基于PHS系统的移动计算网络系统。美国一家专门致力于Ad hoc技术产品研发的公司MeshNetworks公司已经推出了整个通信系统的解决方案以及各种网络设备和移动终端,其宗旨就是研发应用于下一代移动通信末端网络的系统解决方案。国内成立于2001年的珠海汉风公司也是以Ad hoc无线移动多跳网络作为产品研发的重点,目前已经完成前期实验系统的研制,实现了Ad hoc无线移动终端多跳、自组织等功能。
个人分类: 网络仿真|10379 次阅读|0 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅴ:数据的记录,演示,数据分析
duankesong 2010-4-7 21:17
1. 数据的记录 NS-2中主要有两种数据记录格式,一种是 Trace格式,该对象详细记录了模拟的整个过程,第二种是Monitor,用来记录有用的数值。 Trace 文件的建立: $ns trace-all tracefile ;#记录整个模拟过程。 $ns trace-queue n1 n2 optional:file;#记录 n1和n2之间的链路事件,file为可选项。 例如: set tracefile $ns trace-all $tracefile 或 set tracefile $ns trace-queue $n1 $n2 $tracefile 注:在有线网络中,调用 trace-queue方法之前,链路必须已经建立。 Trace 文件的格式: 1 2 3 4 5 6 7 8 9 10 11 12 Event Time From node To node Pkt type Pkt size Flags Fid Src addr Dst addr Seq num Pkt id 1.Event 发生的事件类型。 + 表示分组进入链路队列( Enqueue) - 表示分组离开链路队列 (Dequeue) r 表示目的队列接受( receive)事件 d 表示队列丢弃 (drop)分组事件 2. time 表示事件发生的事件 3. From node表示分组发送节点的 id 4. From node 表示分组传送目的节点的 id 5. Pkt type 表示分组类型 6. Pkt size 表示分组的大小 7. Flags 表示标志项 8. Fid Flow id 的标识符 9. Src addr 表示源地址,格式为: node.port。node为分组发送节点的id,port代表发送分组节点的端口号。 10. Dst addr表示目的地址,格式为: node.port。node为分组接收节点的id,port代表接收分组节点的端口号。 11. Seq num分组的序列号 12. Pkt id 分组的唯一标识符。 部分 trace文件内容如下: - 4.004353 2 3 tcp 1040 ------- 1 0.0 3.0 216 946 r 4.005153 2 3 tcp 1040 ------- 1 0.0 3.0 213 939 + 4.005153 3 2 ack 40 ------- 1 3.0 0.0 213 963 - 4.005153 3 2 ack 40 ------- 1 3.0 0.0 213 963 r 4.006141 3 2 ack 40 ------- 1 3.0 0.0 211 957 + 4.006141 2 0 ack 40 ------- 1 3.0 0.0 211 957 - 4.006141 2 0 ack 40 ------- 1 3.0 0.0 211 957 Monitor 文件 2. 模拟结果的演示 Nam是用于动态演示 NS-2模拟的过程,Gnuplot和Xgraph是用于绘制模拟曲线,Gawk则用于从trace文件中提取数据信息。 Nam是一个基于 Tcl/Tk的动画程序,用来观察网络模拟的轨迹或者真是环境中生成的包的国际。Nam可以从namtrace文件中读取动画事件的命令,事件命令保存在文件中。Nam可以显示各种各样的网络对象,包括节点,链路(有线网络),数据流,无线网络中的电波信号,丢包等等。 Nam文件的产生。 $set nf $ns nam trace-all $nf 网络拓扑布局的生成。 设置节点的固定布局 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n0 $n1 orient right-up $ns duplex-link-op $n0 $n1 orient right 自动布局方法,适用于网络节点教多的情况。 x,y坐标方式布局,适用于无线环境的拓扑构造。 节点的显示属性 $node attribute value $node coler red $node shape hexagon $node label mytext $node label-color blue $node label-at up 链路的显示属性 $ns duplex-link-op attributr value 设置数据流属性 $ns color $n blue $agent set fie_ $n 例如: $ns color 1 blue $tcp set fid_ 1 $ns color 2 red $udp set fid_ 2 nam的运行 在脚本中加入 exec nam $namfile 在 nam文件产生后,可在命令行下输入:nam out.nam运行。 关于 nam的详细使用,可以参考NS手册中的说明,熟练掌握nam的使用,可以帮助读者更直观的分析模拟的过程,扑捉模拟时间发生的大致时间,从而加快对模拟结果的分析和处理。 3.Gnuplot 它是一个命令行驱动的,互动式函数和数据绘制程序,支持大多数的数学表达式和数学函数。 在命令行下输入: gnuplot gnuplotplot sin(exp(x)) plot用来绘制二维图形, Splot用来绘制三维图形。 4.xgraph是集成在 ns-allinone软件包中的一个绘图工具。 5.Gawk是 GNU开发的AWK程序语言。用来分析模拟产生的trace文件。 gawk是一种程序语言,对于资料的处理具有很强的功能,可以使用很短的代码轻易地完成对文本档案做修改、分析、提取和比较等处理。在 NS的模拟结果分析中,经常用到gawk来进行数据分析和统计等。命令如下: gawk 'program' input-file1 input-file2 ... 程序代码较短 gawk -f program-file input-file1 input-file2... 程序较长 gawk程序是由很多的 pattern和action所组成的: pattern {action}。 功能是针对文件的每一行搜寻指定的模式 (pattern),当一行里有符合指定的模式时,gawk就会在此一行执行指定的动作(action)。 Gawk文件的读取, gawk在处理数据时是一个一个记录地处理,每个记录默认为一行。记录被分为多个区域(fields)在gawk程序中,$1 表示第一个栏位,$2 表示第二个栏位。依次类推,$nf 表示最后一个栏位。 gawk文件的输出: 用 Print来输出 用 printf来精心控制输出。 6.用 nam gawk gnuplot xgraph来对trace文件进行分析 源程序: example_1.tcl 该程序执行完后生成 out.nam和out.tr文件 1.nam动画演示 2.gawk脚本分析分析 CBR业务丢包率,时延,FTP业务中的TCP序列号的变化过程。 丢包率( loss rate)是一个比率,gawk参看脚本loss.awk BEGIN { num_pkts_sent =0; num_pkts_rcvd =0; } { action =$1; time =$2; from =$3; to =$4; type =$5; pktsize=$6; flow_id=$8; src=$9; dst = $10; seq_no =$11; packet_id =$12; if(from==1action==+flow_id==2) num_pkts_sent++; if(to==3flow_id==2action==r) num_pkts_rcvd++; } END { printf(number of packets sent:%d lost: %d\n,num_pkts_sent,num_pkts_sent-num_pkts_rcvd); printf(the loss rate of packets is %f\n,num_pkts_rcvd/num_pkts_sent); } 执行 gawk f loss.awk out.tr 显示如下: 3.业务时延,脚本参看 delay.awk BEGIN { largest_index =0; } { action =$1; time =$2; from =$3; to =$4; type =$5; pktsize=$6; flow_id=$8; src=$9; dst = $10; seq_no =$11; packet_id =$12; if(largest_index seq_no) largest_index = seq_no; if(action==+from==1)start_time =time; if(action==rto==3)end_time =time; } END { printf(the largest_index is %d\n,largest_index); for(i =0;ilargest_index;i++) printf(%d %f %f\n,i,start_time ,end_time ); } 执行 命令行下输入: gnuplot回车 再执行 图像中 X轴代表包的序列号,Y轴代表发送或接受的时间。我们可以通过修改脚本,把CBR数据包的发送和接受记录输入到cbr_sent.txt和cbr_rcvd.tx中 通过输入 xgraph cbr_sent.txtcbr_rcvd.txt得到以下的图像。 3. ftp业务中 tcp序列号的变化统计 先执行如下的命令: gawk ($5==tcp$1==+$3==0) {print $2,$11}out.trtcp_seq_sent.txt gawk ($5==tcp$1==r$4==3) {print $2,$11}out.trtcp_seq_rcvd.txt 然后执行 gnuplot gnuplotplot tcp_seq_sent.txtusing 2:1,tcp_seq_rcvd.txtusing2:1 也可执行: xgraph tcp_seq_rcvd.txt tcp_seq_sent.txt
个人分类: 网络仿真|9556 次阅读|0 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅳ:NS-2网络控件及其使用方法
duankesong 2010-4-7 21:17
1,Simulator 类 在NS-2中,每个模拟过程需要一个类对整个过程进行控制和管理。这个类就是simulator类。这个类封装了节点(note),链路(link),代理(agent),数据分组格式等。整个模拟过程通过创建一个模拟类对象开始,通过调用这个对象的各个过程实现创建节点,构建拓扑结构图,对模拟的各个方面进行配置,定义事件,根据定义的事件模拟整个网络的运行等。 创建一个模拟器类对象的格式为: Set ns 2,NS-2 是一个事件驱动的模拟器,通常包括两部分:事件的触发时间和用来处理时间的功能函数的句柄。NS-2中模拟内部at过程的主要功能是在特定的时间调度事件处理函数处理事件。 Set ns $ns at 5.0 handle_fun $ns run Proc handle_dun{}{putsthis is the event handle function} 目前事件调度程序有四种事件调度器,分别为:链式,堆式,时间队列式,和实时,其中时间队列式为默认的。 本节相关概念为: Set ns Set now $ns halt $ns run $ns at time event 3, 节点note 在网络中将分布在不同地理位置的主机,交换机,路由器等网络设备在NS-2中统统抽象为一个节点,本节将介绍NS-2中节点的创建和配置方法。 根据网络节点之间通信方式的不同,分组的传输方式有两类,单播和多播。 单播节点的配置: Set ns Set n0 一个单播节点是由地址分类器和端口分类器两个tcl对象组成的。 地址分类器主要判断分组的地址和转发分组到下一个接收器。节点的地址模拟网络中的ip地址,有两种类型,默认为flat类型的,分类器中有一张shot表模拟网络中的路由表,一个shot码和一个节点地址相对应。 端口分类器的主要功能是按照分组的目的端口进行匹配,将分组传递给相应的agent对象。 多播节点的配置: 多播节点的配置,首先要把 Multicast属性值设置为: on,然后调用node过程创建多播节点。 创建一个多播节点的方法: Set ns Set n1 注意多播结构是一对多的通信,一个多播分组在转发时,分组需要被转发给多个目标对象,这就要求多播节点能够生成该分组的多个拷贝,多播节点包含复制器(Replicator)对象,并使用其生成分组的拷贝。 多播节点主要是由多播分类器和复制器组成。多播分类器根据源地址,和目的地址,将分组分类,富欧泊分类器内部保存了一张链式hash表,表的每一项包含源地址,多播目的地址,和slot码。 3.1 节点的配置。 无线网了中的节点是移动节点,拥有不同于有限节点的各种特性。所谓节点的配置就是在节点创建之前设定节点的各项属性,可是使用模拟器对象ns的内部过程node-config{}来配置节点的属性。包括,所有节点的属性,无线节点的属性和卫星节点的配置。 与节点有关的命令 $ns node 配置节点的类型 ,默认为没有分层的flat类型。 $node id 此命令是返回节点的id号。 $node node -addr 此命令是返回节点的地址。 $node reset 此命令重新设置绑定于节点的代理。 $node detach agent null_agent 将代理从这个节点上删除,然后在这个端口上绑定一个空代理。 $node attach agentoptional:port_num 节点自动为其分配一个端口号,并将该代理绑定到节点上。 3.2 链路 (link) 链路层负责对物理层上传输的数据进行检错和纠错。NS-2中的数据链路层同时实现了物理层,数据链路层和部分网络层的功能。 本节主要讲述如何将不同的节点连接起来。完成整个网络拓扑的结构的构建。因此,一个完整的网络拓扑包括节点的创建和节点的连接(用链路)两个部分,即节点和链路是组成网络哟拓扑的两个要素。 网络设备见的通信方式可以分为单工,半双工和拳双工三种方式。单工是数据只能沿一个方向传输。任何时候都不能改变数据传输的方向,在NS-2中我们采用创建简单的单向链路simplex-link来进行模拟这种通信方式。 半双工通信方式中,数据可以单向传输,但必须交替进行。不常用。 全双工通信放式中,数据可以同时双向传输。在NS-2中我们通过创建双向链路duplex-link来进行模拟。 创建单向链路 Set ns $ns simples-link node1 node2bandwidthdelayqueue_type 上述代码创建了一条node1到node2的单向链路,并且定义了链路的一下各项特性。 bandwidth 创建链路的带宽。delay 延时queue_type队列类型 创建双向链路 Set ns $ns duplex-link node1 node2bandwidthdelayqueue_type 等价于 Set ns $ns simples-link node1 node2bandwidthdelayqueue_type $ns simples-link node2 node1bandwidthdelayqueue_type 本节相关命令: $ns simples-link node1 node2bandwidthdelayqueue_type $ns duplex-link node1 node2bandwidthdelayqueue_type $ns simples-link node1 node2optionargs $ns duplex-link node1 node2optionargs 以上两个命令主要设置链路的属性,主要包括:方向,颜色,标签和队列的位置。设置这些主要用于nam的动画显示。 4. 代理 agent NS-2 中通过创建节点和链路来构建网络拓扑结构,然后就可以在各个节点间和链路上产生业务流。而NS-2中采用定义路由,代理和网络应用层来模拟实际的业务流。 代理可以构建和销毁网络层的分组,是网络层的起点和终点,同时,代理还可以实现各种不同层的网络协议。NS-2中采用/作为类名的分割符的。 Agent 类是有c++和otcl共同实现的。 Udp 和tcp是tcl/tp协议族在传输层主要的两个协议。Udp协议 无连接,但传输速度快。Tcp基于三次握手协议但传输速度没有udp速度快。 Udp 代理 agent/udp类agent类的一个子类,模拟了udp协议的主要功能。NS-2中创建和设置udp代理可以分为以下几个步骤。 步骤一:创建一个agent/udp对象并将其绑定到相应的节点上作为分组的发送器。 步骤二:设置agent/udp的部分内部变量。 步骤三:创建一个agent/null对象并将其绑定到相应的节点上作为分组的接受器。 步骤四:在两个发送和接受代理之间创建connection连接。 以下tcl代码具体显示了如何创建。Udp代理,激射节点n0和n1,以及模拟器对象已建立。 Set udp0 $ns attach-agent $n0 $udp0 $udp0 set packetsize_536 Set null0 $attch agent $n1 $ null0 $ns connect $udp0 $null0 TCP 代理 TCP代理分为单向代理和双向代理,这里主要是单向代理。 agent/TCPSink类为例。NS-2中创建和设置TCP代理可以分为以下几个步骤。 步骤一:创建一个agent/TCP对象,作为分组的发送器。 步骤二:设置Agent/TCP对象的部分内部变量。 步骤三:创建一个agent/TCPSink对象,作为分组的接受器。 步骤四:在两个发送和接受代理之间创建connection连接。 以下tcl代码具体显示了如何创建TCP代理,激射节点n0和n1,以及模拟器对象已建立。 Set tcp $ns attach-agent $n0 $tcp $tcp set fid_1 $tcp set window_20 Set sink $attch agent $n1 $ sink $ns connect $tcp $sink 与Agent相关的一些命令 Set agent $ns attach-agentnodeagent $agent port $agent dst port $agent attach app s_type $ns connectionsrcdst $ns create-connectsrctypesrcdsttypedstpktclass $agent attach-tracefile 5 应用层 在NS-2中,应用层建立在传输层之上。分为两大类。流量产生器(traffic generator)和应用模拟器(simolated application) 流量产生器一般用在udp代理之上。应用模拟器代理一般在tcp代理之上。 流量产生器: 一般有四种udp代理:指数分布流量代理器,pareto分布流量产生器。固定比率流量产生器。Trace文件流量产生器。 下面是一个例子说明流量产生器的使用,本节配置的是固定比率cbr流量发生器 步骤一:创建代理层对象并将传输层代理绑定到相应的节点上。创建 绑定 连接 Set src Set sinl $ns attach-agent $n0 $src $ns attach-agent $n0 $link $ns connect $src $sink 步骤二:创建流量产生器对象,设置对象属性,并将其与传输层的源代理绑定 可以通过调用application类的方法,也可以使用agent类中的方法 Set e $e set packetsize_300 $e set rate_32kb $e set random_On $e attach-agent $src 或: Set e $e set packetsize_300 $e set rate_32kb $e set random_true $e attach-app $e 步骤三:启动和停止流量产生器 $ns at $e start $ns at 5.0 $e stop 应用模拟器: 主要介绍ftp应用模拟器和telnet应用模拟器。 ftp 模拟器:对应的Otcl类为:Application/FTP,主要用来模拟大量数据的传送。 telnet 应用模拟器:telnet对象有两种分组的方法,如果interval_为零,那么分组发送的时间间隔均值为interval_ 的指数分布,如果为零,那么分组的发送时间间隔的选择按住奥tcplib经验分布,下面以tcp为例 set src ;# 创建一个TCP源代理,作为tcp分组的发送者。 set sink ;#创建一个tcpsink对象,作为tcp分组的接受者 $ns attach-agent $no $src ;#绑定节点 $ns attach-agent $n1 $sink ;# 绑定节点 $ns connection $src $sink ;#连接 Set ftp1 ;#;创建 $ftp attach-agent $src ;#绑定代理 $ns at 0.5 ftp start ;#启动
个人分类: 网络仿真|9611 次阅读|0 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅲ:Tcl和Otcl语言
duankesong 2010-4-7 21:17
Ns-2 的实现是由表示层和实现层。实现层: 采用 C++ 对象,方便协议和算法的实现,提高执行效率; 表示层: 采用 OTcl 对象,方便拓扑和节点属性的修改,提高仿真便利性。 语法说明: Tcl 只支持字符串一种数据结构,一种分割符就是空格 1 、基本命令格式: Command arg arg1 arg2 arg3 一个Tcl命令是由空格符分割的关键字所组成。其中,command是命令名称或者是一个Tcl过程名,其余都是该命令的参数。 一个Hello world!的例子: % puts stdout {Hello World!} 在这个例子,命令puts后面跟着两个参数,stdout 用来定义标准输入流。大括号把多个单词组成一个简单的参数。 2 、变量: 用set命令进行定义。注意参数之间是一个空格进行分割。 Set 参数一, 参数二 参数一为变量名,参数二为变量的赋值。 用$命令来获取变量的值,具体格式为:$变量名,中间没有空格 用unset命令来删除变量,使用方式为unset 变量名1,变量名二,。。。。。 用info命令来查看变量是否存在, 3. 变量的组合和替代 变量的替代分为命令替代,又称欠套替代和反斜杠替代,与转移字符类似。 命令替代用中括号[]来实现。 反斜杠替代与转义字符的含义类似。 双引号组合把组合内容作为字符串来看待,中间不允许有替代出现,而大括号替代则可是有替代出现,两者都实现把一串命令组合为一组命令的作用 4 数学运算 支持数学运算和位运算和逻辑运算。用expr命令把表达式传递给解释器,如:expr 4*5 5.Tcl 中用proc来定义过程,命令格式为: Proc 过程名 参数 过程体 过程名可以为任何字符,过程名和变量名没有任何冲突,为了习惯,过程名第一个字母大写。 参数多余一个用大括号组合,过程体多余一行也用大括号组合 过程体中的return可以省略。 6 .流程控制命令 6.1 ,if 表达式 then 命令体1 else 命令体2 6.2 ,switch flags 表达式 条件一 命令体1 条件二 命令体2。。。default 命令体n 一般情况下的格式为组合格式: switch flags 表达式{ 条件一 {命令体1} 条件二 {命令体2}。。。default {命令体n}} 其中flags为表达式的匹配方式,有三种,-exact为默认的,为精确匹配 -glob 为通配模式,*为任意字符,?为单个字符。 -regexp 为正则表达式匹配,表达式为正则表达式。 6.3 ,for循环命令 For 初始化 测试 表达式 循环体 Foreach While 6.4 ,catch命令用来扑获错误 6.5 用break,continue,return 6 ,注释 # 来注释。最前注释一行,后边注释加分号和#如 ;# 7 ,数组 8 ,面向对象的tcl 在tcl中增加了对象的支持,如类的定义,继承与封装,构造和析构函数
个人分类: 网络仿真|4754 次阅读|0 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅱ: NS-2实例编写
duankesong 2010-4-7 21:16
安装NS-2后,就可以运行该软件了。NS-2有两种运行方式,第一种是脚本方式,假设这里有个已编好的文件example.tcl文件,通过在linux控制端输入 ns example.tcl就可以运行该脚本了。第二种方法就是命令行方式,通过在linux系统下输入ns进入NS-2模拟环境。然后输入各种指令交互的运行。 1.编写一个tcl脚本一般分为以下几个步骤: 1) 创建模拟器对象,用来定义和控制模拟过程。在这个过程中,首先创建一个simulator 对象。 2) 设置跟踪文件 3) 创建网络拓扑结构。 4) 配置节点属性。 5) 创建拓扑结构 6) 设置代理和应用层协议,并进行绑定。 7) 使用模拟器对象的at过程设置节点事件和时间的对应关系。 8) 使用模拟器对象的run过程开始模拟。 9) 结果分析。模拟结束后,将得到保存模拟过程的trace文件,接下来的主要工作就是对于这个结果文件根据需求进行数据分析,同时可以用gnuplot等画图工具直观的显示数据分析结果。 2 ,下边是一个实例。新建一个文件,保存为example.tcl # 产生一个仿真的对象 set ns #针对不同的资料流定义不同的颜色,这是要给NAM用的 $ns color 1 Blue $ns color 2 Red #开启一个NAM trace file set nf $ns namtrace-all $nf #开启一个trace file,用来记录封包传送的过程 set nd $ns trace-all $nd #定义一个结束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd # 以背景执行的方式去执行NAM exec nam out.nam exit 0 } #产生四个网络节点 set n0 set n1 set n2 set n3 #把节点连接起来 $ns duplex-link $n0 $n2 2Mb 10ms DropTail $ns duplex-link $n1 $n2 2Mb 10ms DropTail $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail #设定ns2到n3之间的Queue Size为10个封包大小 $ns queue-limit $n2 $n3 10 #设定节点的位置,这是要给NAM用的 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n1 $n2 orient right-up $ns duplex-link-op $n2 $n3 orient right #观测n2到n3之间queue的变化,这是要给NAM用的 $ns duplex-link-op $n2 $n3 queuePos 0.5 #建立一条TCP的联机 set tcp $tcp set class_ 2 $ns attach-agent $n0 $tcp set sink $ns attach-agent $n3 $sink $ns connect $tcp $sink #在NAM中,TCP的联机会以蓝色表示 $tcp set fid_ 1 #在TCP联机之上建立FTP应用程序 set ftp $ftp attach-agent $tcp $ftp set type_ FTP #建立一条UDP的联机 set udp $ns attach-agent $n1 $udp set null $ns attach-agent $n3 $null $ns connect $udp $null #在NAM中,UDP的联机会以红色表示 $udp set fid_ 2 #在UDP联机之上建立CBR应用程序 set cbr $cbr attach-agent $udp $cbr set type_ CBR $cbr set packet_size_ 1000 $cbr set rate_ 1mb $cbr set random_ false #设定FTP和CBR资料传送开始和结束时间 $ns at 0.1 $cbr start $ns at 1.0 $ftp start $ns at 4.0 $ftp stop $ns at 4.5 $cbr stop #结束TCP的联机(不一定需要写下面的程序代码来实际结束联机) $ns at 4.5 $ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink #在仿真环境中,5秒后去呼叫finish来结束仿真(这样要注意仿真环境中 #的5秒并不一定等于实际仿真的时间 $ns at 5.0 finish #执行仿真 $ns run 3,实验结果与数据分析如下: 仿真结束后,会产生两个档案,一个是out.nam,这是给NAM用的,用来把仿真的过程用可视化的方式呈现出来,这可以让使用者用看的方式去了解封包传送是如何从来源端送到接收端。另一个档案是out.tr,这个档案记录了仿真过程中封包传送中所有的事件,例如第一笔记录是一个CBR的封包,长度为1000bytes,在时间0.1秒的时候,从n1传送到n2。这个档案对我们做效能分析很重要,所以要先对这个档案的格式做仔细的介绍。 +0.1 12cbr1000-------21.03.100 -0.1 12cbr1000-------21.03.100 +0.10812cbr1000-------21.03.111 -0.10812cbr1000-------21.03.111 r0.11412cbr1000-------21.03.100 +0.11423cbr1000-------21.03.100 -0.11423cbr1000-------21.03.100 +0.11612cbr1000-------21.03.122 -0.11612cbr1000-------21.03.122 r 0.12212cbr1000-------21.03.111 +0.12223cbr1000-------21.03.111 ................................................................. 每一笔记录的开始都是封包事件发生的原因,若是r则表示封包被某个节点所接收,若是+则表示进入了队列,若是-则表示离开队列,若是d则表示封包被队列所丢弃。接着的第二个字段表示的是事件发生的时间;字段三和字段四表示事件发生的地点(从from node到to node);字段五表示封包的型态;字段六是封包的大小,字段七是封包的旗标标注;字段八表示封包是属于那一个资料流;字段九和字段十是表示封包的来源端和目的端,这两个字段的格式是a.b,a代表节点编号,b表示埠号(port number);字段十一表示封包的序号;最后字段十二表示封包的id。以前面trace file的第一笔为例,意思就是说有一个封包pakcet id为0,资料流id为2,序号为0,长度为1000 bytes,型态为CBR,它是从来源端1.0要到目的地3.1,在时间0.1秒的时候,从节点1进入了节点2的队列中。
个人分类: 网络仿真|10510 次阅读|0 个评论
网络仿真利器NS-2无师自通七天速成系列Ⅰ: NS-2简介与实验环境的安装
duankesong 2010-4-7 21:16
近年来,网络通信技术日新月异,网络技术的研究炙手可热,促进人们不断的提高研究水平,更新研究技术,增加研究手段。目前网络通信的研究一般分为以下三种方式:(1)理论研究,(2)网络模拟,(3)试验测试。而网络模拟是目前网络通信研究中一种重要的方法。而NS-2是进行网络仿真最流行的软件之一,已广泛被科研院所和各大高校用于进行网络分析、研究和教学。 1. 简介 NS-2(Network Simulator Version 2) 最早来源于1989年哥伦比亚大学开发的Real Network Simulator项目,是一款开源免费的网络模拟软件。目前NS-2 可用于仿真各种不同的通信网络。已经实现的仿真模块有:网络传输协议,如TCP 和UDP;业务源流量产生器,如FTP、Telnet、Web CBR 和VBR;路由队列管理机制,如Droptai、RED 和CBQ;路由算法,如Dijkstra,以及无线网络的WLAN,Ad hoc 路由,移动IP 和卫星通信网络等。NS-2 也为进行局域网的仿真而实现了多播以及一些MAC 子层协议。 2. NS-2 试验环境的安装与配置 NS-2 需要在linux操作系统下运行,然而大多数人对linux操作系统不太熟悉,更习惯于windows操作系统,所以就需要把NS-2安装在windows平台下。 本实验环境的配置工具如下:Winxp+ VMware Workstation6+ RedHat linux+ ns-allinone-2.30. 2.1 Winxp 下安装VMware Workstation6 2.2 启动VMware Workstation6,新建虚拟机,在新建的虚拟机中选择 Red linux 5, 安装linux系统. 插入系统盘,进行启动,系统自动的会找到未分区的预留空间进行安装,按照提示进行安装.在分区的过程中,建议划出一个2倍于内存的交换类型空间(swap类型),一个100M的ex3类型的/home空间,剩下的全部分给ex3类型的/根空间。分区采用自动分区,分区如下: 在安装的过程中,要选择开发的组件,默认是不安装的,刚开始不太熟悉,可以选择全部安装。然后按照提示一步步的安装即可。 注意:在安装linux过程中要注意以下两点:第一,在虚拟机下安装,一定要选择自定义模式,然后选择硬盘类型为IDE类型,否则无法安装成功,第二,一定要在linux系统的安装过程中,要选择自定义方式,安装需要的软件,包括编辑软件。第三,配置linux环境有三种选择,直接安装linux系统,windows+模拟环境cygwin和windows+虚拟机+linux下安装。如果出于学习考虑,建议采用第三种方法,如果真正的去做实验建议采用第一种方法。当然,我们也可以选择不安装,而使用模拟环境cygwin来模拟linux系统,如果你要真正的学习网络模拟的话,不建议采用这中方法。 2.3 在linux环境下安装NS-2 假设你已经安装好linux系统,下面开始NS-2模拟环境的安装与配置。NS-2软件建议选择allinone (即all in one).此处和以后的试验环境我们使用的是ns-allinone-2.30。将ns-allinone-2.30.tar.gz 文件放在当前用户的home目录下,如果你是从网络上下载,一般默认是在这个目录下,你可以检查下;如果你通过其他方式,本实验是通过U盘的方式,把文件复制到该目录中。 2.3.1 安装ns-2 如果是root用户的显示为主机名#,非root用户显示为主机名$.果是root用户,你的home目录为/root,非root用户的home目录为/home/用户名。 命令说明:$cd (转到home目录下),$tar zxf ns-allione-2.30.tar.gz(解压软件包)$cd ns-allinone-2.30 (进入ns-allinone-2.30目录下) $./install (运行安装命令) 2.3.2 设置全局路径变量 上一步的安装成功后,最后输出部分会提示你必须设置三个全局变量path,ld_library_path和tcl_library.在自己的根目录下编辑终端配置文件 .bashrc,注意要带.开头, .bashrc是bash终端的配置文件,在Linux中它是隐藏文件,一般用ls命令看不出来,但可以采用vi命令编辑该文件: $cd $vi .bashrc ( 用linux系统提供的vi编辑器来编辑 .bashrc文件) 将光标移动到最后一行,按下insert键进行插入 export NS_HOME=~/ns-allinone-2.30 export PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/bin:$PATH export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.13/unix:$NS_HOME/tk8.4.13/unix:$NS_HOME/otcl-1.12:$NS_HOME/vlib:$LD_LIBRARY_PATH export TCL_LIBRARY=$NS_HOME/tcl8.4.13/library 在设置的过程中一定要细心。export后有一个空格,其他地方是以:来分割的。~/home目录,你也可以不用设置这个变量都是可以的,对于具体的版本中包含软件版本不同,可参看上面的图和下边的脚本进行相应放入更改。 编辑结束,按键盘上的退出键esc:退出插入模式,再输入:wq存盘退出. 2.3.3 简单测试 打开一个新终端 输入ns回车,在%号后输入空格+puts+空格+hello world,如果显示 hello world 则配置成功。否者查找原因重新配置。 如有问题请发邮件询问与技术支持:duankesong@126.com
个人分类: 网络仿真|8217 次阅读|2 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-3 12:25

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部