为NS2上给定的任意数量的节点创建随机有线拓扑

时间:2017-04-28 12:11:08

标签: random tcl ns2

我想使用NS2创建和模拟有线拓扑。尝试编写tcl并使用rand()定位节点和链接。 我的解决方案是:

### Create a simulator object
set ns [new Simulator]
set num_node 10
set num_flow 5
set x_dim 150
set y_dim 150

### 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
set tracefd [open out.tr w]
$ns trace-all $tracefd

### set up topography object
set topo [new Topography];            # This is needed for wireless
$topo load_flatgrid $x_dim $y_dim;    # Setting a 2D space for the nodes

### Define a 'finish' procedure
proc finish {} {
    global ns nf tracefd
    $ns flush-trace
    ### Close the NAM trace file
    close $nf
    close $tracefd
    ### Execute NAM on the trace file
    exec nam out.nam &
    exit 0
}

#Create four nodes
for {set i 0} {$i < [expr $num_node]} {incr i} {
    set n($i) [$ns node]
    puts "Created node $i"
}

### Create links between the nodes
for {set i 0} {$i < [expr $num_node + 1]} {incr i} {
    set s_node [expr int($num_node*rand())];     # src node
    set d_node $s_node
    while {$d_node==$s_node} { ;                 # while the random pair are same node
        set d_node [expr int($num_node*rand())]; # dest node
    }
    $ns duplex-link $n($s_node) $n($d_node) 2Mb 10ms DropTail
    $ns queue-limit $n($s_node) $n($d_node) 50
    puts "Linking $s_node and $d_node"
}

### Give node position (for NAM)
set i 0
while {$i < $num_node } {
    ### Set random position for nodes
    set x_pos [expr int($x_dim*rand())];   # random settings
    set y_pos [expr int($y_dim*rand())];   # random settings

    $n($i) set X_ $x_pos
    $n($i) set Y_ $y_pos
    $n($i) set Z_ 0.0
    puts "Put $i to ($x_pos , $y_pos)"

    #puts -nonewline $topofile "$i x: [$node_($i) set X_] y: [$node_($i) set Y_] \n"
    incr i;
}; 

### Setup UDP connections
for {set i 0} {$i < [expr $num_flow]} {incr i} {
    set s_node [expr int($num_node*rand())];     # src node
    set d_node $s_node
    while {$d_node==$s_node} {;                  # while the random pair are same node
        set d_node [expr int($num_node*rand())]; # dest node
    }
    set udp($i) [new Agent/UDP]
    $udp($i) set class_ $i
    $ns attach-agent $n($s_node) $udp($i)
    set null($i) [new Agent/Null]
    $ns attach-agent $n($d_node) $null($i)
    $ns connect $udp($i) $null($i)
    $udp($i) set fid_ $i
    puts "Flow $s_node - $d_node"
}

### Setup a CBR over UDP connections
for {set i 0} {$i < [expr $num_flow]} {incr i} {
    set cbr($i) [new Application/Traffic/CBR]
    $cbr($i) attach-agent $udp($i)
    $cbr($i) set type_ CBR
    $cbr($i) set packet_size_ 1000
    $cbr($i) set rate_ 1mb
    $cbr($i) set random_ false
    puts "setting cbr for $i"
}

### Schedule events for the CBR and FTP agents
for {set i 0} {$i < [expr $num_flow]} {incr i} {
    $ns at 0.1 "$cbr($i) start"
}

for {set i 0} {$i < [expr $num_flow]} {incr i} {
    $ns at 4.5 "$cbr($i) stop"
}

for {set i 0} {$i < [expr $num_node]  } { incr i} {
    $ns initial_node_pos $n($i) 4
}

### Run the simulation
$ns run

但是随机化通常会产生错误的链接,从而导致模拟中的问题并出现此错误:

--- Classfier::no-slot{} default handler (tcl/lib/ns-lib.tcl) ---
    _o28: no target for slot 4294967295
    _o28 type: Classifier/Hash/Dest
content dump:
classifier _o28
    0 offset
    0 shift
    1073741823 mask
    1 slots
        slot 5: _o268 (Classifier/Port)
    -1 default
---------- Finished standard no-slot{} default handler ----------

但这也是随机的,并不总是发生。如果没有出现,则nam文件显示节点的重复定义。 有人可以请给我一些关于如何使用随机有效链接创建随机有线拓扑的指导吗?

3 个答案:

答案 0 :(得分:1)

你的文件“random-wired.tcl”在这里工作正常...... PCLinuxOS 2017.04 - x86_64。

$ ns235-64-orig random-wired.tcl
Created node 0
Created node 1
Created node 2
Created node 3
Created node 4
Created node 5
Created node 6
Created node 7
Created node 8
Created node 9
Linking 9 and 0
Linking 9 and 8
Linking 5 and 8
Linking 1 and 6
Linking 9 and 6
Linking 8 and 0
Linking 1 and 4
Linking 3 and 7
Linking 8 and 7
Linking 1 and 2
Linking 9 and 0
Put 0 to (139 , 71)
Put 1 to (107 , 146)
Put 2 to (14 , 9)
Put 3 to (16 , 23)
Put 4 to (89 , 30)
Put 5 to (26 , 65)
Put 6 to (46 , 76)
Put 7 to (87 , 31)
Put 8 to (12 , 105)
Put 9 to (89 , 56)
Flow 6 - 4
Flow 0 - 1
Flow 2 - 8
Flow 5 - 2
Flow 2 - 3
setting cbr for 0
setting cbr for 1
setting cbr for 2
setting cbr for 3
setting cbr for 4

创建文件out.nam 3.3MB,out.tr 1.4MB。和nam:一些节点显示活动。

enter image description here

  

--- Classfier :: no-slot {}默认处理程序(tcl / lib / ns-lib.tcl)---

...是一些模拟/某些Linux操作系统的已知错误。另一个ns2友好的操作系统是CentOS 7 - 64位:你的文件运行正常。不太好的消息:Ubuntu 16.04 - 64和Ubuntu 17.04 - 64失败。实际上Ubuntu不是ns2的首选。对它的“不同”修补不是很友好libc6的。

示例,rand() aodv18.tcl ,aodv_802_15_4.tcl,AODV-Jenova.tcl,aodv-Soumia.tcl, AODV-testcode-rand.tcl https://drive.google.com/file/d/0B7S255p3kFXNMXRfTTlEcm5KUW8/view?usp=sharing

编辑,2017年5月26日:

  

--- Classfier :: no-slot {}默认处理程序

我认为找到了解决方案http://www.linuxquestions.org/questions/linux-software-2/ns2-2-35-antnet-4175532576/#14(帖子#14 @newthink)→添加$ns multicast

set ns [ new Simulator ]
$ns multicast

与有问题的Antnet模拟完美配合。

答案 1 :(得分:0)

$ns multicast有时不起作用。我发现这个post表示在生成的图形断开连接时会发生此错误。

因此,我检查了该图是否从未断开连接,并且每个节点至少具有一个链接。

#nodeFlag_ keeps of which nodes has at least one link
for {set i 0} {$i < $num_node} {incr i} {
        set nodeFlag_($i) 0
    }
    ### Create links between the nodes
    for {set i 0} {$i < [expr $num_node + 1]} {incr i} {
        set s_node [expr int($num_node*rand())];     # src node
        set d_node $s_node
        while {$d_node==$s_node} { ;                 # while the random pair are same node
            set d_node [expr int($num_node*rand())]; # dest node
        }
        $ns duplex-link $node_($s_node) $node_($d_node) 2Mb 10ms DropTail
        set nodeFlag_($s_node) 1
        set nodeFlag_($d_node) 1
        $ns queue-limit $node_($s_node) $node_($d_node) 50
        puts "Linking $s_node and $d_node"
    }
    for {set i 0} {$i < $num_node} {incr i} {
            #see here
            if {$nodeFlag_($i) == 0} {
            set random [expr int($num_node*rand())]
            $ns duplex-link $node_($i) $node_($random) 2Mb 10ms DropTail
            puts "left link $i and $random"
        }
        puts "$nodeFlag_($i)"
    }

希望这会有所帮助。

编辑:我错了。在某些模拟中仍然显示该错误。

答案 2 :(得分:0)

尽管您的上一次编辑确保每个节点至少具有一个链接,但不能保证所有节点之间都具有完全连接的图形。换句话说,您可能仍然最终拥有多个隔离的节点组,这些节点是其他节点无法访问的。