📜  TCL脚本模拟ns2中的链接状态路由

📅  最后修改于: 2021-08-27 04:56:15             🧑  作者: Mango

在本文中,我们将知道如何编写TCL脚本,以使用网络模拟器来模拟其中一种路由协议链路状态路由(也称为dijkstra算法)。要了解有关TCL脚本基础知识的更多信息,请查看本文https://www.geeksforgeeks.org/basics-of-ns2-and-otcltcl-script/。

TCL脚本模拟ns2中的链接状态路由:
为了实现TCL脚本来模拟ns2中的链接状态路由,我们将完成模拟LS(链接状态)路由的各个步骤,每个步骤包含以下几行代码。

步骤1:初始化网络:
第一步是初始化网络模拟器,我们通过创建网络模拟器对象来进行初始化。之后,我们将rtproto (路由协议)初始化为Link State(LS )。

set ns [new Simulator]
$ns rtproto LS

步骤2:创建节点数:
接下来,我们创建一个随机数的节点(假设为7)。我们使用节点实例如下创建这些节点。

set node1 [$ns node]
set node2 [$ns node]
set node3 [$ns node]
set node4 [$ns node]
set node5 [$ns node]
set node6 [$ns node]
set node7 [$ns node]

步骤3:创建跟踪文件:
下一步是创建跟踪文件和nam文件。 nam文件用于查看模拟器的输出,而跟踪文件跟踪过程中的所有路由信息。为此,我们创建跟踪文件和nam文件对象,然后以写入模式打开文件。 trace-all实例用于将所有路由信息都跟踪到跟踪文件中,并且类似地,将namtrace-all跟踪到nam文件中。

set tf [open out.tr w]
$ns trace-all $tf
set nf [open out.nam w]
$ns namtrace-all $nf

步骤4:标记节点:
如果需要,我们可以在下一步中标记节点。在这里,我们将它们标记为从节点0到节点6。我们还可以通过为标签分配不同的颜色来自定义标签,从而更加清晰地查看模拟。在这里,我们将使用红色和蓝色。

$node1 label "node 1"
$node1 label "node 2"
$node1 label "node 3"
$node1 label "node 4"
$node1 label "node 5"
$node1 label "node 6"
$node1 label "node 7"
$node1 label-color blue
$node2 label-color red
$node3 label-color red
$node4 label-color blue
$node5 label-color blue
$node6 label-color blue
$node7 label-color blue

步骤5:创建双工链接:
下一步是在最终形成环的节点之间创建双工链接。这可以通过使用双工链接实例以及指定三个参数来实现:数据速率(1.5Mb),延迟(10ms)和队列类型( DropTail )。

$ns duplex-link $node1 $node2 1.5Mb 10ms DropTail
$ns duplex-link $node2 $node3 1.5Mb 10ms DropTail
$ns duplex-link $node3 $node4 1.5Mb 10ms DropTail
$ns duplex-link $node4 $node5 1.5Mb 10ms DropTail
$ns duplex-link $node5 $node6 1.5Mb 10ms DropTail
$ns duplex-link $node6 $node7 1.5Mb 10ms DropTail
$ns duplex-link $node7 $node1 1.5Mb 10ms DropTail

步骤6:确定节点之间的链接:
现在,我们需要适当地定向节点之间的链接,以获得正确的对齐方式。 duplex-link-op实例用于相同的实例。

$ns duplex-link-op $node1 $node2 orient left-down
$ns duplex-link-op $node2 $node3 orient left-down
$ns duplex-link-op $node3 $node4 orient right-down
$ns duplex-link-op $node4 $node5 orient right
$ns duplex-link-op $node5 $node6 orient right-up
$ns duplex-link-op $node6 $node7 orient left-up
$ns duplex-link-op $node7 $node1 orient left-up

步骤7:附加TCP代理:
下一步是在两个节点(假设节点1和节点4)上附加TCP代理(使用attach-agent)。我们可以创建源对象和接收对象,并使用connect实例连接它们。

set tcp2 [new Agent/TCP]
$ns attach-agent $node1 $tcp2
set sink2 [new Agent/TCPSink]
$ns attach-agent $node4 $sink2
$ns connect $tcp2 $sink2

步骤8:建立FTP流量:
下一步是创建FTP通信并附加到TCP源。然后,流量跨节点1和节点4流动。我们可以通过创建FTP代理并将其附加到tcp2来实现。

set traffic_ftp2 [new Application/FTP]
$traffic_ftp2 attach-agent $tcp2

步骤9:添加完成过程:
下一步是添加一个完成过程,将所有数据刷新到跟踪文件中,然后运行nam文件。

proc finish{} {

global ns nf
$ns flush-trace
close $nf
exec nam out.nam &
exit 0
 
}

步骤10:安排FTP:
最后一步是按要求的时间间隔安排FTP流量。我们还可以使用rtmodel-at实例在某个时间戳禁用任一对节点之间的链接,然后在一定时间后启用它。这主要是出于测试目的。在这里,我们禁用了节点2和3之间的链接。该程序以run命令结束。

$ns at 0.5 "traffic_ftp2 start"
$ns rtmodel-at 1.0 down $node2 $node3
$ns rtmodel-at 2.0 up $node2 $node3
$ns at 3.0 "traffic_ftp2 start"
$ns at 4.0 "traffic_ftp2 stop"
$ns at 5.0 "finish"
$ns run

输出 :
最终输出可以如下所示。

禁用链接之前进行仿真

如上图所示,从节点1到节点4的数据包正常流动。我们现在在时间1禁用节点2和3之间的链接,并且模拟情况如下所示。禁用的链路以红色显示,这次的数据包流更改了方向,而不是原始的到节点4的路由。

禁用node2和node3之间的链接时的仿真