新增或修改NS2的核心模块
NS2开发模块和tcl调试

分类:网络模拟器(NS2)2013-07-04 13:20 183人阅读评论(4) 收藏举报NS2最近,自己在做ns2的开发,主要就是为了科研啦,其他基本上不会涉及这个网络仿真平台。
废话不多说了,开始介绍这个NS2开发平台的搭建:1、安装JDK。
JDK的版本找个最新的就可以了,安装是采用默认目录,安装好配置下环境变量:path,classpath。
这一步基本没什么问题的;2、需要安装netbeans。
建议选择一个完整版的,其中包含了C++开发的插件。
安装过程中依据向导选择就好了,最后都能完成安装的;3、安装cygwin。
这里我采用了一个完整版的cygwin,读者可以根据自己需要采用各自的版本,不受限制的,只要第4步的NS2能安装上即可。
有关cygwin的安装请参考柯志恒的网站(在google中输入ns2就能找到,一般在第二个),这里就不细讲了。
4、安装NS2。
这一步很多时候会存在问题,有关安装的问题可以参考NS2的官网,在此不再赘述。
5、建立一个NS2项目,这是关键,前面的平台搭建好了,该怎么开发NS2项目呢?接下来细细道来:首先,打开“文件”——>“新建项目”,选择类别中的“C/C++”,在右边项目选框中选择“基于现有源代码的C/C++项目”,点击下一步;其次,点击“浏览”按钮,选择ns-2.xx所在的位置,点击确定。
其他部分保持默认,单击完成,此时就已经创建了已有源码的项目了,需要编译一段时间,耐心等待。
6、编译完成之后,就可以在已有的NS2项目中建立或修改项目了。
如果是建立项目,则建议在ns-2.xx下建立一个自己的项目文件夹,然后将写的C++或脚本放入其中;如果是修改原项目,则不需要了。
7、建立或修改完项目后,需需要进行“生成”或“清除并生成”,前一个只编译修改过的文件,后一个则先清除已有编译文件,并重新全部编译。
建议前一种。
8、如果建立的项目没问题,则可编写脚本进行仿真了。
如果有问题则需要进行错误调试。
Linux下的NS229安装及错误调试

Linux下的NS2安装+LEACH及错误修改一、安装前的预备说明为了方便实验和利用,采纳的实在虚拟机上安装,安装和配置进程与实体无异。
环境:+预备:在安装编译之前确保Linux中已经安装了gcc++编译工具,和XFree86-devel and XFree86-libs两个组件。
别离为:X 软件开发KDE桌面环境,能够在添加删除程序中进行安装。
二、安装进程1. 本实验安装环境:完全安装的RedHat 操作系统,安装包。
2. 到官方下载网址下载NS2安装软件包以root登录RH9,在/home下成立ns2文件夹,将放在该文件夹下,在终端运行cd /home/ns2,利用解压命令tar xvfz ,即生成/home/ns2/ .4. 修改/home/ns2/ 中的第73行,将NULL改成0.5. 在/home/ns2/ 下运行。
/install6. 依照安装终止后结尾处的提示,将某些途径复制下来,或直接依照以下修改(能够对照提示明白得):7. 修改/root/.bashrc(注意该文件为隐藏文件),在该文件末尾加上以下三句话:exportPATH=$PATH:/home/ns2/bin:/home/ns2/ /:/home/ns2/:/home/ns2/:/home/ns2/lib exportTCL_LIBRARY=$TCL_LIBRARY:/home/ns2/在root途径下输入命令:source .bash_profile进行环境变量的更新8.这时,假设是以上设置正确,直接运行ns会显现%,或能够运行软件自带的例子,在/home/ns2/ns-tutorial/examples下运行nsLEACH协议的安装预备:获取LEACH的源码文件:1.进入到目录/home/ns2/下解压LEACH协议源文件[root@localhost root]# cd /home/ns2/[root@localhost ]# tar -xzcf ./2.修改MakeFile文件1)添加-DMIT_uAMPS到DEFINE中DEFINE = -DTCP_DELAY_BIND_ALL.......-DMIT_uAMPS2)添加-I./mit/rca -I./mit/uAMPS到INCLUDE中INCLUDES = \-I./diffusion3/filter_core -I./asim/ -I./qs \-I./diffserv -I./satellite \-I./wpan \-I./mit/rca -I./mit/uAMPS \3)添加以下代码在gaf/ \之前mit/rca/ mit/rca/ \mit/rca/ mit/rca/ \mac/ mac/ mit/uAMPS/ \注:添加进程中利用TAB键代替空格。
NS2安装与使用

一、NS2 程序简介对于如何验证网络协议的正确性和进行相关性能测试,人们提出了很多方法,目前最广泛使用的方法就是通过虚拟环境进行模拟仿真。
NS-2 是进行网络仿真最流行的软件,已广泛被科研院所和各大高校用于进行网络分析、研究和教学。
它支持众多的协议,并提供了丰富的测试脚本。
NS-2 全称是Network Simulator Version 2。
它是面向对象的,离散事件驱动的网络环境模拟器,主要用于解决网络研究方面的问题。
NS-2 提供在无线或有线网络上,TCP、路由、多播等多种协议的模拟。
NS-2最早来源与1989年的Real Network Simulator 项目,经过多年的发展之后,于1995年得到施乐公司(Xerox)的支持,加入VINT 项目。
NS 一直以来都在吸收全世界各地研究者的成果,包括UCB、CMU 等大学和SUN等公司的无线网络方面的代码。
NS-2 由两种编程语言,OTCL(具有面向对象特性的TCL 脚本程序设计语言)和C++实现。
之所以使用两种编程语言,是因为模拟器有两方面的事情需要做。
一方面,具体协议的模拟和实现,需要一种程序设计语言,能够高效率的处理字节(Byte),报头(Packet Header)等信息,能够应用合适的算法在大量的数据集合上进行操作。
为了实现这个任务,程序内部模块的运行速度(run-time speed)是非常重要的,而运行模拟环境的时间、寻找和修复bug 的时间,重新编译和运行的时间(run-around time)不是很重要。
这种情况下,C++语言是非常合适的。
另一方面,许多网络中的研究工作都围绕着网络组件和环境的具体参数的设置和改变而进行的,需要在短时间内快速的开发和模拟出所需要的网络环境(scenarios),并且方便修改和发现、修复程序中的Bug。
在这种任务中,网络环境布置的时间就显得很重要了,因为模拟环境的建立和参数信息的配置只需要运行一次。
NS2中SMAC修改

NS2中SMAC修改先调用SMAC的构造函数,里面有mhGene_.sched(t),经过t秒后超时,超时后调用handleGeneTimer()函数。
setMySched(): 把MAC state设为0,numSched_设为1,把调度表的txSync设为1,说明要发送同步帧。
如果没有收到同步帧,就要自己建立调度表,调度表的状态加1,并且把调度表的同步节点设置为当前节点。
经过listenTime_+index*10的时间后CounterTimer超时,调用handleCounterTimer()函数。
handleCounterTimer():首先要保证该调度表的节点数大于0,如果改CounterTimer的value是sleepTime_的话,说明现在睡眠已经结束了。
如果现在radioState不能发送或接收的话,给CounterTimer设置ListenTime_的时间,超时后调用handleCounterTimer()函数。
如果MAC state可以发送并且该调度表的txSync_为1的话,把syncSched_设置为该调度表的id,同时开始竞争退避,当计数器减到0的时候调用handleCSTimer()函数。
adaptiveListen(): 如果节点处于睡眠状态,就把节点唤醒,总之要保证节点是醒着的。
然后判断节点是否有数据要发送,如果有数据发送的话调用checkToSend()这个函数发送数据。
同时设置了adapTime,节点在adapTime这段时间后定时器超时,调用handleAdaptiveListenTimer()函数。
如果是收到同步帧的话,经过同步帧中的sleepTime来设置CounterTimer,并且经过sleepTime后调用handleCounterTimer()函数。
然后把我的同步节点设为收到的同步帧中指示的同步节点。
把0号调度表的节点数增加1,0号调度表的同步节点设置为收到的同步帧中指示的同步节点,并且调度表的状态数加1.然后把发同步帧的节点加到我的同步列表中。
ns2的基本功能和用法。

ns2的基本功能和用法。
NS2是一款广泛使用的离散事件网络仿真器,它可以用来模拟网络协议、网络拓扑结构、传输层协议等各种网络方面的问题。
在本文中,我们将会详细介绍NS2的基本功能和用法,让您了解如何使用这个强大的工具来开展网络仿真和探索。
第一部分:NS2的简介NS2全称Network Simulator 2,是一款免费且开源的网络仿真平台,它可以运行于Linux和Windows操作系统。
NS2是C++编写的,它是由一个模块化的体系结构构建而成的。
NS2可以帮助你模拟和测试各种网络协议和技术,包括但不限于TCP/IP、WiFi、无线通信、移动通信、卫星通信等。
NS2的基本组成部分包括:- OTcl:OTcl是一个面向对象的Tcl解释器,它被用来编写NS2的脚本文件。
它可以帮助您表示仿真模型以及控制仿真场景和参数。
- C++代码:NS2的模拟核心是由C++编写的,它包含了底层的网络协议处理逻辑和数据结构。
- Trace:NS2的Trace模块可以记录仿真过程中所有的事件和消息交换。
我们可以通过Trace来分析仿真结果,并对仿真场景进行可视化。
总结NS2是一个开源且强大的网络仿真器,它的核心部分是由C++编写而成的。
NS2可以帮助您模拟和测试各种网络协议和技术,并提供一个强大的OTcl 脚本语言来控制和配置仿真模型。
第二部分:NS2的基本功能NS2提供了很多强大的功能,如下所示:1. 拓扑结构模拟NS2可以帮助我们模拟各种网络拓扑结构,例如星型、树形结构、层次结构等。
通过定义节点、连接和协议,我们可以很容易地构建复杂的拓扑结构,并进行仿真和测试。
2. 参数设置和控制通过OTcl脚本,我们可以轻松地配置和控制仿真模型。
我们可以设置各种参数,例如发送速率、仿真持续时间、节点位置等等。
此外,我们还可以通过设置事件触发器来控制仿真场景的流程。
3. 模拟协议NS2可以帮助我们模拟各种协议,例如TCP、UDP、ICMP等。
NS2仿真在计算机网络课程教学中的应用

购买了“ 锐捷” 网络实验设备 , 花大力组建 网络实训室. 但是 由于网络技术与其附属产品更新换代 、 网络实 验综合性强 、 实验室建设软硬件投入成本高等多方面的复杂原 因, 使得大部分院校很难持续性投入建设 满足各方面需求的实验教学环境 , 直接影响 了网络课程的教学质量与效果. 另一方面, 目 前在网络相关课 程上开设的网络实验通常是以交换机和路 由器设备为主的配置型实验 , 很少深入网络内核对教材相关 内 容配套进行验证实验 , 因此虽然也进行 了实验 , 但学生还是不能很好 的了解网络低层的工作过程及其工
第2 5卷第 2 期
2 0 1 3 年 5月
宁德师范学院学报( 自然科学版)
J o u r n a l o f N i n g d e N o r ma l U n i v e r s i t y( N a t u r a l S c i e n c e )
Vo 1 . 2 5№ . 2
较 困难 , 因此研究经济高效的计算机 网络实验教学方法已经成为当今计算机教育界 的研究热点. 本文 以 宁德师范学院作为理论调研和实践验证对象 , 通过理论与实践相结合 的研究方法 , 尝试解决高校网络实 验教学中普遍存在的问题 , 对计算机网络课程现行教学方法进行改革探索 , 以期达到 良好的教学效果.
作原理 , 计算机网络教学效果不容乐观. 这是 目 前高校计算机网络教学过程 的通病 , 解决这个问题可以尝 试将 网络仿真技术引入到计算机网络教学过程 , 改变传统的教学模式 , 形成新的以网络仿真技术为辅助
手段 的理论教学方法 , 同时也是实践教学过程的有益补充. 实际上仿真教学很早就 已经提出, 其实质是以 仿真技术为基础、 仿真机为工具 , 用实时运行 的动态数学模型代替真实装置进行教学的一种崭新的教学
浅析Opnet,Ns2,Matlab网络仿真工具

浅析Opnet,Ns2,Matlab网络仿真工具【摘要】网络仿真可以有效提高网络规划和设计的可靠性和准确性,明显地降低网络投资风险,减少不必要的投资浪费。
本文就常见的三种网络仿真工具(OPNET、NS2及MATLAB),从它们的基本情况及特点进行了分析。
【关键字】网络仿真;OPNET;NS2;MATLAB引言随着网络结构和规模越来越复杂化以及网络的应用越来越多样化,单纯地依靠经验进行网络的规划和设计、网络设备的研发以及网络协议的开发,已经不能适应网络的发展,因而急需一种科学的手段来反映和预测网络的性能,网络仿真技术应运而生。
网络仿真可以有效提高网络规划和设计的可靠性和准确性,明显地降低网络投资风险,减少不必要的投资浪费。
各种网络仿真工具在此背景下应运而生。
本文就常见的三种网络仿真工具(OPNET、NS2及MATLAB),从它们的基本情况及特点进行了分析。
基本情况及特点分析1.OPNETOPNET公司最初只有一种产品OPNET Modeler,到目前已经拥有Modeler、ITGuru、SPGuru、WDMGuru、ODK等一系列产品。
对于网络的设计和管理,一般分为3个阶段:第1阶段为设计阶段,包括网络拓扑结构的设计,协议的设计和配置以及网络中设备的设计和选择;第2阶段为发布阶段,设计出的网络能够具有一定性能,如吞吐率、响应时间等等;第3阶段为实际运营中的故障诊断、排错和升级优化。
而OPNET公司的整个产品线正好能面向网络研发的不同阶段,即可以作网络的设计,也可以作为发布网络性能的依据,还可以作为已投入运营的网络的优化和故障诊断工具。
OPNET公司也是当前业界智能化网络管理分析解决方案的主要提供商。
OPNET的主要特点:层次化的网络模型。
使用无限嵌套的子网来建立复杂的网络拓扑结构。
简单明了的建模方法。
Modeler建模过程分为3个层次:过程(process)层次、节点(Node)层次以及网络(Network)层次。
NS-2入门简介PPT课件

Tcl的executer的功能是:把Tcl的Parser处理过的命令或语句字符串 向量进行分析。由于字符串向量的第一个字符串元素是命令的名称, 那么executer匹配Tcl中C库函数的函数名,当匹配到的时候,把全 部参数传递给匹配到的C函数来执行命令,然后返回结果。如果匹 配不到则返回错误。
6
2021/6/4
Tcl与Tk编程环境概述
# Writing a procedure called "test" proc test {} {
set a 43 set b 27 set c [expr $a + $b] set d [expr [expr $a - $b] * $c] for {set k 0} {$k < 10} {incr k} {…………} } # Calling the "test" procedure created above test
7
2021/6/4
Tcl命令和语句的执行过程
Tcl解释器分为两个主要模块,Tcl的Parser和Tcl的executer。
Tcl的Parser要执行的主要功能是:把输入的命令或者语句切割成一 个一个的字符串,并在一遍扫描的过程中进行变量替换、命令结果 替换和特殊字符替换。在切割过程中不对命令进行任何语意理解。
12
2021/6/4
为什么是C++和OTCL来实现?
为了满足以上两种不同任务的需要,NS的设计实现使用了两种程序 设计语言,C++和Otcl。
这两种程序设计语言都是面向对象源自object oriented)的程序设计 语言 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
這個章節最主要的目的就是希望使用者可以學會如何新增或修改ns2的核心模組,更明確的說就是去新增和修改[*.cc, *.h]檔案,以筆者和筆者朋友學習ns2的經驗來說,這需要花很多時間和很大的勇氣,時間是花來找資料,勇氣是用來承受當程式寫不好時,ns2可能隨時會當掉。
不過別怕,只要跟著筆者所介紹的方法,一定可以成功,若是不成功,就寫信給筆者吧。
若是一開始就要叫ns2的新手去增加的模組,新手一定會哇哇叫,所以筆者不會這樣做,筆者先教大家拷貝ns2已經有的模組檔,但改成別的名字,這樣就可以輕鬆且很明確知道該如何增加模組。
(1)(1)打開cygwin的命令視窗,把路徑切換到queue的目錄下。
cd ns-allinone-2.27/ns-2.27/queue(2)(2)拷貝drop-tail.[cc, h]到myfifo.[cc.h]。
cp cp drop-tail.h myfifo.h(3)(3)使用文字編輯軟體去修改myfifo.h和。
(因為我們的環境是在windows下,所以建議可以使用ultra-edit來修改。
a. a.先修改myfifo.h,使用取代的功能把所有DropTail改成myfifo,另外,把drop_tail改成myfifo。
#ifndef ns_myfifo_h#define ns_myfifo_h#include <string.h>#include "queue.h"#include "config.h"/** A bounded, drop-tail queue*/class myfifo : public Queue {public:myfifo() {q_ = new PacketQueue;pq_ = q_;bind_bool("drop_front_", &drop_front_);bind_bool("summarystats_", &summarystats);bind_bool("queue_in_bytes_", &qib_); // boolean: q in bytes?bind("mean_pktsize_", &mean_pktsize_);// _RENAMED("drop-front_", "drop_front_");}~myfifo() {delete q_;}protected:void reset();int command(int argc, const char*const* argv);void enque(Packet*);Packet* deque();void shrink_queue(); // To shrink queue and drop excessive packets.PacketQueue *q_; /* underlying FIFO queue */int drop_front_; /* drop-from-front (rather than from tail) */int summarystats;void print_summarystats();int qib_; /* bool: queue measured in bytes? */int mean_pktsize_; /* configured mean packet size in bytes */};#endifb. b.再修改,使用取代的功能把所有DropTail改成myfifo,另外,把drop_tail改成myfifo和drop-tail改成myfifo。
#include "myfifo.h"static class myfifoClass : public TclClass {public:myfifoClass() : TclClass("Queue/myfifo") {}TclObject* create(int, const char*const*) {return (new myfifo);}} class_myfifo;void myfifo::reset(){Queue::reset();}int myfifo::command(int argc, const char*const* argv) {if (argc==2) {if (strcmp(argv[1], "printstats") == 0) {print_summarystats();return (TCL_OK);}if (strcmp(argv[1], "shrink-queue") == 0) {shrink_queue();return (TCL_OK);}}if (argc == 3) {if (!strcmp(argv[1], "packetqueue-attach")) {delete q_;if (!(q_ = (PacketQueue*) TclObject::lookup(argv[2])))return (TCL_ERROR);else {pq_ = q_;return (TCL_OK);}}}return Queue::command(argc, argv);}/** drop-tail*/void myfifo::enque(Packet* p){if (summarystats) {Queue::updateStats(qib_?q_->byteLength():q_->length());}int qlimBytes = qlim_ * mean_pktsize_;if ((!qib_ && (q_->length() + 1) >= qlim_) ||(qib_ && (q_->byteLength() + hdr_cmn::access(p)->size()) >= qlimBytes)){ // if the queue would overflow if we added this packet...if (drop_front_) { /* remove from head of queue */q_->enque(p);Packet *pp = q_->deque();drop(pp);} else {drop(p);}} else {q_->enque(p);}}//AG if queue size changes, we drop excessive packets...void myfifo::shrink_queue(){int qlimBytes = qlim_ * mean_pktsize_;if (debug_)printf("shrink-queue: time %5.2f qlen %d, qlim %d\n",Scheduler::instance().clock(),q_->length(), qlim_);while ((!qib_ && q_->length() > qlim_) ||(qib_ && q_->byteLength() > qlimBytes)) {if (drop_front_) { /* remove from head of queue */Packet *pp = q_->deque();drop(pp);} else {Packet *pp = q_->tail();q_->remove(pp);drop(pp);}}}Packet* myfifo::deque(){if (summarystats && &Scheduler::instance() != NULL) {Queue::updateStats(qib_?q_->byteLength():q_->length());}return q_->deque();}void myfifo::print_summarystats(){//double now = Scheduler::instance().clock();printf("True average queue: %5.3f", true_ave_);if (qib_)printf(" (in bytes)");printf(" time: %5.3f\n", total_time_);}(4)(4)修改ns-default.tcl檔,設定初始內定值。
a. a.cd ns-allinone-2.27/ns-2.27/tcl/lib/b. b.使用文字編輯軟體打開ns-default.tclc. c.使用搜尋的功能找到Queue/DropTaild. d.把每個初始設定值都再設一份給Queue/myfifo……………………………………………..Queue/DropTail set drop_front_ falseQueue/DropTail set summarystats_ falseQueue/DropTail set queue_in_bytes_ falseQueue/DropTail set mean_pktsize_ 500Queue/myfifo set drop_front_ falseQueue/myfifo set summarystats_ falseQueue/myfifo set queue_in_bytes_ falseQueue/myfifo set mean_pktsize_ 500……………………………………………..(5)(5)修改Makefile,把myfifo.o加入OBJ_CC內,並重新編譯。
a. a.使用文字編輯軟體打開ns-allinone-2.27/ns-2.27目錄下的Makefileb. b.使用搜尋找到drop-tail.o。
c. c.在drop-tail.o後面加上queue/myfifo。
……………………………………………..tools/flowmon.o tools/loss-monitor.o \queue/queue.o queue/drop-tail.o queue/myfifo.o \adc/simple-intserv-sched.o queue/red.o \……………………………………………d. d.重新編譯。