一、NS2
1、离散事件驱动器
2、提供如下网络模拟组件
(1)流量模型和应用层程序:web、FTP、telnet、audio、sensor nets 幻灯片 4
(2)传输层协议:TCP(Reno、SACK等)、UDP、multicast
(3)路由和队列管理:DRS、AODV(Routing),DropTail、RED、FQ(Queue)
(4)链路层协议:wired、wireless、satellite
(5)辅助工具:tracing、error model等
3、仿真场景创建
(1)event scheduler
set ns [new Simulator]
$ns at <time><event>
$ns run
(2)nodes and links
set node [$ns node]
$ns duplex-link $n0 $n1 <bandwidth><delay><queue_type>
(3)create connections
(4)create traffic sources/sinks
(5)enable tracing
二、添加一个新代理
1、myagent.h
(1)类及其成员的声明
class MyAgent : public Agent {
public:
MyAgent();
int command (int argc,const char* const* argv);
private:
int my_var1
double my_var2
void MyPrivFunc(void);
2、myagent.cc
(1)TclCl:将C++类导出至Otcl
static class MyAgentClass:public TclClass {
public:
MyAgentClass():TclClass("Agent/MyAgent"){}
TclObject* create(int,const char*const*){
return(new MyAgent());
}
} class_my_agent;
(2)构造函数:将C++变量到处至Otcl(实施变量绑定),并对成员变量初始化
MyAgent::MyAgent()
:Agent(PT_UDP) {
bind("my_var1",&my_var1);
bind("my_var2",&my_var2);
}
(3)command函数:将C++对象控制命令导出至Otcl
int MyAgent::command(int argc,const char* const* argv){
if (argc == 2) {
//argv[0]包含方法名"cmd",argv[1]指定欲进行的操作,用户指定的其它参数置于argv[2…(argc-1)]中,这些参数作为字符串传递;它们必须转换为适当的类型。只从argv[1]开始比较
if (strcmp (argv[1],"call-my-priv-func") == 0) {
MyPrivFunc ();
return(TCL_OK);
}
}
return Agent::command(argc,argv);#若没有匹配操作,则调用父类command方法,并返回结果
}
(4)成员函数实例化
(5)tcl中的使用
set myagent [new Agent/MyAgent]
设置configurable成员变量的值:$myagent set my_var1 2;$myagent set my_var2 3.14
give a command to MyAgent:$myagent call-my-priv-func->可以有多个命令,就看命令的参数个数,并且通过比较[argv 1]来判断是执行什么命令
3、总结:如何添加一个新类
要往NS2中添加自己的模块,至少要实现两个类:
(1)首先要有一个类继承自TclObject类或者其子类。这个类里面实现了C++类里面的变量与Otcl类的变量的绑定关系,以及我们的模块要实现的一系列算法等。
(2)其次要定义一个声明为static的类,继承自TclClass类,这个类实现了C++环境里面的类与Otcl环境里面的类的关联,简单点来说,这个类负责与Otcl环境进行关联。
(3)当要实现的类完成以后,将头文件和源文件放置于~ns目录下自己新建的一个子目录内,然后打开~ns/Makefile文件,将“类名.o”添加到该Makefile的OBJ_CC宏定义中,对ns进行编译的时候就能够找到该模块的源文件并将其编译到ns中;如果类中定义了一些变量,打开~ns/tcl/lib/ns-default.tcl文件,为该类对应的Otcl类变量设置初始值。最后,重新编译ns。