仿真 是 “通过实践来学习” 的过程。每当世界上出现新事物时,我们总是先尝试通过观察来分析它,并在此过程中学到很多东西。这整个过程就被称为 仿真。
与此过程相关联,为了理解所有的复杂性,我们需要将整个角色扮演以计算机仿真的形式进行建模,这就需要构建人工对象并动态地给它们分配角色。
计算机仿真是在数字计算机上设计理论物理系统的过程,重点在于模型设计、执行和分析。在创建数学模型之后,最重要的一步是创建一个计算机程序,通过时间(通过时间片或事件调度)来更新状态和事件变量。如果这种仿真连续地在并行计算机上进行,则称为 并行 或 分布式仿真。
网络仿真(NS)是仿真的一种类型,用于模拟网络,例如 MANETs、VANETs 等。它为有线和无线网络的路由和组播协议提供仿真支持。NS 获得了 GNU(通用公共许可证)第 2 版的许可,通常被称为 NS2。它是一个面向对象的、离散事件驱动的仿真器,使用 C++ 和 Otcl/Tcl 编写。
NS-2 可用于实现网络协议(如 TCP 和 UDP)、流量源行为(如 FTP、Telnet、Web、CBR 和 VBR)、路由器队列管理机制(如 Drop Tail、RED 和 CBQ)、路由算法等等。在 ns2 中,C++ 用于详细的协议实现,而 Otcl 用于设置。编译后的 C++ 对象对 Otcl 解释器可见,通过这种方式,可以在 OTcl 层面控制现成的 C++ 对象。
使用以下命令安装 NS-2:
sudo apt-get install ns2
还需要安装 Nam。Nam(Network Animator)是一个动画工具,用于以图形方式表示网络和数据包跟踪。使用以下命令:
sudo apt-get install nam
一些基本的 Otcl 脚本语法:
基本命令:
Python
CODEBLOCK_54f5b23e
解释: 在第一行中,变量 a 被赋值为 8。在第二行中,命令 [expr $a/8] 的结果(等于 1)被用作另一个命令的参数,该命令随后将值赋给变量 b。 “$” 符号用于获取变量中包含的值,方括号表示命令替换。
使用 proc 命令定义新过程 :
Python
CODEBLOCK_5f9878af
打开文件进行读取:
Python
CODEBLOCK_ca4a8845
同样,put 命令用于将数据写入文件
Python
CODEBLOCK_ff7f7735
要在另一个进程内调用子进程,可以使用 exec,它会创建一个子进程并等待其完成。
Python
CODEBLOCK_ad7d1ab2
为了能够运行仿真场景,必须首先创建网络拓扑。在 ns2 中,拓扑由节点和链路的集合组成。
Python
CODEBLOCK_ea7820c4
仿真器对象具有成员函数,这些函数能够创建节点并定义节点之间的链路。Simulator 类包含所有基本功能。由于 ns 被定义为处理 Simulator 对象,因此命令 $ns 用于属于仿真器类的函数。
在网络拓扑中,可以通过以下方式添加节点:
Python
CODEBLOCK_4a3741d7
如果节点不是路由器,则必须设置流量代理(TCP、UDP 等)和流量源(FTP、CBR 等)。这使得我们可以创建使用 UDP 作为传输协议的 CBR 流量源,或使用 TCP 作为传输协议的 FTP 流量源。
使用 UDP 的 CBR 流量源:
Python
CODEBLOCK_5a4fae85
使用 TCP 的 FTP 流量源:
Python
CODEBLOCK_d5e8d9e5
下面是使用 FTP 和 TCP 在源和目的地之间创建链路的实现:
Python
“
目录
Create a simulator object
set ns [new Simulator]
Define different colors
for data flows (for NAM)
$ns color 1 Blue
$ns color 2 Red
Open the NAM trace file
set nf [open out.nam w]
$ns namtrace-all $nf
Define a ‘finish‘ procedure
proc finish {} {
global ns nf