ns2无线局域网仿真

http://blog.csdn.net/kgn28/article/details/5330694

Wlan 的协议802.11 定义了两种工作模式 :ad hoc (对等)模式和infrastructure (架构)模式。在ad hoc 模式中,至少需要包含两个STA ,每两个STA 之间直接相连实现资源共享,不需要AP 和分布式系统,由此构成的无线局域网也称为IBSS 网络。

在infrastructure 模式中,各无线站点STA 通过AP 与现有的骨干网相连接,这种 配置组成一个BSS 。在BSS 中,AP 不仅提供STA 之间通信的桥接功能,还提供STA 与有线局域网的连接,以便无线用户访问有线网络上的设备或服务

ns2无线局域网仿真_第1张图片 

分别在两种模式下进行无线仿真实验,从而更好的了解影响无线网络性能的因素,对实际应用也有一定的指导作用,通过仿真指导实际网络构建也是一个很好的应用。譬如:我一个同学目前在做一个无线通信设备公司,主要是在农村地区布设wifi 网络,提供internet 服务,由于他们没有经过很好的论证就构建了一个网络,发现网络性能非常不稳定,多个用户使用时每个人的带宽会急剧下降,这时,他们的解决方法是增加有线外网接入带宽并给每个用户限定使用带宽,但是还是出现不稳定的情况,我知道后,利用ns2 做了一个仿真,发现他们的无线网络构架是不可能提供预期性能的。这也说明仿真还是有一定价值的。下面就分两个部分介绍如何使用ns2 进行802.11网络基本仿真 。通过对TCP 应用的仿真,得出TCP 应用的吞吐量。我们常说的54m 的无线网络的性能到底如何呢,通过仿真我们可以得到一个理性的认识。

Adhoc 网络的仿真:(参考 )

实验代码:

[c-sharp]  view plain copy
  1. proc getopt {argc argv} {  
  2.     global opt  
  3.     lappend optlist nn  
  4.     for {set i 0} {$i < $argc} {incr i} {  
  5.         set opt($i) [lindex $argv $i]  
  6.     }  
  7. }  
  8. getopt $argc $argv  
  9. set datarate $opt(0);  
  10. set end $opt(1);  
  11. set nodes $opt(2);  
  12. # ======================================================================  
  13. # Define options  
  14. # ======================================================================  
  15. set val(chan)           Channel/WirelessChannel    ;# channel type  
  16. set val(prop)           Propagation/TwoRayGround   ;# radio-propagation model  
  17. set val(netif)          Phy/WirelessPhy            ;# network interface type  
  18. set val(mac)            Mac/802_11                 ;# MAC type  
  19. set val(ifq)            Queue/DropTail/PriQueue    ;# interface queue type  
  20. set val(ll)             LL                         ;# link layer type  
  21. set val(ant)            Antenna/OmniAntenna        ;# antenna model  
  22. set val(ifqlen)         50                         ;# max packet in ifq  
  23. set val(nn)             $nodes                          ;# number of mobilenodes  
  24. #set val(rp)             DSDV                       ;# routing protocol  
  25. set val(rp)             AODV                       ;# routing protocol  
  26. #  
  27. # Initialize Global Variables  
  28. #  
  29. set ns_     [new Simulator]  
  30. set tracefd     [open 2nodetrace.tr w]  
  31. $ns_ trace-all $tracefd  
  32. $ns_ use-newtrace  
  33. Phy/WirelessPhy set freq_ 2.4e+9  
  34. Phy/WirelessPhy set RXThresh_ 1.74293e-08  
  35. Phy/WirelessPhy set CSThresh_ 3.44283e-09  
  36. Phy/WirelessPhy set Pt_ 0.28183815  
  37. if {$datarate == "2"} {   
  38.     puts "FHSS (IEEE802.11)"  
  39.     Mac/802_11 set CWMin 31  
  40.     Mac/802_11 set CWMax 1023  
  41.     Mac/802_11 set SlotTime_ 0.000050  
  42.     Mac/802_11 set SIFS_ 0.000028  
  43.     Mac/802_11 set PreambleLength_ 0  
  44.     Mac/802_11 set PLCPHeaderLength_ 128  
  45.     Mac/802_11 set PLCPDataRate_ 1.0e6  
  46.     Mac/802_11 set dataRate_ 2.0e6  
  47.     Mac/802_11 set basicRate_ 1.0e6 ;  
  48. } elseif {$datarate == "11"} {   
  49.     puts "DSSS (IEEE802.11b)"  
  50.     Mac/802_11 set CWMin_ 31  
  51.     Mac/802_11 set CWMax_ 1023  
  52.     Mac/802_11 set SlotTime_ 0.000020  
  53.     Mac/802_11 set SIFS_ 0.000010  
  54.     Mac/802_11 set PreambleLength_ 144  
  55.     Mac/802_11 set PLCPHeaderLength_ 48  
  56.     Mac/802_11 set PLCPDataRate_ 1.0e6  
  57.     Mac/802_11 set dataRate_ 11.0e6  
  58.     Mac/802_11 set basicRate_ 1.0e6  
  59. } elseif {$datarate == "54"} {   
  60.     puts "DSSS (IEEE802.11g)"  
  61.     Mac/802_11 set CWMin 31  
  62.     Mac/802_11 set CWMax 1023  
  63.     Mac/802_11 set SlotTime_ 0.000009  
  64.     Mac/802_11 set SIFS_ 0.000010  
  65.     Mac/802_11 set PreambleLength_ 96  
  66.     Mac/802_11 set PLCPHeaderLength_ 40  
  67.     Mac/802_11 set PLCPDataRate_ 6.0e6  
  68.     Mac/802_11 set dataRate_ 54.0e6  
  69.     Mac/802_11 set basicRate_ 1.0e6  
  70. else {  
  71.     puts "Error datarate configuration."  
  72. }  
  73. Mac/802_11 set RTSThreshold_ 256  
  74. Mac/802_11 set ShortRetryLimit_ 7  
  75. Mac/802_11 set LongRetryLimit_ 4  
  76. # set up topography object  
  77. set topo       [new Topography]  
  78. $topo load_flatgrid 500 500  
  79. #  
  80. # Create God  
  81. create-god $val(nn)  
  82. #  
  83. #  Create the specified number of mobilenodes [$val(nn)] and "attach" them  
  84. #  to the channel.   
  85. #  Here two nodes are created : node(0) and node(1)  
  86. # Create a new channel  
  87. set channel1_ [new $val(chan)]  
  88. # configure node  
  89. $ns_ node-config -adhocRouting $val(rp) /  
  90.              -llType $val(ll) /  
  91.              -macType $val(mac) /  
  92.              -ifqType $val(ifq) /  
  93.              -ifqLen $val(ifqlen) /  
  94.              -antType $val(ant) /  
  95.              -propType $val(prop) /  
  96.              -phyType $val(netif) /  
  97.              -channel $channel1_ /  
  98.              -topoInstance $topo /  
  99.              -agentTrace ON /  
  100.              -routerTrace ON /  
  101.              -macTrace OFF /  
  102.              -movementTrace OFF           
  103.                
  104. for {set i 0} {$i < $val(nn) } {incr i} {  
  105.     set node_($i) [$ns_ node]  
  106.     $node_($i) random-motion 0  
  107.     $node_($i) set X_ [expr 30.0 * $i]  
  108.     $node_($i) set Y_ 00.0  
  109.     $node_($i) set Z_ 00.0  
  110.     $ns_ initial_node_pos $node_($i) 15  
  111. }  
  112. set tcp [new Agent/TCP/Reno]  
  113. $tcp set packetSize_ 1440  
  114. $tcp set window_ 64  
  115. $tcp set maxburst_ 2  
  116. $tcp set fid_ 0  
  117. set sink [new Agent/TCPSink]  
  118. $sink set fid_ 0  
  119. $ns_ attach-agent $node_(0) $tcp  
  120. $ns_ attach-agent $node_([expr $nodes-1]) $sink  
  121. $ns_ connect $tcp $sink  
  122. set ftp [new Application/FTP]  
  123. $ftp attach-agent $tcp  
  124. $ns_ at 0.0 "$ftp start"  
  125. for {set i 0} {$i < $val(nn) } {incr i} {  
  126.     $ns_ at $end "$node_($i) reset";  
  127. }  
  128. $ns_ at $end "stop; $ns_ halt"  
  129. proc stop {} {  
  130.     global ns_ tracefd tcp sink datarate end tcpv  
  131.     set thr [expr [$tcp set ack_] * [$tcp set packetSize_]*8/$end/1000000.0]  
  132.     puts [format "th = %.2f, util = %.2f" $thr [expr $thr/$datarate*100]]  
  133.     $ns_ flush-trace  
  134.     close $tracefd  
  135. }  
  136. puts "Starting Simulation..."  
  137. $ns_ run  

1, 单跳

当使用2mb 的802.11 网络时结果为:

th = 1.23, util = 61.32 (吞吐量1.23mb ,util 是使用率和2mb 的比对)

当使用11mb 的802.11b 网络时结果为:

th = 3.35, util = 30.48

当使用54mb 的802.11g 网络时结果为:

th = 9.23, util = 17.10

2 ,多跳,在adhoc 网络中路由算法显得非常重要,尤其是自组织网络在网络拓扑变化迅速情况下对性能的保持是研究的重点和难点,我们这个实验就是简单的线性路由,我们会发现当跳数(路由经过节点数)增加后性能的下降时非常明显的。当使用11mb 的带宽时,1 跳的记过是3.34mb 吞吐,3 跳为1.67mb ,4 跳为0.77mb ,5 跳降为0.56mb 。多跳时候网络性能的下降归结为每一跳的节点需要接受和发送数据包从而导致性能的下降(参考 )

Infrastructure 网络的仿真:

修改代码重点在制定移动节点的基站节点,基站节点是无线和有线的混合节点,这里面我也把节点的地址修改为层次地址,代码如下:

[c-sharp]  view plain copy
  1. proc getopt {argc argv} {  
  2.     global opt  
  3.     lappend optlist nn  
  4.     for {set i 0} {$i < $argc} {incr i} {  
  5.         set opt($i) [lindex $argv $i]  
  6.     }  
  7. }  
  8. getopt $argc $argv  
  9. set datarate $opt(0);  
  10. set opt(stop) $opt(1);  
  11. set opt(nn)              4           
  12. set opt(x)      500                   
  13. set opt(y)      500                        
  14. set opt(tr-ns)    out.tr   
  15. set opt(tr-nam)  out.nam        
  16. set ns_   [new Simulator]  
  17. # set up for hierarchical routing (needed for routing over a basestation)  
  18. $ns_ node-config -addressType hierarchical  
  19. AddrParams set domain_num_  2                   ;# domain number  
  20. AddrParams set cluster_num_ {1 1}           ;# cluster number for each domain   
  21. AddrParams set nodes_num_   {1 3}           ;# number of nodes for each cluster   
  22. set tracefd  [open $opt(tr-ns) w]  
  23. set namtrace [open $opt(tr-nam) w]  
  24. $ns_ trace-all $tracefd  
  25. $ns_ use-newtrace  
  26. $ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y)  
  27. set topo   [new Topography]  
  28. $topo load_flatgrid $opt(x) $opt(y)  
  29. create-god [expr $opt(nn) + 2]  
  30. set CN [$ns_ node 0.0.0]  
  31. Phy/WirelessPhy set freq_ 2.4e+9  
  32. Phy/WirelessPhy set RXThresh_ 1.74293e-08  
  33. Phy/WirelessPhy set CSThresh_ 3.44283e-09  
  34. Phy/WirelessPhy set Pt_ 0.28183815  
  35. if {$datarate == "2"} {   
  36.     puts "FHSS (IEEE802.11)"  
  37.     Mac/802_11 set CWMin 31  
  38.     Mac/802_11 set CWMax 1023  
  39.     Mac/802_11 set SlotTime_ 0.000050  
  40.     Mac/802_11 set SIFS_ 0.000028  
  41.     Mac/802_11 set PreambleLength_ 0  
  42.     Mac/802_11 set PLCPHeaderLength_ 128  
  43.     Mac/802_11 set PLCPDataRate_ 1.0e6  
  44.     Mac/802_11 set dataRate_ 2.0e6  
  45.     Mac/802_11 set basicRate_ 1.0e6 ;  
  46. } elseif {$datarate == "11"} {   
  47.     puts "DSSS (IEEE802.11b)"  
  48.     Mac/802_11 set CWMin_ 31  
  49.     Mac/802_11 set CWMax_ 1023  
  50.     Mac/802_11 set SlotTime_ 0.000020  
  51.     Mac/802_11 set SIFS_ 0.000010  
  52.     Mac/802_11 set PreambleLength_ 144  
  53.     Mac/802_11 set PLCPHeaderLength_ 48  
  54.     Mac/802_11 set PLCPDataRate_ 1.0e6  
  55.     Mac/802_11 set dataRate_ 11.0e6  
  56.     Mac/802_11 set basicRate_ 1.0e6  
  57. } elseif {$datarate == "54"} {   
  58.     puts "DSSS (IEEE802.11g)"  
  59.     Mac/802_11 set CWMin 31  
  60.     Mac/802_11 set CWMax 1023  
  61.     Mac/802_11 set SlotTime_ 0.000009  
  62.     Mac/802_11 set SIFS_ 0.000010  
  63.     Mac/802_11 set PreambleLength_ 96  
  64.     Mac/802_11 set PLCPHeaderLength_ 40  
  65.     Mac/802_11 set PLCPDataRate_ 6.0e6  
  66.     Mac/802_11 set dataRate_ 54.0e6  
  67.     Mac/802_11 set basicRate_ 1.0e6  
  68. else {  
  69.     puts "Error datarate configuration."  
  70. }  
  71. Mac/802_11 set RTSThreshold_ 256  
  72. Mac/802_11 set ShortRetryLimit_ 7  
  73. Mac/802_11 set LongRetryLimit_ 4  
  74. $ns_ node-config -adhocRouting DSDV /  
  75.                  -llType LL /  
  76.                  -macType Mac/802_11 /  
  77.                  -ifqType Queue/DropTail/PriQueue /  
  78.                  -ifqLen 50 /  
  79.                  -antType Antenna/OmniAntenna /  
  80.                  -propType Propagation/TwoRayGround /  
  81.                  -phyType Phy/WirelessPhy /  
  82.                  -channelType Channel/WirelessChannel /  
  83.                  -topoInstance $topo /  
  84.                  -wiredRouting ON /  
  85.                  -agentTrace ON /  
  86.                  -routerTrace OFF /  
  87.                  -macTrace OFF  
  88. set HA [$ns_ node 1.0.0]   ;#domain 2, cluster 1, node 1  
  89. $HA set X_ 100.00  
  90. $HA set Y_ 100.00  
  91. $HA set Z_ 0.00  
  92. # create links between wired and BaseStation nodes  
  93. $ns_ duplex-link $CN $HA 5Mb 2ms DropTail  
  94. $ns_ node-config -wiredRouting OFF  
  95. set MN_1 [$ns_ node 1.0.1]  
  96. $MN_1 base-station [AddrParams addr2id [$HA node-addr]]  
  97. $MN_1 set X_ 120.00  
  98. $MN_1 set Y_ 100.00  
  99. $MN_1 set Z_ 0.00  
  100. set MN_2 [$ns_ node 1.0.2]  
  101. $MN_2 base-station [AddrParams addr2id [$HA node-addr]]  
  102. $MN_2 set X_ 140.00  
  103. $MN_2 set Y_ 100.00  
  104. $MN_2 set Z_ 0.00  
  105. set tcp1 [new Agent/TCP]  
  106. set sink1 [new Agent/TCPSink]  
  107. $ns_ attach-agent $MN_1 $tcp1  
  108. $ns_ attach-agent $CN $sink1  
  109. $ns_ connect $tcp1 $sink1  
  110. set ftp1 [new Application/FTP]  
  111. $ftp1 attach-agent $tcp1  
  112. set tcp2 [new Agent/TCP]  
  113. set sink2 [new Agent/TCPSink]  
  114. $ns_ attach-agent $MN_2 $tcp2  
  115. $ns_ attach-agent $CN $sink2  
  116. $ns_ connect $tcp2 $sink2  
  117. set ftp2 [new Application/FTP]  
  118. $ftp2 attach-agent $tcp2  
  119. $ns_ at 10.00 "$ftp1 start"  
  120. $ns_ at 10.00 "$ftp2 start"  
  121. $ns_ at $opt(stop) "finish; $ns_ halt"  
  122. proc finish {} {  
  123.     global ns_ tracefd namtrace tcp1 sink datarate opt  
  124.     set thr [expr [$tcp1 set ack_] * [$tcp1 set packetSize_]*8/($opt(stop)-10)/1000000.0]  
  125.     puts [format "th = %.2f, util = %.2f" $thr [expr $thr/$datarate*100]]  
  126.     close $tracefd  
  127.     close $namtrace  
  128. }  
  129. puts "Starting Simulation..."  
  130. $ns_ run  

当只有一个无线节点工作时(注释掉ftp2 的start 代码),结果为:

th = 1.11, util = 55.33 ,而当有无线节点同时工作时结果为:th = 0.55, util = 27.72 ,我们发现吞吐量正好减少了一半,这里我们避谈较为复杂的信道共享机制,使用常识推理也可以想到,多了一个工作节点当然性能会下降了。最后说一下仿真和实际的区别,仿真结果和实际结果会有一些不同(参考 介绍了如何调整参数是仿真结果和实际结果接近)实际吞吐量可以使用ixchariot 进行测量。


你可能感兴趣的:(工作,算法,ant,tcp,网络,internet)