Omnet++ OSPF 路由 table 指标
Omnet++ OSPF Routing table metric
问题1:我在Omnet++中实现了ospf协议。根据拓扑结构,r1 可以通过两种不同的方式到达 r3。我已将上层路径度量设置为 1,将下层路径设置为 10。但是,根据 OSPF 协议,它不应该 select 下层路径,而是它总是 selecting 较低的路径然后返回较高的路径。从路由可以看出table,metric值有问题
问题 2: 我需要在控制台查看路由 table。我使用 printRoutingTable() 方法打印它,但它不起作用。
问题 3:如何查看 linkstate 数据库 table 以了解整个拓扑结构?
这里可以看到代码
ospfRouting.ned
package inet.examples.ospfRouting;
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.networklayer.ipv4.IPv4RoutingTable;
import inet.networklayer.ted.LinkStateRouting;
import inet.node.ethernet.EtherSwitch;
import inet.node.inet.StandardHost;
import inet.node.ospfv2.OSPFRouter;
import inet.common.misc.ThruputMeteringChannel;
network OspfRouting
{
@display("bgb=831,570");
types:
channel C extends ThruputMeteringChannel
{
parameters:
delay = 0.1us;
datarate = 100Mbps;
thruputDisplayFormat = "#N";
}
submodules:
R1: OSPFRouter {
// @networkNode;
@display("p=171,213");
gates:
ethg[3];
}
R2: OSPFRouter {
// @networkNode;
@display("p=344,105");
gates:
ethg[2];
}
R3: OSPFRouter {
//@networkNode;
@display("p=510,213");
gates:
ethg[3];
}
R4: OSPFRouter {
// @networkNode;
@display("p=344,327");
gates:
ethg[2];
}
SW1: EtherSwitch {
// @networkNode;
@display("p=57,212");
}
SW2: EtherSwitch {
// @networkNode;
@display("p=678,212");
}
H1: StandardHost {
// @networkNode;
@display("p=57,331");
gates:
ethg[1];
}
H2: StandardHost {
// @networkNode;
@display("p=678,327");
gates:
ethg[1];
}
configurator: IPv4NetworkConfigurator {
// @networkNode;
@display("p=774.89996,143.5");
}
connections:
{
R1.ethg[0] <--> C <--> R4.ethg[0];
R1.ethg[1] <--> C <--> R2.ethg[1];
R2.ethg[0] <--> C <--> R3.ethg[0];
R3.ethg[1] <--> C <--> R4.ethg[1];
R1.ethg[2] <--> C <--> SW1.ethg++;
R3.ethg[2] <--> C <--> SW2.ethg++;
SW1.ethg++ <--> C <--> H1.ethg[0];
SW2.ethg++ <--> C <--> H2.ethg[0];
}
}
Rconfig.xml
<?xml version = "1.0"?>
<scenario>
<interface hosts = 'R1' names = 'eth0' address = '30.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R1' names = 'eth1' address = '10.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R1' names = 'eth2' address = '50.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R2' names = 'eth0' address = '20.0.0.2' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R2' names = 'eth1' address = '10.0.0.2' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth0' address = '20.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth1' address = '40.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth2' address = '60.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R4' names = 'eth0' address = '30.0.0.4' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R4' names = 'eth1' address = '40.0.0.4' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'H1' names = 'eth0' address ='50.0.0.10' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'H2' names = 'eth0' address ='60.0.0.10' netmask = '255.0.0.0' metric = '1' />
<route hosts = 'H1' destination = '*' netmask = '*' interface = 'eth0'/>
<route hosts = 'H2' destination = '*' netmask = '*' interface = 'eth0'/>
</scenario>
RASConfig.xml
<?xml version="1.0"?>
<OSPFASConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="OSPF.xsd">
<Area id = "0.0.0.0">
<AddressRange address = "10.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.0">
<AddressRange address = "20.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.0">
<AddressRange address = "30.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.0">
<AddressRange address = "40.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.1">
<AddressRange address = "50.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.2">
<AddressRange address = "60.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Router name = "R1" RFC1583Compatible = "true">
<BroadcastInterface
ifName= "eth2"
areaID= "0.0.0.1"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
</Router>
<Router name = "R2" RFC1583Compatible = "true">
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
</Router>
<Router name = "R3" RFC1583Compatible = "true">
<BroadcastInterface
ifName= "eth2"
areaID= "0.0.0.2"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
</Router>
<Router name = "R4" RFC1583Compatible = "true">
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
</Router>
</OSPFASConfig>
ospfR.ini
[General]
network = inet.examples.ospfRouting.OspfRouting
**.configurator.config = xmldoc("Rconfig.xml")
**.configurator.addStaticRoutes = false
**.configurator.addDefaultRoutes = false
**.ospf.ospfConfig = xmldoc("RASConfig.xml")
**.numPingApps = 1
**.H1.pingApp[0].destAddr = "H2"
**.pingApp[*].sendInterval = 1000ms
**.arp.cacheTimeout = 1s
IP4RoutingTable.cc
#include <iostream>
#include <fstream>
#include <string>
#include <IPv4RoutingTable.h>
using namespace std;
class IP4RoutingTable : public cSimpleModule
{
public:
virtual void initialize();
};
Define_Module(IP4RoutingTable);
void IP4RoutingTable::initialize()
{
IPv4RoutingTable:: printRoutingTable () ;
}
问题 1 的答案。
RASConfig.xml
不符合 OSPF.xsd
的要求(XML 架构):
- 键序列
0.0.0.0
在 Area
元素中存在不止一次(只允许一个实例)
- 应该是
interfaceOutputCost
,不是InterfaceOutputCost
interfaceOutputCost
必须小于 1000
问题 2 的答案。
必须为路由 table 对象的实例调用方法 printRoutingTable()
.您可能已经准备了自己的名为 IP4RoutingTable
的简单模块,但 StandardHost
和 OSPFRouter
都不包含该模块。
要打印路由 table 只需将以下行添加到您的 omnetpp.ini
:
**.configurator.dumpRoutes = true
问题1:我在Omnet++中实现了ospf协议。根据拓扑结构,r1 可以通过两种不同的方式到达 r3。我已将上层路径度量设置为 1,将下层路径设置为 10。但是,根据 OSPF 协议,它不应该 select 下层路径,而是它总是 selecting 较低的路径然后返回较高的路径。从路由可以看出table,metric值有问题
问题 2: 我需要在控制台查看路由 table。我使用 printRoutingTable() 方法打印它,但它不起作用。
问题 3:如何查看 linkstate 数据库 table 以了解整个拓扑结构?
这里可以看到代码
ospfRouting.ned
package inet.examples.ospfRouting;
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.networklayer.ipv4.IPv4RoutingTable;
import inet.networklayer.ted.LinkStateRouting;
import inet.node.ethernet.EtherSwitch;
import inet.node.inet.StandardHost;
import inet.node.ospfv2.OSPFRouter;
import inet.common.misc.ThruputMeteringChannel;
network OspfRouting
{
@display("bgb=831,570");
types:
channel C extends ThruputMeteringChannel
{
parameters:
delay = 0.1us;
datarate = 100Mbps;
thruputDisplayFormat = "#N";
}
submodules:
R1: OSPFRouter {
// @networkNode;
@display("p=171,213");
gates:
ethg[3];
}
R2: OSPFRouter {
// @networkNode;
@display("p=344,105");
gates:
ethg[2];
}
R3: OSPFRouter {
//@networkNode;
@display("p=510,213");
gates:
ethg[3];
}
R4: OSPFRouter {
// @networkNode;
@display("p=344,327");
gates:
ethg[2];
}
SW1: EtherSwitch {
// @networkNode;
@display("p=57,212");
}
SW2: EtherSwitch {
// @networkNode;
@display("p=678,212");
}
H1: StandardHost {
// @networkNode;
@display("p=57,331");
gates:
ethg[1];
}
H2: StandardHost {
// @networkNode;
@display("p=678,327");
gates:
ethg[1];
}
configurator: IPv4NetworkConfigurator {
// @networkNode;
@display("p=774.89996,143.5");
}
connections:
{
R1.ethg[0] <--> C <--> R4.ethg[0];
R1.ethg[1] <--> C <--> R2.ethg[1];
R2.ethg[0] <--> C <--> R3.ethg[0];
R3.ethg[1] <--> C <--> R4.ethg[1];
R1.ethg[2] <--> C <--> SW1.ethg++;
R3.ethg[2] <--> C <--> SW2.ethg++;
SW1.ethg++ <--> C <--> H1.ethg[0];
SW2.ethg++ <--> C <--> H2.ethg[0];
}
}
Rconfig.xml
<?xml version = "1.0"?>
<scenario>
<interface hosts = 'R1' names = 'eth0' address = '30.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R1' names = 'eth1' address = '10.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R1' names = 'eth2' address = '50.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R2' names = 'eth0' address = '20.0.0.2' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R2' names = 'eth1' address = '10.0.0.2' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth0' address = '20.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth1' address = '40.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth2' address = '60.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R4' names = 'eth0' address = '30.0.0.4' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R4' names = 'eth1' address = '40.0.0.4' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'H1' names = 'eth0' address ='50.0.0.10' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'H2' names = 'eth0' address ='60.0.0.10' netmask = '255.0.0.0' metric = '1' />
<route hosts = 'H1' destination = '*' netmask = '*' interface = 'eth0'/>
<route hosts = 'H2' destination = '*' netmask = '*' interface = 'eth0'/>
</scenario>
RASConfig.xml
<?xml version="1.0"?>
<OSPFASConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="OSPF.xsd">
<Area id = "0.0.0.0">
<AddressRange address = "10.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.0">
<AddressRange address = "20.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.0">
<AddressRange address = "30.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.0">
<AddressRange address = "40.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.1">
<AddressRange address = "50.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Area id = "0.0.0.2">
<AddressRange address = "60.0.0.0"
mask = "255.0.0.0"
status = "Advertise" />
</Area>
<Router name = "R1" RFC1583Compatible = "true">
<BroadcastInterface
ifName= "eth2"
areaID= "0.0.0.1"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
</Router>
<Router name = "R2" RFC1583Compatible = "true">
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
</Router>
<Router name = "R3" RFC1583Compatible = "true">
<BroadcastInterface
ifName= "eth2"
areaID= "0.0.0.2"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
</Router>
<Router name = "R4" RFC1583Compatible = "true">
<PointToPointInterface
ifName="eth0"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
<PointToPointInterface
ifName="eth1"
areaID = "0.0.0.0"
InterfaceOutputCost = "1000"
/>
</Router>
</OSPFASConfig>
ospfR.ini
[General]
network = inet.examples.ospfRouting.OspfRouting
**.configurator.config = xmldoc("Rconfig.xml")
**.configurator.addStaticRoutes = false
**.configurator.addDefaultRoutes = false
**.ospf.ospfConfig = xmldoc("RASConfig.xml")
**.numPingApps = 1
**.H1.pingApp[0].destAddr = "H2"
**.pingApp[*].sendInterval = 1000ms
**.arp.cacheTimeout = 1s
IP4RoutingTable.cc
#include <iostream>
#include <fstream>
#include <string>
#include <IPv4RoutingTable.h>
using namespace std;
class IP4RoutingTable : public cSimpleModule
{
public:
virtual void initialize();
};
Define_Module(IP4RoutingTable);
void IP4RoutingTable::initialize()
{
IPv4RoutingTable:: printRoutingTable () ;
}
问题 1 的答案。
RASConfig.xml
不符合 OSPF.xsd
的要求(XML 架构):
- 键序列
0.0.0.0
在Area
元素中存在不止一次(只允许一个实例) - 应该是
interfaceOutputCost
,不是InterfaceOutputCost
interfaceOutputCost
必须小于 1000
问题 2 的答案。
必须为路由 table 对象的实例调用方法 printRoutingTable()
.您可能已经准备了自己的名为 IP4RoutingTable
的简单模块,但 StandardHost
和 OSPFRouter
都不包含该模块。
要打印路由 table 只需将以下行添加到您的 omnetpp.ini
:
**.configurator.dumpRoutes = true