柯志恒的NS2仿真实验十八所作的是无线网络封包传输遗失模型的实验。
1、目标
(1)介绍无线网络丢包模型 (2)了解群体广播(multicast)与单点传播(Unicast)的传输模式对于丢包率的影响 2、基础知识 (1)无线网络丢包模型 一般来说,当数据包在无线网络上传输时,会发生丢包的原因大致有两个: a、拥塞遗失(Congestion Loss),发生原因主要是当网络上的数据传输量过大,导致网络设备传送处理时不及时,使得设备中的队列(Queue)缓冲空间不足,而必须将部分的数据包丢弃。 b、无线遗失(Wireless Loss),发生的主要原因是无线网络的传输信道(Channel)本身受到外界的影响而造成信号衰减或干扰,由于这些影响因子都是和无线传输相关,故称之为无线遗失。 对于无线遗失而言,可根据其数据遗失的分布现象而分成两种类型: a、分布式遗失(Distributed Loss),即数据包遗失的分布情形相当分散且平均 b、连续性遗失(Burst Loss),即发生遗失的现象都是以连续性的居多,即一发生遗失就连续丢失好几个数据包。 以论文研究来说,通常会使用数学模型来描述网络行为,在此当中,随机统一模型(Random Uniform Model) 经常被用来作为分布式遗失的模型,而Gilbert-Elliott模型(GE model)则被用来作为连续性遗失的模型。 a、随机统一模型,因为数据是以随机分散的方式遗失,所以用到的是:平均遗失率(p),这个代表数据在传输过程中的平均遗失率。 b、GE模型,当传输通道(Channel)处于“好(Good)”的状态(G),发生封包遗失的概率为PG,当传输通道处于“坏(Bad)”的状态(B),发生封包遗失的概率是PB;PGB代表传输通道的状态从好的变成坏的概率,而PBG则正好相反。在稳态(Steady State)的情形下,传输通道处于Good和Bad的状态B的概率分别为 πG=PBG/(PBG+PGB),πB=PGB/(PBG+PGB) 因此,对于GE模型而言,整体的平均封包遗失率为: (2)无线网络的传输模式:Multicast与Unicast 在无线网络中,不同的传输模式之下,对于丢包的处理方式不同,继而造成不同的丢包率。当数据包是通过群体广播(multicast)的方式传送,如果数据包在传送中丢失,则发送端并不会重新传送该数据包,而是直接传送下一个数据包。在这种情况之下,网络用户所感受到的传送遗失概率(Application-level Packet Loss Rate)将会和网络底层(Physical-level Packet Loss Rate)相同(p)。另一方面,如果数据包的传送方式是单点传播(Unicast),则网络用户所感受到的传送遗失概率将会和底层的不同;因为在此传送方式之下,发送端会利用重传机制(Retransmission)来进行遗失数据包回复的动作,直到确定该数据包已被接收端所接收。然而,为了避免一直重传遗失数据包而造成严重的端到端时延(End-to-End Delay),必须设置数据包最大传送次数(Maximum Transmission Time)。当同一个数据包被传送的次数达到该最大值时,传送端即会将此数据包舍弃不传,以避免造成后续数据包的严重延迟现象。也就是因为有了重传机制,使得传送遗失概率可以降低。假设每个数据包最大传送次数是N,且MAC层的传送遗失概率为p,则数据包被接收端所正确接收到的概率为: Pcorrect=从i=1到N求和[(1-p)p.^(i-1)]=1-p.^(N)= ∑i=1[(1-p)×p~(i-1)] = 1-p~n 相对的,接收端 的应用层所感受到的传送遗失概率将会是 Peffective = p~n (3)NS2中无线遗失模型 在原本的NS2无线网络结构中,数据包从传送端送出,若是没有发生碰撞且接收端在接收信号允许的范围内,则接收端一定可以成功地收到数据包。在此假设下,是没有考虑传输过程数据包发生错误的情形,所以柯志亨在书中注明其修改了mac目录下的wireless-phy.cc,增加了随机统一模型与连续性遗失模型,用来仿真数据包从传送端到接收端的传送过程中可能发生错误的情况。柯志亨在此处特别提醒大家——由于所增加的传输遗失模型只有在接收端作用,所以若是双向传输(TCP),在传送端也要加上无线遗失模型。 柯志亨设计的无线遗失模型提供了一组:PGG, PBB, PG, PB, LOSS_MODEL.可在tcl脚本中设置想要的丢包率。设置如下: a、随机统一模型 丢包率=PG 其他设为零 b、GE模型 LOSS_MODEL=1,PGG=1-PGB, PBB=1-PBG
书上讲到这里便没有给出具体的实现步骤,而是直接进行实验。现在将具体实验步骤补充如下:
首先,先去柯志恒老师的网站上面下载wireless error model的必要文件,网址是:http://140.116.72.80/~smallko/ns2/wireless_error_m odel.rar
打开这个压缩文件会发现里面有很多小文件,当然还有一个安装步骤,里面乱码,我看的比较模糊。OK,首先是需要安装一个NOAH的路由。NOAH 路由是相对于DSR、AODV等路由的另一种路由方式,仅仅支持无线节点到基站的直接通信。正是实验中需要的路由形式。因此,我们首先需要把这个路由文件make到ns2中。具体步骤和部分文件可以在如下网站上找到:file:///C:/cygwin/home/Administrator/wireless_error_model/如何安裝和測試_柯志亨/NO%20Ad-Hoc%20Routing%20Agent%20(NOAH).htm
接着讲wireless-phy.h,wireless-phy.cc forwarder.h,forwarder.cc放入~/mac中。把ns-mobilenode.tcl放入~/tcl/lib中,覆盖即可。
在Makefile.in中加入mac/forwarder.o \
最后./configure
make
顺利安装后,可以运行柯志亨老师文件中自带的wireless_error.tcl
后续:::
在具体实验中,出现很多问题,首先,我一次性将NOAH和后来的wireless-phy.h等文件一起加入Ns2.29中,运行书上的脚本后出现问题。我是初学所以无法解决这些问题。
然后我开始尝试,首先添加NOAH路由协议。在make的过程中出现:
making in directory ucb
make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/ucb'make[1]:'Nothing to be done for 'all'.make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep-utils/webtrace-conv/ucb'make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep-utils/webtrace-conv/dec'make[1]:'Nothing to be done for 'all'. make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep-utils/webtrace-conv/dec'make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/epa' make[1]:'Nothing to be done for 'all'. make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/epa' make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/nlanr'make[1]:'Nothing to be done for 'all'. stop. make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/nlanr'解决的方法是,我进入webtrace-conv这个文件夹中,把MAKEFILE文件中的all这一行注销掉了。
重新./configure make clean make
最后出现:
making in directory ucb
make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/ucb'make[1]:'Nothing to be done for 'all'.make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep-utils/webtrace-conv/ucb'make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep-utils/webtrace-conv/dec'make[1]:'Nothing to be done for 'all'. make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep-utils/webtrace-conv/dec'make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/epa' make[1]:'Nothing to be done for 'all'. make[1]eaving directory 'home/Administratora/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/epa' make[1]:Entering directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/nlanr'make[1]:'Nothing to be done for 'all'. make[1]eaving directory 'home/Administrator/ns-allinone-2.29/ns-2.29/indep- utils/webtrace-conv/nlanr'可以看出stop没有了,看到网上有人说这个make算是通过编译了。最后,运行测试NOAH的tcl脚本,这个脚本是修改柯志亨老师的实验18的脚本得到的:
set ns_ [new Simulator]
#若模拟环境为单纯的有线或无线网络,用flat寻址方法,如果既有无线又有有线环境,用hierarchical方式寻址$ns_ node-config -addressType hierarchical#设置两个domain,第一个为有线网络,第二个为无线网络
AddrParams set domain_num_ 2#每个domain各有一个cluster
lappend cluster_num 1 1AddrParams set cluster_num_ $cluster_numlappend eilastlevel 1 2AddrParams set nodes_num_ $eilastlevelset tracefd [open noah.tr w]
$ns_ trace-all $tracefdset nf [open out.nam w]
$ns_ namtrace-all $nf set topo [new Topography]$topo load_flatgrid 100 100set god_ [create-god 2]
set W(0) [$ns_ node 0.0.0]set chan_ [new Channel/WirelessChannel]$ns_ node-config -adhocRouting NOAH \
-llType LL \ -macType Mac/802_11 \ -ifqType Queue/DropTail/PriQueue \ -ifqLen 50 \ -antType Antenna/OmniAntenna \ -propType Propagation/TwoRayGround \ -phyType Phy/WirelessPhy \ -channel $chan_ \ -topoInstance $topo \ -wiredRouting ON\ -agentTrace OFF \ -routerTrace OFF \ -macTrace OFFset BA [$ns_ node 1.0.0]
$ns_ node-config -wiredRouting OFF
set MH(0) [$ns_ node 1.0.1]$MH(0) random-motion 0#把MH(0)与BA进行连接
$MH(0) set base-station [AddrParams addr2id [$BA node-addr]]$BA set X_ 50.0
$BA set Y_ 50.0$BA set Z_ 0.0$MH(0) set X_ 80.0
$MH(0) set Y_ 80.0$MH(0) set Z_ 0.0$ns_ duplex-link $W(0) $BA 10Mb 10ms DropTail
set udp [new Agent/UDP]
$ns_ attach-agent $W(0) $udpset null [new Agent/Null]
$ns_ attach-agent $MH(0) $null$ns_ connect $udp $nullset 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_ initial_node_pos $BA 60$ns_ initial_node_pos $MH(0) 60$ns_ at 0.0 "$cbr start"$ns_ at 50.0 "$cbr stop"$ns_ at 50.1 "$MH(0) reset";$ns_ at 50.0001 "$W(0) reset"$ns_ at 50.0002 "stop "$ns_ at 50.0003 "$ns_ halt"proc stop {} {
global ns_ tracefd nf $ns_ flush-traceclose $tracefd
close $nf exec nam out.nam & exit 0}
$ns_ run
运行能够成功!但是NAM动画没有反应,正在研究中。