ns2仿真机制及代码分析

合集下载

NS2仿真实验报告

NS2仿真实验报告

Ns2简单有线网络仿真实验报告一、实验概述1、在windows系统下安装Centos虚拟机2、在Centos系统下安装NS2仿真工具包3、Nam方式示例二、实验内容1)NS2仿真工具包安装说明1.在Centos系统下设置root账户2.解压NS2文件3.安装ns-allinone-2.35设置环境变量4.验证NS2工具包安装情况2)Nam方式Otcl脚本# 产生一个仿真的对象set ns [new Simulator]#针对不同的资料流定义不同的颜色,这是要给NAM用的$ns color 1 Green$ns color 2 Red#开启一个NAM trace fileset nf [open out.nam w]$ns namtrace-all $nf#开启一个trace file,用来记录封包传送的过程set nd [open out.tr w]$ns trace-all $nd#定义一个结束的程序proc finish {} {global ns nf nd$ns flush-traceclose $nfclose $nd#以背景执行的方式去执行NAMexec nam out.nam &exit 0}#产生6个网络节点set n0 [$ns node]set n1 [$ns node]set n2 [$ns node]set n3 [$ns node]set n4 [$ns node]set n5 [$ns node]#把节点连接起来$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$ns duplex-link $n3 $n4 1.7Mb 30ms DropTail$ns duplex-link $n3 $n5 1.5Mb 30ms DropTail#设定ns2到n3之间的Queue Size为10个封包大小$ns queue-limit $n2 $n3 10$ns queue-limit $n3 $n4 5#$ns queue-limit $n3 $n5 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$ns duplex-link-op $n3 $n4 orient right-up$ns duplex-link-op $n3 $n5 orient right-down#观测n2到n3之间queue的变化,这是要给NAM用的$ns duplex-link-op $n2 $n3 queuePos 0.5#建立一条n0-n5TCP的联机set tcp [new Agent/TCP]$ns attach-agent $n0 $tcpset sink [new Agent/TCPSink]$ns attach-agent $n5 $sink$ns connect $tcp $sink#在NAM中,TCP的联机会以Green表示$tcp set fid_ 1#在TCP联机之上建立FTP应用程序set ftp [new Application/FTP]$ftp attach-agent $tcp$ftp set type_ FTP#建立一条UDP的联机set udp [new Agent/UDP]$ns attach-agent $n1 $udpset null [new Agent/Null]$ns attach-agent $n3 $null$ns connect $udp $null#在NAM中,UDP的联机会以红色表示$udp set fid_ 2#在UDP联机之上建立CBR应用程序set cbr [new Application/Traffic/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 run3)仿真结果仿真结束后,会产生out.nam和out.tr两个档案用来把仿真的过程用可视化的方式呈现出来4)数据分析1.End-to-End Delay把测量CBR封包端点到端点间延迟时间的awk程序,写在档案measure-delay.awk档案中BEGIN {#程序初始化,设定一变量以记录目前最高处理封包的ID。

ns2-25工作原理

ns2-25工作原理

ns2-25工作原理
NS2是一个用于网络仿真的工具,它的工作原理涉及到网络模拟、数据包传输、路由算法等多个方面。

NS2使用离散事件驱动的
仿真引擎,能够模拟网络中各种节点之间的通信和数据传输过程。

它可以模拟各种不同类型的网络,包括有线网络和无线网络,以及
各种协议和路由算法。

NS2的工作原理主要包括以下几个方面:
1. 网络拓扑建模,用户可以通过NS2的编程接口定义网络拓扑
结构,包括节点之间的连接关系、链路的传输特性等。

2. 事件驱动仿真,NS2使用事件驱动的仿真引擎,通过模拟时
间的推进来触发各种网络事件,如数据包的发送、接收、路由表的
更新等。

3. 数据包传输模拟,NS2可以模拟数据包在网络中的传输过程,包括数据包的封装、路由选择、传输延迟等。

4. 路由算法模拟,NS2内置了多种常见的路由算法,用户可以
通过配置来选择不同的路由算法,并观察它们在网络中的表现。

5. 性能分析与评估,NS2可以对网络仿真过程中产生的数据进行统计分析,包括吞吐量、延迟、丢包率等性能指标的评估。

总的来说,NS2通过对网络中各种事件的仿真和模拟,帮助用户了解和评估不同网络设计和路由算法的性能表现,从而指导实际网络的部署和优化。

它在学术研究和网络性能分析方面有着广泛的应用。

NS2仿真实例汇总

NS2仿真实例汇总

NS-2仿真模拟实例汇总(以方路平的书为主)1.例4.5a:DropTail队列管理的NS_2模拟实例(P161) set ns [new Simulator]set nf [open out.nam w]$ns namtrace-all $nfset tf [open out.tr w]set windowVsTime [open win w]set param [open parameters w]$ns trace-all $tfproc finish {} {global ns nf tf$ns flush-traceclose $nfclose $tfexec nam out.nam &exit 0}set n2 [$ns node]set n3 [$ns node]$ns duplex-link $n2 $n3 0.7Mb 20ms DropTailset NumbSrc 3set Duration 50for {set j 1} {$j <=$NumbSrc} {incr j} {set S($j) [$ns node]}set rng [new RNG]$rng seed 2set RVstart [new RandomVariable/Uniform]$RVstart set min_ 0$RVstart set max_ 7$RVstart use-rng $rngfor {set i 1} {$i <=$NumbSrc} {incr i} {set startT($i) [expr [$RVstart value]]set dly($i) 1puts $param "startT($i) $startT($i) sec"}for {set j 1} {$j <=$NumbSrc} {incr j} {$ns duplex-link $S($j) $n2 10Mb $dly($j)ms DropTail$ns queue-limit $S($j) $n2 20}$ns queue-limit $n2 $n3 100for {set j 1} {$j <=$NumbSrc} {incr j} {set tcp_src($j) [new Agent/TCP/Reno]$tcp_src($j) set window_ 8000}for {set j 1} {$j<=$NumbSrc} {incr j} {set tcp_snk($j) [new Agent/TCPSink]}for {set j 1} {$j <=$NumbSrc} {incr j} {$ns attach-agent $S($j) $tcp_src($j)$ns attach-agent $n3 $tcp_snk($j)$ns connect $tcp_src($j) $tcp_snk($j)}for {set j 1} {$j <=$NumbSrc} {incr j} {set ftp($j) [$tcp_src($j) attach-source FTP]}for {set j 1} {$j <=$NumbSrc} {incr j} {$tcp_src($j) set packetSize_ 552}for {set i 1} {$i <=$NumbSrc} {incr i} {$ns at $startT($i) "$ftp($i) start"$ns at $Duration "$ftp($i) stop"}proc plotWindow {tcpSource file k} {global ns NumbSrcset time 0.03set cwnd [$tcpSource set cwnd_]if {$k==1} {puts -nonewline $file "$now \t $cwnd \t"} else {if {$k< $NumbSrc} {puts -nonewline $file "$cwnd \t"}}if {$k== $NumbSrc } {puts -nonewline $file "$cwnd \n"}$ns at [expr $now+$time] "plotWindow $tcpSource $file $k"} for {set j 1} {$j <= $NumbSrc} {incr j} {$ns at 0.1 "plotWindow $tcp_src($j) $windowVsTime $j"}$ns monitor-queue $n2 $n3 [open queue.tr w] 0.05[$ns link $n2 $n3] queue-sample-timeout$ns at [expr $Duration] "finish"$ns run2.例4.5b:RED队列管理的NS-2模拟实例(P164) set ns [new Simulator]set nf [open out.nam w]$ns namtrace-all $nfset tf [open out.tr w]set windowVsTime [open win w]set param [open parameters w]$ns trace-all $tfproc finish {} {global ns nf tf$ns flush-traceclose $nfclose $tfexec nam out.nam &exit 0}set n2 [$ns node]$ns duplex-link $n2 $n3 0.7Mb 20ms REDset NumbSrc 3set Duration 50for {set j 1} {$j <=$NumbSrc} {incr j} {set S($j) [$ns node]}set rng [new RNG]$rng seed 2set RVstart [new RandomVariable/Uniform]$RVstart set min_ 0$RVstart set max_ 7$RVstart use-rng $rngfor {set i 1} {$i <=$NumbSrc} {incr i} {set startT($i) [expr [$RVstart value]]set dly($i) 1puts $param "startT($i) $startT($i) sec"}for {set j 1} {$j <=$NumbSrc} {incr j} {$ns duplex-link $S($j) $n2 10Mb $dly($j)ms DropTail$ns queue-limit $S($j) $n2 20}$ns queue-limit $n2 $n3 100for {set j 1} {$j <=$NumbSrc} {incr j} {set tcp_src($j) [new Agent/TCP/Reno]$tcp_src($j) set window_ 8000}for {set j 1} {$j<=$NumbSrc} {incr j} {set tcp_snk($j) [new Agent/TCPSink]}for {set j 1} {$j <=$NumbSrc} {incr j} {$ns attach-agent $S($j) $tcp_src($j)$ns attach-agent $n3 $tcp_snk($j)$ns connect $tcp_src($j) $tcp_snk($j)for {set j 1} {$j <=$NumbSrc} {incr j} {set ftp($j) [$tcp_src($j) attach-source FTP]}for {set j 1} {$j <=$NumbSrc} {incr j} {$tcp_src($j) set packetSize_ 552}for {set i 1} {$i <=$NumbSrc} {incr i} {$ns at $startT($i) "$ftp($i) start"$ns at $Duration "$ftp($i) stop"}proc plotWindow {tcpSource file k} {global ns NumbSrcset time 0.03set now [$ns now]set cwnd [$tcpSource set cwnd_]if {$k==1} {puts -nonewline $file "$now \t $cwnd \t"} else {if {$k< $NumbSrc} {puts -nonewline $file "$cwnd \t"}}if {$k== $NumbSrc } {puts -nonewline $file "$cwnd \n"}$ns at [expr $now+$time] "plotWindow $tcpSource $file $k"} for {set j 1} {$j <= $NumbSrc} {incr j} {$ns at 0.1 "plotWindow $tcp_src($j) $windowVsTime $j"}set redq [[$ns link $n2 $n3] queue]set traceq [open red-queue.tr w]$redq trace curq_$redq trace ave_$redq attach $traceq$ns at [expr $Duration] "finish"$ns run$grep "a" red-queue.tr > ave.tr$grep "Q" red-queue.tr > cur.trgnplot > set title "current and average queue size" gnplot > set xlabel "time"gnplot > set ylabel "queue size"gnplot > plot ""。

网络模拟器NS2中仿真功能的问题分析及改进

网络模拟器NS2中仿真功能的问题分析及改进

第21卷第2期 系统 仿 真 学 报© V ol. 21 No. 22009年1月 Journal of System Simulation Jan., 2009网络模拟器NS2中仿真功能的问题分析及改进况晓辉1, 赵 刚1,2, 郭 勇1,3(1.北京系统工程研究所, 北京 100101; 2.清华大学计算机科学与技术系, 北京 100084; 3.国防科技大学信息系统与管理学院, 长沙 410073)摘 要:网络仿真技术为解决大规模网络规划、应用和协议设计面临的挑战提供了新的途径。

作为广泛应用的网络模拟器,NS2为建立可扩展的网络仿真环境奠定了重要基础。

在描述NS2仿真功能实现的基础上,重点分析了NS2仿真功能存在的不足。

针对发现的问题,提出并实现了NS2仿真功能扩展,最后验证了仿真功能扩展的正确性。

关键词:网络仿真;NS2;报文转换;功能扩展中图分类号:TP393 文献标识码:A 文章编号:1004-731X (2009) 02-0427-05Improvement of Emulation Function in Network SimulatorKUANG Xiao-hui 1, ZHAO Gang 1,2, GUO Yong 1,3(1. Beijing Institute of System and Engineering, Beijing 100101, China; 2. Department of Computer Science and Technology,Tsinghua University, Beijing 100084, China; 3. Department of Information System and Management of NUDT, Changsha 410073, China)Abstract: Network emulate technology which enables real hosts and a real network to interact with a virtual network, becomes a very important way to resolve the challenge faced in network plan, application and protocol design. As a famous network simulator, NS2 proposed a foundation to construct network emulate platform. The emulation function of NS2 was described firstly. Based on analysis the problem of emulation function in NS2, the extension of NS2 emulation function was proposed and implemented. The correctness of extension was dominated in the end. Key words: network emulation; NS2; packet reform; function extension引 言互联网的迅速发展与膨胀对网络的规划、应用和协议的设计提出了新的挑战。

网络模拟器NS-2及其应用分析

网络模拟器NS-2及其应用分析

定义了一个新分组头,要改动 NS 目录下 packet.h 文件的 enum packet_t{ }和 class p_in
fo{ }相应部分;改动 tcl/lib/ns-default.tcl 文件,定义 Tcl 对象的缺省值;改动 tcl/l ib/ns-packet.tcl 文件,在该文件中为新的分组增加一个入口;改动 Makefile 文件,将*. o 文件加入到该文件 NS 对象文件列表中。 (5) 此生成了新的 NS。 在 NS 目录下运行 Make Depend 和 Make,重新编译 NS,至
ph、gnuplot 得出有用的数据曲线,或者用 Nam 观看网络模拟运行过程。
2.2
C + + 建立新协议或修改已有网络对象进行扩展要考虑的问题
如果模拟只要求对现有的协议进行简单修改即可完成,无需建立新的协议代理,
则找到相应的待修改协议代码进行预期的修改,然后直接编译生成新的 NS。然而,当建立 新协议时一般需要考虑以下问题: (1) 并建立恰当的类定义。 (2) 连接函数。 (3) (4) 至少定义接收函数 recv( )和命令函数 command( )。 新协议代码完成后,要对相关文件进行改动。例如,如果 定义 C++代码和 Otcl 代码之间的接口连接,即定义 OTcl 首先定义头文件, 包括数据结构和决定新代理的继承结构,
#建立一条 TCP 连接 set tcp [new Agent/TCP] $tcp set class_ 2 $ns attach-agent $n0 $tcp set sink [new Agent/TCPSink] $ns attach-agent $n3 $sink $ns connect $tcp $sink #在 NAM 中,TCP 的连接以蓝色表示 $tcp set fid_ 1 #在 TCP 连接之上建立 FTP 应用 set ftp [new Application/FTP] $ftp attach-agent $tcp $ftp set type_ FTP #建立一条 UDP 连接 set udp [new Agent/UDP] $ns attach-agent $n1 $udp set null [new Agent/Null] $ns attach-agent $n3 $null $ns connect $udp $null #在 NAM 中,UDP 的连接以红色表示 $udp set fid_ 2 #在 UDP 连接之上建立 CBR 应用 set cbr [new Application/Traffic/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" #在 5.0 秒调用 finish 过程结束模拟 $ns at 5.0 "finish" #执行模拟 $ns run

仿真软件NS-2的分析

仿真软件NS-2的分析
层次 对 象 。
技 与
经 上 图 是作 者 在 运 用 N 2 具 时 采 取 的 分 析 步 骤 。在 使 用 济 S 工
兰 兰垒 !兰
至 旦
维普资讯
N -2时 一般有下面三个过程 : S 1 )建立网络模型 :描述整个 网络的拓扑结构 带宽 ,时延 等消息 ;
建立节点 . s 中 . 在N 一2 每个节点都可 以代表终端或者是路
由器 stn Ssnd ] stn Ssnd] e O[ o e e 1[n oe。 n
的 比如一些 比较底层的工作 :事 件的处理 ,封包的传送 等. 这需要较 高的处理速度 . 而且一旦 完成就很少修 改, 所 以c +是最佳 的选择j另外 ,我们在仿真的时候需要设置 + 不 同的网络 环境 、进而动态改变参数 ,这些选择 T L C 这种 直 白性的语言为佳 。同时 N 一 采用tl 来连接这两种语 s2 cc l 言之 间的变量。N -2 S 使用 MT I发展的 O c O j tT 1作 T I( be c) c 为描述 配置、执行仿真的 言 Oc; T l tl是 c 的物件导向 延伸版本。N 2 S 的组成结 构如 图 1 。
通过仿真 ,我们可 以从每
种可能的方案中筛选 出自己需要 的
并加 以改进 ,其次 仿真环境易于修 改。这 样 我们可 以人为 地 区性将某些特定的参 数和算法对仿真的影响降低 。
目前 有相 当多的网络仿真软件 ,最著 名的仿真软件 O N T PE
是美 国 MI 公 司 的 产 品 其 支 援 度十 分 广 泛 ,几 乎包 含 所 有 现 L 3 行 的 网络 标准 但 却 要 价 百 万 元 以 上 F ¥ 了其 在 研 究 领 域 的 E

网络仿真器NS2剖析NetworkSimulatorV2

网络仿真器NS2剖析NetworkSimulatorV2
实例化TclObject,与TclObject一一对应 ❖ TclCommand类:封装了C++代码和Tcl代码相互调
用命令的方法 ❖ EmbeddedTcl类:封装了装载更高级别的内置命令
的方法 ❖ InstVar类:访问C++成员变量,如Otcl变量方法
Tcl类
❖ 获得访问Tcl实例的入口 ❖ 通过解释器调用Otcl过程 ❖ 与解释器交换结果 ❖ 报告出错状况,并以统一方式退出 ❖ 存储、查找TclObject类对象 ❖ 取解释器的句柄
❖ 类TclClass是一个纯虚类,从它派生的 子类需实现两个成员函数:其一是构造 函数,构造解释类层次来镜像编译类层 次;其二是生成函数,生成与之相对应 的TclObjects对象 。
❖ 流程图
TclCommand类
❖ 类TclCommond的作用就在为解释器提供全 局命令
❖ 由TclCommand的定义知道,它是一个虚基 类,必须派生子类,才能工作。
tcpgen.tcl
Nam与Xgraph
❖ 图形显示工具 ❖ Nam <filename.out>:动态显示网络仿真过
程。如:包的传输等等 ❖ Xgraph <filename.tr>:显示仿真过程的数值
特征。如:流量/时间图等
四、NS2的使用
❖ 命令行方式:敲入一个命令,返回一个结果 输入命令: %/ns-version 返回版本号: ns /2.0a12
❖ Base classifier是一虚基类 ❖ address classifier:支持独播,通过位移和掩码将
包的目的地址转化成槽的号码。 ❖ multicast classifier:保持一个哈希链表,匹配地址

基于NS2的网络仿真

基于NS2的网络仿真

课设(三):基于NS2的网络仿真一、课程设计目的1、理解NS2的基本概念;2、熟悉安装NS2的实验环境和基本操作;3、仿真分析UDP通信协议;4、学会生成NS2的Tcl脚本及仿真结果分析;二、课程设计原理1、UDP协议(1)协议概述UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。

(2)协议功能描述UDP在IP数据报的头部仅仅加入了复用和数据校验(字段),UDP首部字段由4个部分组成,其中两个是可选的。

各16位的源端口和目的端口用来标记发送和接受的应用进程,因为UDP不需要应答,所以源端口是可选的,如果源端口不用,那么置为零。

在目的端口后面是长度固定的以字节为单位的长度字段,用来指定UDP数据报包括数据部分的长度。

由于缺乏可靠性,UDP应用一般必须允许一定量的丢包、出错和复制。

由于UDP协议缺乏拥塞避免和控制机制,需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。

UDP协议只在IP的数据报服务之上增加了很少的功能,这就是端口的功能(有了端口,运输层就能进行复用和分用)和差错检测的功能。

另外,UDP协议应用程序可以是客户机,也可以是服务器程序,不必向TCP协议应用程序那样必须分别建立客户机程序和服务器程序。

在远程控制软件中,如果在局域网内部传输屏幕信息,则使用UDP协议比较容易实现。

但UDP协议不提供可靠性,它的可靠性是交给其他网络设备来解决。

同时用UDP协议来传输的数据一般较小,它需要IP协议来为它对数据进行分段。

2、NS2概述NS2(Network Simulator version2,网络仿真软件第二版)是一种面向对象的网络仿真器,本质上是一个离散事件模拟器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 29 卷 第 18 期 Vol. 29 No. 18
计算机工程与设计
Computer Engineering and Design
2008 年 9 月 Sept. 2008
移动 Ad hoc 网络的 NS2 仿真机制及代码分析
石 硕, 顾学迈, 张文彬, 沙学军 (哈尔滨工业大学 通信技术研究所,黑龙江 哈尔滨 150001)
} class_reno; 从代码和图 2 可以看到,在 RenoTcpClass 的构造函数中, 将 OTCL 类名 Agent/TCP/Reno 做为参数传递给基类 TclClass 构造函数,确定 Agent/TCP/Reno 与 RenoTcpClass 的关联关系。 调用 create() 函数创建 RenoTcpAgent 对象,这样当 Agent/TCP/
Abstract:The working mechanism, main codes of simulation components libraries and the joint use of OTCL and C++ languages under split-object model of NS simulation for mobile ad hoc networks is analyzed, based on this, the interface of the multi-layers of the components library can be established. The key techniques of network layer, link layer and the physical one are emphasized, meanwhile, the implement of AODV codes and the MAC timer one is provided. The network simulation and protocol codes extension become easily by the help of such work. Key words:NS simulation; components libraries; split-object model; codes extension
NS 基于分裂对象模型,分裂对象模型包括 OTCL 和 C++ 类的映像创建机制、变量绑定以及 Command 函数 。 [10] 1.1.1 映 像 创 建 机 制
在分裂对象模型中,大多数 OTCL 类从 SplitObject 类继 承,C++类从 TclObject 继承。现以 RenoTcpAgent 类为例来介 绍 NS 的分裂对象模型及其映像创建机制。如图 1 所示,C++ 类 RenoTcpAgent 与 OTCL 类 Agent/TCP/Reno 互 为 映 像 , TcpAgent 和 Agent/TCP 也互为映像,OTCL 类 Agent 和 C++类 Agent 也是互为映像。这种映像确立机制是通过 TclObject 和 TclClass 两个类来完成的。其中 Tclobject 负责解释类的声明 和实现,而 TclClass 负责登记解释类和编译类的映像关系。
NS 网络仿真需要在不同的仿真参数下进行仿真,并需要 在 解 释 代 码 中 访 问 解 释 成 员 变 量 以 便 进 行 参 数 配 置 。然 而 如 果直接在构件库 C++代码中修改仿真参数,需要重新编译目 标代码。为此 NS 提供了一种变量绑定机制可以直接在 OTCL 脚 本 中 修 改 编 译 对 象 成 员 变 量 值 。变 量 的 绑 定 工 作 是 通 过 在 编译类的构造函数中利用 bind 命令进行变量的绑定。如下是 无线物理层的变量绑定代码:
收稿日期:2007-09-22 E-mail:ansenmzd@ 基金项目:国家自然科学基金项目 (60432040)。 作者简介:石硕 (1979-),男,博士研究生,研究方向为移动无线自组网关键技术; 顾学迈 (1957-),男,博士生导师,研究方向为卫星通 信、移动无线自组网; 张文彬 (1973-),男,讲师,研究方向为移动无线自组网; 沙学军 (1966-),男,博士生导师,研究方向为移动通信、 移动无线自组网。
图 1 RenoTcpAgent 继承及映像
当在仿真 脚本中创 建一个 Agent/TCP/Reno 解 释类对 象 时 ,其 映 像 对 象 产 生 过 程 如 下 :
(1) 首先调用 Agent/TCP/Reno 的初始化实例过程 init{}以 便完成对象的初始化并调用父类 init {} 过程。实际上 Agent/ TCP/Reno 没有定义自己的 init{}过程,调用的是其父类 Agent/ TCP 的 init{} 过程,并按照图 1 中的 OTCL 类结构继承关系陆 续调用父类 init{}过程。
static class RenoTcpClass: public TclClass { public: RenoTcpClass():TclClass("Agent/TCP/Reno") {}
TclObject* create(int, const char*const*) { return (new RenoTcpAgent()); }
- 4639 -
Otcl 类结构 SplitObject
Agent
C++类结构 TclObject Handler
NsObject
Agent
Agent/TCP Agent/TCP/Reno
TcpAgent RenoTcpAgent
Agent/TCP/Reno Otcl 对象
RenoTcpAgent C++ 对象
TclClass
关联
调用
Agent/TCP/Reno
RenoTcpClass
Create () ->RenoTcpAgent
图 2 映像关系的登记
Reno 解释类对象产生过程运行到基类 SplitObject 的 init {} 时 候,就运行与 Agent/TCP/Reno 关联的 RenoTcpClass 类的 cteate () 函数,并创建 C++编译对象 RenoTcpAgent,从而登记了解释 对象 Agent/TCP/Reno 与编译对象 RenoTcpAgent 的映像关系。 所有的影像关系都是通过 TclClass 这种登记功能完成的。 1.1.3 变 量 绑 定
Working mechanism and code analysis of NS2 simulation for mobile Ad hoc networks
SHI Shuo, GU Xue-mai, ZHANG Wen-bin, SHA Xue-jun (Communication Research Center, Harbin Institute of T2) 当最终执行到基类 SplitObject 的 init{}过程中时,createshadow () 过程被调用并按照 TclClass 类登记的映像关系调用 Agent/TCP/Reno 关联的 RenoTcpClass 类的 create()函数创建编 译对象 RenoTcpAgent。
(3) 当 C++编译对象 RenoTcpAgent 创建时,NS 调用该 C++ 对象的构造函数,并按照图 1 中的 C++类继承关系陆续调用 父 类 构 造 函 数 ,在 构 造 函 数 中 初 始 化 对 象 和 变 量 的 绑 定 。
WirelessPhy::WirelessPhy(): Phy(), ... {…
bind("CPThresh_", &CPThresh_); bind("CSThresh_", &CSThresh_); ... } 当映像对象创建过程运行到基类 SplitObject 时调用 createshadow()函数生成编译对象,然后按照 C++类继承关系依次调 用 父 类 构 造 函 数 ,并 在 子 类 和 父 类 构 造 函 数 中 完 成 所 有 变 量 的绑定。 1.1.4 Command()与 C++函 数 的 直 接和 间 接 调 用 OTCL 一般用于仿真配置和 OTCL 类和函数的的实现,但 是构件库的具体实现要用 C++语言编写。在 NS 仿真中,经常 需要解释类调用 C++映像对象的函数,如 OTCL 类 Agent/SRM/ Adaptive 对象调用其映像对象 SRMAgent 的函数 get_state() 计 算距离,OTCL 调用代码如下: $srmObject distance? (agentAddress) 其调用原理是 NS 按照其继承关系在解释类及其父类中 查找是否有如下名为 distance 的过程: Agent/SRM/Adaptive instproc distance? Addr { ... set distanceCache_($addr) [$self cmd distance? $addr] ... } 如果有,则由基类过程 cmd{} 调用 C++的 Command 函数 处理代码,反之则交由基类 SplitObject 的 unknown{}过程处理, unknown{} 也是通过调用 OTCL 的过程 cmd{},并在 cmd{} 过 程中利用命令:
(4) 当编译对象创建完毕,create-shadow()会将创建的对象 加入到 NS 解释器的哈希表中以便快速访问。Tcl 类全局函数 lookup() 可 以 快 速 查 找 各 对 象 指 针 。 1.1.2 TclClass 与 映 像 关 系 的登 记
相关文档
最新文档