📜  NS2 和 Otcl/tcl 脚本的基础知识

📅  最后修改于: 2021-10-20 10:18:48             🧑  作者: Mango

模拟是边做边学的过程。每当世界上出现新事物时,我们首先尝试通过检查来分析它,并在此过程中学习很多东西。这整个课程称为模拟

与此过程相关,为了理解以计算机模拟的形式对整个角色扮演进行建模所需的所有复杂性,需要构建人工对象并动态为其分配角色。

计算机仿真是在数字计算机上设计理论物理系统,重点是模型设计、执行和分析。创建数学模型后,最重要的步骤是创建一个计算机程序,用于随时间(通过时间切片或事件调度)更新状态和事件变量。如果这种模拟在并行计算机中连续进行,则称为并行分布式模拟

网络模拟(NS)是模拟的一种,用于模拟MANETs、VANETs等网络。它为有线和无线网络的路由和组播协议提供模拟。 NS 在 GNU(通用公共许可证)第 2 版下获得许可使用,通常称为NS2 。它是一个用 C++ 和 Otcl/tcl 编写的面向对象、离散事件驱动的模拟器。
NS-2 可用于实现 TCP 和 UPD 等网络协议,FTP、Telnet、Web、CBR 和 VBR 等流量源行为,Drop Tail、RED 和 CBQ 等路由器队列管理机制,路由算法等。在ns2中,C++用于详细的协议实现,Otcl用于设置。编译后的 C++ 对象可供 Otcl 解释器使用,这样,现成的 C++ 对象可以从 OTcl 级别进行控制。使用以下命令安装 NS-2:

sudo apt-get install ns2

Nam也需要安装。 Nam ( Network Animator ) 是一种动画工具,用于以图形方式表示网络和数据包跟踪。使用这个命令:

sudo apt-get install nam

一些基本的 Otcl 脚本语法:

  • 基本命令:
    set a 8
    set b [expr $a/8]
    

    说明:在第一行中,变量a被赋值为 8。在第二行中,命令 [expr $a/8] 的结果等于 1,然后用作另一个命令的参数,在turn 为变量b赋值。 “$”符号用于获取包含在变量中的值,方括号表示命令替换。

  • 使用proc命令定义新过程
    proc factorial fact {
      
        if {$fact <= 1} {
      
            return 1
        }
    expr $fact * [factorial [expr $fact-1]]
      
    }
    
  • 要打开文件进行阅读:
    set testfile [open hello.dat r]
    

    同理, put命令用于将数据写入文件

    set testfile [open hello.dat w]
      
    puts $testfile “hello1”
    
  • 要在另一个进程中调用子进程,请使用exec ,它会创建一个子进程并等待它完成。
    exec rm $testfile
    
  • 为了能够运行模拟场景,必须首先创建网络拓扑。在 ns2 中,拓扑由节点和链接的集合组成。
    set ns [new Simulator]
    
  • 模拟器对象具有成员函数,可以创建节点并定义它们之间的链接。类模拟器包含所有基本功能。由于 ns 被定义为处理 Simulator 对象,命令 $ns 用于使用属于模拟器类的函数。

    在网络拓扑中可以通过以下方式添加节点:

    set n0 [$ns node]
      
    set n1 [$ns node]
    
  • 如果节点不是路由器,则必须设置流量代理(TCP、UDP 等)和流量源(FTP、CBR 等)。它可以创建使用 UDP 作为传输协议的 CBR 流量源或使用 TCP 作为传输协议的 FTP 流量源。

    使用 UDP 的 CBR 流量来源:

    set udp0 [new Agent/UDP]
      
    $ns attach-agent $n0 $udp0
    set cbr0 [new Application/Traffic/CBR]
    $cbr0 attach-agent $udp0
    $cbr0 set packet_size_ 512
    

    使用 TCP 的 FTP 流量来源:

    set tcp0 [new Agent/TCP]
    $ns attach-agent $n0 $tcp0
    set ftp0 [new Application/FTP]
    $ftp0 attach-agent $tcp0
    $tcp0 set packet_size_ 512
    

下面是使用 ftp 和 tcp 在源和目标之间创建链接的实现:

# 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
    $ns flush-trace
      
    # Close the NAM trace file
    close $nf
      
    # Execute NAM on the trace file
    exec nam out.nam &
    exit 0
}
  
# Create four nodes
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
  
# Create links between the nodes
$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
  
# Set Queue Size of link (n2-n3) to 10
$ns queue-limit $n2 $n3 10
  
# Give node position (for 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
  
# Monitor the queue for link (n2-n3). (for NAM)
$ns duplex-link-op $n2 $n3 queuePos 0.5
  
  
# Setup a TCP connection
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
$tcp set fid_ 1
  
# Setup a FTP over TCP connection
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
  
  
# Setup a UDP connection
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
  
$ns attach-agent $n3 $null
$ns connect $udp $null
$udp set fid_ 2
  
# Setup a CBR over UDP connection
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
  
  
# Schedule events for the CBR and FTP agents
$ns at 0.1 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"
  
# Detach tcp and sink agents
# (not really necessary)
$ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink"
  
# Call the finish procedure after
# 5 seconds of simulation time
$ns at 5.0 "finish"
  
# Print CBR packet size and interval
puts "CBR packet size = [$cbr set packet_size_]"
puts "CBR interval = [$cbr set interval_]"
  
# Run the simulation
$ns run

输出 :