Я использую mininet на виртуальной машине Vagrant, которая эмулирует Ubuntu Xenial (мой ноутбук работает под управлением Windows 10).
Топология следующая, когда удаленный контроллер, статический ARP и коммутатор ядра OVS работают впробел:
h1---s1----s4---h3
| \ / |
| s3 |
| / \ |
h2---s2----s5---h4
и я сделал это с помощью следующего скрипта Python:
from mininet.topo import Topo
from mininet.node import Host
class MyTopo(Topo):
def __init__(self):
"Create custom topo."
Topo.__init__(self)
leftTopHost = self.addHost('h1')
leftBottomHost = self.addHost('h2')
rightTopHost = self.addHost('h3')
rightBottomHost = self.addHost('h4')
Switch1 = self.addSwitch('s1')
Switch2 = self.addSwitch('s2')
Switch3 = self.addSwitch('s3')
Switch4 = self.addSwitch('s4')
Switch5 = self.addSwitch('s5')
self.addLink(leftTopHost, Switch1)
self.addLink(Switch1, Switch2)
self.addLink(Switch1, Switch3)
self.addLink(Switch1, Switch4)
self.addLink(leftBottomHost, Switch2)
self.addLink(Switch2, Switch3)
self.addLink(Switch2, Switch5)
self.addLink(Switch3, Switch4)
self.addLink(Switch3, Switch5)
self.addLink(rightTopHost, Switch4)
self.addLink(Switch4, Switch5)
self.addLink(rightBottomHost, Switch5)
topos = {'mytopo': (lambda: MyTopo())}
Основная идея - это туннель MPLS между h1 и h4, проходящий через коммутаторы s1, s4и с5.Я включил часть приложения Ryu, которое я разработал («часть», потому что MPLS совпадает и последующее ping h1 h4 works
отлично);предположим, что номера выходных портов совпадают с кодами в коде
Правила потока в s1 :
#path h1->h4
...
match = parser.OFPMatch(in_port=1, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(4)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match,
instructions=inst)
datapath.send_msg(mod)
#path h4->h1
match = parser.OFPMatch(in_port=4, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(1)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match,
instructions=inst)
datapath.send_msg(mod)
Правила потока в s4 :
#path h1->h4
...
match = parser.OFPMatch(in_port=1, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(4)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match,
instructions=inst)
datapath.send_msg(mod)
#path h4->h1
match = parser.OFPMatch(in_port=4, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(1)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match,
instructions=inst)
datapath.send_msg(mod)
Правила потока в s5 :
#path h1->h4
...
match = parser.OFPMatch(in_port=3, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(4)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match,
instructions=inst)
datapath.send_msg(mod)
#path h4->h1
match = parser.OFPMatch(in_port=4, eth_type=0x800, ip_proto=6)
actions = [parser.OFPActionOutput(3)]
inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=1, match=match,
instructions=inst)
datapath.send_msg(mod)
Итак, моя проблема: я хочу генерировать TCP-трафик между h1 и h4, но я не могу понять, почемукогда я набираю команду iperf h1 h4
в приглашении mininet, это приводит к таймауту соединения;тот же результат, если я запускаю и клиент, и сервер на отдельных терминалах.
Конечно, я знаю, что должен что-то добавить в свой код, но я не могу понять, где ... Любая помощь будет высоко оценена!