NS2仿真:两个移动节点网络连接及协议性能分析

时间:2022-07-21 15:57:31

NS2仿真实验报告2

实验名称:两个移动节点网络连接及协议性能分析

实验日期:2015年3月9日~2015年3月14日

实验报告日期:2015年3月15日

一、实验环境(网络平台,操作系统,网络拓扑图)

运行平台:虚拟机VMwareWorkstation11.0

操作系统:Linux/CentOS6.5仿真分析工具:NS2.35中的仿真软件ns,图形界面nam,编译工具awk,图表编辑器xgraph

网络拓扑图:

NS2仿真:两个移动节点网络连接及协议性能分析

二、  实验目的

使用NS仿真软件模拟简单移动节点的网络传输模型,掌握无线网络传输协议的特性,并分析在模型图中,使用不同的网络传输协议的性能。使用NS2仿真工具xgraph画出吞吐量、丢包率以及延时等三种反映网络性能的指标,并作进一步的分析。

三、  实验内容及步骤(包括主要配置流程,重要部分截图)

在实验1的基础上,通过学习静态网络传输的简单模型,进一步学习无线自组织网络,其中包括一些常见的无线网络传输协议DSDV(Destination Sequenced Distance Vector)目标序列距离路由矢量算法、AODV(Adhocon DemandDistance Vector Routing)Adhoc网络的距离矢量路由算法、DSR(Dynamic Source Routing)等。比较在该模型下,使用不同路由协议时,各网络传输连通的状况。根据图表总结归纳各网络协议的优缺点以及性能分析。

3.1编写一个tcl脚本一般分为以下几个步骤

1) 创建模拟器对象

用来定义和控制模拟过程。在这个过程中,首先创建一个simulator 对象。

# 创建新模拟器

set ns  [new Simulator]

2) 设置跟踪文件

# 跟踪文件和NAM文件创建

set tracefd  [open trace2.trw]

$ns   trace-all $tracefd

set namtrace [open sim12.nam w]

$ns   namtrace-all-wireless$namtrace $val(x)  $val(y)

# 吞吐量跟踪文件建立(用于最后分析)

set f0 [open out02.tr w]

set f1 [open out12.tr w]

set f2 [open out22.tr w]

set f3 [open out32.tr w]

set f4 [open out42.tr w]

# 丢包率跟踪文件建立(用于最后分析)

set f5 [open lost02.tr w]

set f6 [open lost12.tr w]

set f7 [open lost22.tr w]

set f8 [open lost32.tr w]

set f9 [open lost42.tr w]

# 传输延时跟踪文件建立(用于最后分析)

set f10 [open delay02.tr w]

set f11 [open delay12.tr w]

set f12 [open delay22.tr w]

set f13 [open delay32.tr w]

set f14 [open delay42.tr w]

3) 创建网络拓扑结构。

set topo [new Topography]

# 场景范围设置

$topo load_flatgrid $val(x) $val(y)

#定义属性值(无线网络环境的固定模式)

set val(chan) Channel/WirelessChannel    ;#信道类型

set val(prop) Propagation/TwoRayGround  ;#无线传输类型

set val(netif) Phy/WirelessPhy                   ;#网络接口类型

set val(mac) Mac/802_11                          ;# MAC类型

set val(ifq) Queue/DropTail/PriQueue      ;#接口队列类型

set val(ll) LL                                                        ;#链路层类型

set val(ant) Antenna/OmniAntenna          ;#天线模式

set val(ifqlen) 50                                         ;#包的最大缓存数

set val(nn) 10                                               ;#移动节点个数

set val(rp) AODV                                        ;# 路由协议(实验2的关键因素,与AODV替换)

set val(x) 400                                             ;# 定义场景中X轴最大值

set val(y) 400                                             ;# 定义场景中Y轴最大值

Mac/802_11 set RTSThreshold_ 3000

Mac/802_11 set basicRate_ 1Mb

Mac/802_11 set dataRate_ 2Mb

4) 配置节点属性

# 对本次实验中将出现的无线节点的属性进行详细设置

$ns node-config-adhocRouting $val(rp) \

-llType $val(ll) \

-macType $val(mac) \

-ifqType $val(ifq) \

-ifqLen $val(ifqlen) \

-antType $val(ant) \

-propType $val(prop) \

-phyType $val(netif) \

-channelType $val(chan) \

-topoInstance $topo \

-agentTrace ON \

-routerTrace ON \

-macTrace OFF \

-movementTrace ON

for {set i 0} {$i <$val(nn) } {incr i} {

set node_($i)[$ns node]

$node_($i)random-motion 0         ;# disable randommotion无法随机游动

}

5) 创建拓扑结构

# 初始化节点位置

$node_(0) set X_ 50.0

$node_(0) set Y_ 50.0

$node_(0) set Z_ 0.0

$node_(1) set X_ 350.0

$node_(1) set Y_ 350.0

$node_(1) set Z_ 0.0

$node_(2) set X_ 110.0

$node_(2) set Y_ 210.0

$node_(2) set Z_ 0.0

$node_(3) set X_ 210.0

$node_(3) set Y_ 310.0

$node_(3) set Z_ 0.0

$node_(4) set X_ 310.0

$node_(4) set Y_ 210.0

$node_(4) set Z_ 0.0

$node_(5) set X_ 210.0

$node_(5) set Y_ 110.0

$node_(5) set Z_ 0.0

$node_(6) set X_ 310.0

$node_(6) set Y_ 110.0

$node_(6) set Z_ 0.0

$node_(7) set X_ 110.0

$node_(7) set Y_ 110.0

$node_(7) set Z_ 0.0

$node_(8) set X_ 110.0

$node_(8) set Y_ 310.0

$node_(8) set Z_ 0.0

$node_(9) set X_ 310.0

$node_(9) set Y_ 310.0

$node_(9) set Z_ 0.0

# 定义节点大小用于在nam中查看

for {set i 0} {$i < $val(nn)} {incr i} {

$ns initial_node_pos$node_($i) 20

}

#节点的运动路径

$ns at 10.0 "$node_(0) setdest 50.0 350.0 30.0"

$ns at 20.0 "$node_(0) setdest 350.0 350.0 30.0"

$ns at 30.0 "$node_(0) setdest 350.0 50.0 30.0"

$ns at 40.0 "$node_(0) setdest 50.0 50.0 30.0"

$ns at 10.0 "$node_(1) setdest 350.0 50.0 60.0"

$ns at 15.0 "$node_(1) setdest 50.0 50.0 60.0"

$ns at 20.0 "$node_(1) setdest 50.0 350.0 60.0"

$ns at 25.0 "$node_(1) setdest 350.0 350.0 60.0"

$ns at 30.0 "$node_(1) setdest 350.0 50.0 60.0"

$ns at 35.0 "$node_(1) setdest 50.0 50.0 60.0"

$ns at 40.0 "$node_(1) setdest 50.0 350.0 60.0"

$ns at 45.0 "$node_(1) setdest 350.0 350.0 60.0"

6) 设置代理和应用层协议并进行绑定

set agent1 [new Agent/UDP]   ;# 创建UDP代理

$agent1 set prio_ 0

# 创建Loss Monitor Sink检验丢失分组

set sink [new Agent/LossMonitor]

$ns  attach-agent $node_(0)$agent1 ; #发射代理与节点连接(以下几个意义相同)

$ns   attach-agent $node_(1)$sink ; # 接收代理与节点连接(以下几个意义相同)

$ns  connect $agent1$sink

#两节点相连(以下几个意义相同)

set app1 [new Application/Traffic/CBR]; # 创建流量发射器(以下几个意义相同)

$app1 set packetSize_ 512  ;# 定义包大小(以下几个意义相同)

$app1 set rate_ 600Kb  ;# 定义发射频率(以下几个意义相同)

$app1 attach-agent $agent1; # 连接流量发射器和代理(以下几个意义相同)

$ns  at  10.0 "$app1 start"

set agent2 [new Agent/UDP]

$agent2 set prio_ 1

set sink2 [new Agent/LossMonitor]

$ns  attach-agent $node_(7)$agent2

$ns  attach-agent $node_(2)$sink2

$ns  connect $agent2$sink2

set agent3 [new Agent/UDP]

$agent3 set fid_ 3

$agent3 set prio_ 2

set sink3 [new Agent/LossMonitor]

$ns  attach-agent $node_(8)$agent3

$ns  attach-agent $node_(3)$sink3

$ns  connect $agent3$sink3

set agent4 [new Agent/UDP]

$agent4 set prio_ 3

set sink4 [new Agent/LossMonitor]

$ns attach-agent $node_(9) $agent4

$ns  attach-agent $node_(4)$sink4

$ns  connect $agent4$sink4

set agent5 [new Agent/UDP]

$agent5 set prio_ 4

set sink5 [new Agent/LossMonitor]

$ns  attach-agent $node_(6)$agent5

$ns  attach-agent $node_(5)$sink5

$ns  connect $agent5 $sink5

7) 使用模拟器对象的at过程设置节点事件和时间的对应关系。

$ns at 0.0"record"

$ns at 0.0  "$app1 start"

$ns at 60.0"stop"

# 在60.0秒的时候重置节点

for {set i 0}{$i < $val(nn) } {incr i} {

$ns  at 60.0 "$node_($i) reset";

}

# 在60.0秒的时候停止

$ns  at 60.0 "puts \"NSEXITING...\" ; $ns halt"

8) 记录实验数据

# 创建record函数来记录数据

proc record {}{

global sink sink2 sink3 sink4 sink5 f0 f1 f2f3 f4 f5 f6 f7 f8 f9 holdtime holdseq holdtime1 holdseq1 holdtime2 holdseq2holdtime3 holdtime4 holdseq3 holdseq4 f10 f11 f12 f13 f14 holdrate1 holdrate2holdrate3 holdrate4 holdrate5

set ns [Simulator instance]

set time 0.9 ;# 设置采样时间

set bw0 [$sink set bytes_]

set bw1 [$sink2 set bytes_]

set bw2 [$sink3 set bytes_]

set bw3 [$sink4 set bytes_]

set bw4 [$sink5 set bytes_]

set bw5 [$sink set nlost_]

set bw6 [$sink2 set nlost_]

set bw7 [$sink3 set nlost_]

set bw8 [$sink4 set nlost_]

set bw9 [$sink5 set nlost_]

set bw10 [$sink set lastPktTime_]

set bw11 [$sink set npkts_]

set bw12 [$sink2 set lastPktTime_]

set bw13 [$sink2 set npkts_]

set bw14 [$sink3 set lastPktTime_]

set bw15 [$sink3 set npkts_]

set bw16 [$sink4 set lastPktTime_]

set bw17 [$sink4 set npkts_]

set bw18 [$sink5 set lastPktTime_]

set bw19 [$sink5 set npkts_]

set now [$ns now]

# 计算吞吐量并写入out02.tr、out12.tr、out22.tr、out32.tr文件

puts $f0"$now [expr (($bw0+$holdrate1)*8)/(2*$time*1000000)]"

puts $f1"$now [expr (($bw1+$holdrate2)*8)/(2*$time*1000000)]"

puts $f2"$now [expr (($bw2+$holdrate3)*8)/(2*$time*1000000)]"

puts $f3"$now [expr (($bw3+$holdrate4)*8)/(2*$time*1000000)]"

puts $f4"$now [expr (($bw3+$holdrate5)*8)/(2*$time*1000000)]"

# 计算丢包率并写入lost02.tr、lost12.tr、lost22.tr、lost32.tr

puts $f5"$now [expr $bw5/$time]"

puts $f6"$now [expr $bw6/$time]"

puts $f7"$now [expr $bw7/$time]"

puts $f8"$now [expr $bw8/$time]"

puts $f9"$now [expr $bw9/$time]"

# 计算延时并写入delay02.tr、delay12.tr、delay22.tr、delay32.tr

if { $bw11 >$holdseq } {

puts $f10 "$now [expr ($bw10 -$holdtime)/($bw11 - $holdseq)]"

} else {

puts $f10 "$now [expr ($bw11 -$holdseq)]"

}

if { $bw13 >$holdseq1 } {

puts $f11 "$now [expr ($bw12 -$holdtime1)/($bw13 - $holdseq1)]"

} else {

puts $f11 "$now [expr($bw13 - $holdseq1)]"

}

if { $bw15 >$holdseq2 } {

puts $f12 "$now [expr($bw14 - $holdtime2)/($bw15 - $holdseq2)]"

} else {

puts $f12 "$now [expr ($bw15 -$holdseq2)]"

}

if { $bw17 >$holdseq3 } {

puts $f13 "$now [expr($bw16 - $holdtime3)/($bw17 - $holdseq3)]"

} else {

puts $f13 "$now [expr($bw17 - $holdseq3)]"

}

if { $bw19 >$holdseq4 } {

puts $f14 "$now [expr($bw18 - $holdtime4)/($bw19 - $holdseq4)]"

} else {

puts $f14 "$now [expr($bw19 - $holdseq4)]"

}

9) 使用模拟器对象的run过程开始模拟

proc stop {} {

global ns  tracefd f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11f12 f13 f14

#关闭trace文件,停止记录

close $f0

close $f1

close $f2

close $f4

close $f5

close $f6

close $f7

close $f8

close $f9

close $f10

close $f11

close $f12

close $f13

close $f14

# 用 xgraph 把吞吐量,丢包率,和延时显示在图像上

exec xgraph out02.tr out12.trout22.tr  -geometry 800x400 &

exec xgraph lost02.tr lost12.trlost22.tr lost32.tr -geometry 800x400 &

exec xgraph delay02.tr delay12.trdelay22.tr delay32.tr -geometry 800x400 &

exec nam sim12.nam

# 重置Trace文件

$ns flush-trace

close $tracefd

exit 0

}

puts"Starting Simulation..."

$ns run

10) 结果分析

模拟结束后,将得到保存模拟过程的traced文件,接下来的主要工作就是对于这个结果文件根据需求进行数据分析,同时可以用xgraph等画图工具直观的显示数据分析结果。

四、  实验结果(包括最终实验结果,重要部分截图)

4.1移动模型节点切换分析

仿真开始时间为0.0s,此时执行代码$ns at0.0  "$app1 start",节点0和1之间通过中间的8个基站,寻找最佳的传输路径。其中节点0和1配置为sink节点,中间的基站为代理节点。节点0作为发射器,节点1作为接收器。

在第10s时,此时节点0和1通过节点2传输数据。节点0和1开始向着同一个方向前行,节点1的速度是节点0的两倍,也就意味着在节点1跑一圈的时候节点0与节点1相遇。(0->2->9->1)

第14.2s时,由于网络负载或者一些其他的原因导致节点0和1之间数据传输中断,节点0开始丢失数据,此时的数据记录文件开始记录丢失的数据,在切换到其他基站转发节点时,记录延时文件开始记录数据。

第15.8s时,由于节点的运动,出现远离最初连接的基站节点,距离远到数据无法继续传输时,此时节点0发送的信息几乎全部丢失,于是所有节点重新开始匹配新的路由信息。

第16.2s时,节点经过再次的匹配,连接到新的基站节点3和节点4上,数据传输开通。(0->3->4>1)

19s时节点1远离节点4,出现严重的数据丢失后,切换到节点7节点通路为:0->7->1,可以看出,在节点比较少的情况下,AODV协议是的节点之间始终保持在最佳连通状况。

第24.6s时,节点0和1在出现中断后,由于两个节点之间的距离在可以通信的范围之内,节点0和1直接通信,无需其他中转节点。这样的连通将持续保持到节点1超越节点0,并逐渐远离节点0的过程中,直到通信距离过远,不得已断开为止。

第30.4s节点1开始超越节点0,此时节点0和1继续保持通信。

第39.2s时,节点1远离节点0,由于距离过远,发生中断,并重新通过匹配,借助于其他节点保持连接。

正如这样的通信方法将一直保持到50.0s,即在第50s时,节点0和1各自回到原始的位置,通信路线为:0->5->3->1

4.2吞吐量、丢包率以及延时的分析

如下图所示,节点0和节点1之间数据传输,节点1的吞吐量保持相对稳定的增长。

如下图所示,节点0和节点1之间数据传输,节点1的丢包在15s左右出现严重的缺失,这是因为15s时,节点0和1由于通信距离不在两者在范围之内,重新进行切换到新的基站节点中去。

节点0和1在仿真开始时处于未接通状态,所以首先要经过各节点进行协商,设置出转接通信的节点,此时由上述的实验步骤可以看出,首先设置节点2和9为基站节点,负责转发节点0发出的信息。

五、试验中的问题及心得

5.1一些出现最多的问题

问题1

Problems foundwith input data.

Problems foundwith input data.

Problems foundwith input data.

记录实验数据的文件没有设置开始记录的相关命令,应考虑加上如下的代码:

# 定时发包开始及结束

$ns at 0.0"record"

问题2

ns: puts"NS EXITING..."  _o3 halt:wrong # args: should be "puts ?-nonewline? ?channelId? string"

while executing

"puts"NS EXITING..."  _o3 halt"

考虑结束控制命令$ns  at 60.0 "puts \"NSEXITING...\"  $ns halt",中是否缺少分号”;”,即$ns  at 60.0 "puts \"NSEXITING...\" ; $ns halt"。

还要考虑数据传输开始和结束的控制命令,也有可能引起这样的错误。

六、实验思考

本次实验主要是通过学习移动节点在实际中是如何,通过不同的协议,比如在本实验中采用的是AODV路由协议,这时,通信节点之间自动的按照协议所规定的方法在仿真场景中进行连接。在上述实验中不宜使用DSDV协议,因为DSDV路由协议所有的节点都必须被告知路由信息,节点将长时间处于寻找路由的过程中,而不是进行通信。因此DSDV协议适用于节点稀疏时,易于实现的模型当中。

而AODV路由协议不同于表驱动路由协议,是一种特殊的按需距离矢量的反应式路由协议,每个节点中记录自己可达的节点,一旦出现某个节点不可达,则自动删除该记录,修复链路的连通性。大多数时间保持在一种可通信的状态。这种协议适用于节点密度比较大的情况,节和节点之间几乎是可实时通信的情况。