科学网

 找回密码
  注册

tag 标签: 网络模拟

相关帖子

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

没有相关内容

相关日志

cygwin+ns2安装笔记
热度 1 joypeng 2012-9-19 10:38
cygwin+ns2安装笔记
折腾两天,终于成功了安装ns2,记录下。 环境及软件:winxp+cygwin1.7.16+ns2.35 在www.cygwin.com下载setup.exe,只有688k,运行 setup后通过网络安装,默认安装的包不能满足ns的安装运行要求,需要选择的包有gcc4,gcc4- g++,gawk,tar,gzip,make,patch,perl,w32api,diff...,X...,xinit,libX11- devel,libxmu-devel,下图为证。 漫长的等待,安装完成后,打开Cygwin Terminal,运行startxwin,打开Cygwin-X窗口,成功安装。 接下来下载ns-allinone-2.35.tar.gz 解压:tar zxvf ns-allinone-2.35.tar.gz cd ns-allinone-2.35 安装:./install 漫长的等待。。。,成功。 还要设置环境变量,修改admin/peng/.bashrc,添加 export NA_HOME=/home/Admin/ns-allinone-2.35 export PATH=$NS_HOME/nam-1.15: $NS_HOME//tcl8.5.10/unix: $NS_HOME/tk8.5.10/unix: $NSHOME/bin:$PATH export LD_LIBRARY_PATH=$NS_HOME/tcl8.5.10/unix:$NS_HOME/tk8.5.10/unix:$NS_HOME/otcl-1.14:$NS_HOME/lib:$LD_LIBRARY_PATH export TCL_LIBRARY=$NS_HOME/tcl8.5.10/library 保存,完成环境变量的设置。 最后,运行一个例程: 打开Cygwin-X窗口, 运行: admin@info ~/ns-allinone-2.35$ ns ns-2.35/tcl/ex/simple.tcl 看到结果 :
个人分类: 学习|8508 次阅读|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文件)没有影响。
个人分类: 网络仿真|9133 次阅读|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无线移动终端多跳、自组织等功能。
个人分类: 网络仿真|10424 次阅读|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
个人分类: 网络仿真|9602 次阅读|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 ;#启动
个人分类: 网络仿真|9641 次阅读|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的队列中。
个人分类: 网络仿真|10534 次阅读|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-17 21:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部