NS2网络仿真

  • NS2安装与配置
  • TCP/UDP比较仿真
  • 静态/动态路由仿真

1.安装与配置
1.1更新系统

  • sudo apt-get update #更新源列表
  • sudo apt-get upgrade #更新已经安装的包
  • sudo apt-get dist-upgrade #更新软件,升级系统

1.2安装ns2需要的几个包

  • sudo apt-get install build-essential
  • sudo apt-get install tcl8.5 tcl8.5-dev tk8.5 tk8.5-dev #for tcl and tk
  • sudo apt-get install libxmu-dev libxmu-headers #for nam

1.3下载安装包
官网下载地址(http://www.isi.edu/nsnam/ns/nsbuild.html#allinone)
下载allinone,将下载得到的压缩包放到自己指定的位置即可。

1.4解压安装包,并进行安装

  • tar xvfz ns-allinone-2.35.tar.gz
  • cd ns-allinone-2.35
  • sudo ./install #进行安装

第一次安装报错:
linkstate/ls.h:137:20: note: use ‘this->erase’ instead
make: * [linkstate/ls.o] Error 1
Ns make failed!

修改ls文件:ns-2.35/linkstate/ls.h
第137行
void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
改为:void eraseAll() { this->erase(baseMap::begin(), baseMap::end()); }
保存后

  • sudo ./install #重新安装顺利完成

1.5配置环境变量

  • gedit ~/.bashrc

(不是空白文件)
在文件末尾添加

# add path for ns2
export PATH=”$PATH:/home/安装文件夹名/ns-allinone-2.35/bin:/home/安装文件夹名/ns-allinone-2.35/tcl8.5.10/unix:/home/安装文件夹名/ns-allinone-2.35/tk8.5.10/unix”
export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:/home/安装文件夹名/ns-allinone-2.35/otcl-1.14:/home/安装文件夹名/ns-allinone-2.35/lib”
export TCL_LIBRARY=”$TCL_LIBRARY:/home/安装文件夹名/ns-allinone-2.35/tcl8.5.10/library”

1.6验证ns2安装

关闭终端,重启终端,输入ns,出现%,说明ns2安装成功。
注意:环境变量配错的话,会提示
程序“ns”尚未安装。 您可以使用以下命令安装:
sudo apt-get install ns2”
请勿通过该命令安装,还是回到1.5修改环境变量吧!

1.7安装nam

进入nam目录:

  • cd ns-allinone-2.35/nam-1.15

进入后

  • sudo ./configure

,然后

  • sudo make

注意,此处会出错

提示为“installation of tcl seems incomplete or can’t be found automatically”忘记截图了

解决方法
sudo ./configure –with-tcl=/home/用户目录/文件存放目录/ns-allinone-2.35/tcl8.5.10 –with-tcl-ver=8.5.10 –with-tk=/home/用户目录/文件存放目录/ns-allinone-2.35/tk8.5.10 –with-tk-ver=8.5.10
最后

  • sudo make install

命令行输入nam弹出nam console说明nam安装成功。

这里写图片描述

注意:如果通过“sudo apt-get install nam”安装的nam,执行nam命令会报异常 “段错误,核心文件已转储”
遇到该问题的可以“sudo apt-get remove –purge nam”卸载nam及其配置后按1.7进行安装。

1.8测试simple.tcl

  • cd ns-allinone-2.35/ns-2.35/tcl/ex/
  • ns simple.tcl

显示下图则全部安装成功!
这里写图片描述

上述安装过程参考博客:
Ubuntu 16.04 安装ns2.35+nam

2.TCP/UDP比较

2.1网络结构图

这里写图片描述

2.2实验解释

① 网络环境包含两个传输节点s1,s2,路由器r和数据接收端d;
② S1到r之间与s2到r之间的网络频宽都是2Mbps,传递延迟时间都是10ms。网络结构的频宽瓶颈是在r到d之间,频宽为1.7Mbps,传递延迟为20ms。
③ 所有链路的管理机制都是DropTail,且r到d之间的最大队列长度是10个封包的长度;
④ 在s1与d之间会有一条FTP的联机,FTP应用程序构建在TCP纸上,所以必须先建立一条FTP的联机,因此在s1上使用TCP agent产生“tcp”来发送TCP的封包;在目的地d使用TCPsink Agent产生“sink”来接收TCP的数据,并产生回复封包(ACK)返回发送端;
⑤ 在s2与d之间有一条固定的传输速率的联机,CBR应用程序的结构在UDP之上,为此必须在s2使用UDP agent来产生,“udp”来发送UDP封包,在d上用Null Agent 来产生“sink”,以接收由s2传送过来的UDP封包。
⑥ CBR是在0.1s开始发送,4.5s结束传输;FTP是在1.0s开始发送,4.0s结束传输。

2.3源代码分析

#产生一个仿真对象
set ns [new Simulator]

#定义两种颜色,一种模拟TCP,一种模拟UDP
$ns color 1 Blue
$ns color 2 Red

#nam文件
set nf [open tcp_udp.nam w]
$ns namtrace-all $nf

#追踪文件(日志)
set nd [open tcp_udp.tr w]
$ns trace-all $nd

#定义结束程序
proc finish {} {
        global ns nf nd
        $ns flush-trace
        close $nf
        close $nd 
        exec nam out.nam &
        exit 0
}

#建立源节点
set s1 [$ns node]
set s2 [$ns node]

#路由器
set r [$ns node]
#目的节点
set d [$ns node]

#建立链路,droptail的队列管理方式
$ns duplex-link $s1 $r 2Mb 10ms DropTail
$ns duplex-link $s2 $r 2Mb 10ms DropTail
$ns duplex-link $r $d 1.7Mb 20ms DropTail

#设置r到d之间Queue Limit为10个封包大小
$ns queue-limit $r $d 10

#建立nam中的位置关系
$ns duplex-link-op $s1 $r orient right-down
$ns duplex-link-op $s2 $r orient right-up
$ns duplex-link-op $r $d orient right

# 观测r到d之间queue的变化
$ns duplex-link-op $r $d queuePos 0.5

#建立一条TCP的联机
set tcp [new Agent/TCP]
$ns attach-agent $s1 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $d $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 $s2 $udp
set null [new Agent/Null]
$ns attach-agent $d $null
$ns connect $udp $null

#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

#设置开始结束时间
$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 $s1 $tcp ; $ns detach-agent $d $sink"
#结束模拟
$ns at 5.0 "finish"
#执行模拟
$ns run

2.4执行结果

这里写图片描述

3.静态/动态路由(动态路由使用距离矢量路由算法)

3.1网络拓扑
这里写图片描述

3.2实验分析

该试验主要观察当链路状态发生变化时,使用静态路由和动态路由的差异性。
① 结点n0会使用FTP将数据传送给n4,传送时间为0.1~3.0s;
② 在1.0s时,链路n1到n3发生问题,数据无法从n1到n3之间的链路传送;
③ 在2.0s时,链路n1到n3问题解决,数据又可以从此链路传送。

3.3源代码分析

#产生一个仿真对象
set ns [new Simulator]

#若是使用者有指定使用距离矢量(distance vector)算法的动态路由方式
#则设定路由的方式为DV
if {$argc==1} {
    set par [lindex $argv 0]
    if {$par=="DV"} {
        $ns rtproto DV
    }
}

#以藍色表示所传送的封包
$ns color 1 Blue

#nam文件
set file1 [open out.nam w]
$ns namtrace-all $file1

#結束程序
proc finish {} {
        global ns file1
        $ns flush-trace
        close $file1
        exec nam routing.nam &
        exit 0
}

#创建五个结点
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]

#设置链路
$ns duplex-link $n0 $n1 0.5Mb 10ms DropTail
$ns duplex-link $n1 $n2 0.5Mb 10ms DropTail
$ns duplex-link $n1 $n3 0.5Mb 10ms DropTail
$ns duplex-link $n3 $n4 0.5Mb 10ms DropTail
$ns duplex-link $n3 $n2 0.5Mb 10ms DropTail

#设定在nam中的位置关系
$ns duplex-link-op $n0 $n1 orient right
$ns duplex-link-op $n1 $n2 orient right
$ns duplex-link-op $n1 $n3 orient down
$ns duplex-link-op $n3 $n4 orient right
$ns duplex-link-op $n3 $n2 orient right-up

#建立TCP联机
set tcp [new Agent/TCP]
$tcp set fid_ 1
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n4 $sink
$ns connect $tcp $sink

#建立FTP联机
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP

#设定在1.0秒時,n1到n3间的链路出现问题
$ns rtmodel-at 1.0 down $n1 $n3

#设定在2.0秒時,n1到n3間的链路又恢复正常
$ns rtmodel-at 2.0 up $n1 $n3

#在0.1秒時,FTP开始传送数据
$ns at 0.1 "$ftp start"

#在3.0秒時,结束传送数据
$ns at 3.0 "finish"

#模拟开始
$ns run

3.4实验结果

静态路由:
这里写图片描述

这里写图片描述

DV动态路由

这里写图片描述

这里写图片描述

参考书籍:

NS2仿真实验-多媒体和无线网络通信 柯志亨

猜你喜欢

转载自blog.csdn.net/deep_kang/article/details/73348348