SDN-Grundkurs für Programmierer 3: Erstellen Sie mit Ryu einen Switching Hub

Ryu Umweltbau

Eine der Stärken von Ryu ist, dass der Entwickler NTT Laboratories eine Fülle von Dokumentationen bereitstellt. Es gibt nicht viele Dokumente, die zum Erlernen von SDN in einer japanischen Umgebung organisiert sind, und selbst wenn dies der Fall ist, sind die Informationen häufig veraltet. Das Wiki von Ryu wurde ins Japanische übersetzt und der gleiche Inhalt wurde in ein elektronisches Buch umgewandelt. Die PDF-Version ist kostenlos für die Öffentlichkeit zugänglich und daher leicht zu erlernen. Es ist auch das Schicksal eines Frameworks, das unter Linux ausgeführt wird. Wenn Sie jedoch versuchen, die Umgebung anderer OpenFlow-Controller vorzubereiten, wird die Installation aufgrund von Problemen aufgrund von Versionsinkongruenzen und Abhängigkeiten nicht fortgesetzt, oder der Quellcode funktioniert nicht. Ich hatte es schwer. Ryu hat jedoch eine Bilddatei vorbereitet, die auf VirutalBox ausgeführt wird, und die Erstellung der Ryu-Umgebung abgeschlossen. Das hilft. Laden Sie es sofort von Official HP herunter.

Beim Lesen der englischen Sprache auf der offiziellen Website während des Downloads scheint die Aussprache von Ryu "Ryo" zu sein. Die Bedeutung scheint jedoch vom japanischen "Stil" (= Flow) zu stammen. Importieren Sie es nach dem Herunterladen in die Virutal Box. Wenn Sie wie auf der Seite hier gezeigt ausführen, ist der Import abgeschlossen. Die Benutzer-ID und das Kennwort werden zu Beginn des offiziellen Lernprogramms aufgeführt (https://github.com/osrg/ryu/wiki/OpenFlow_Tutorial).

Machen Sie mit Ryu einen Switching Hub

Die Umgebung ist bereit. Von hier aus werden wir unter Verwendung des vom Beamten erstellten "Ryu SDN Framework" lernen. Lassen Sie uns zunächst einen Switching Hub erstellen, um den Betrieb von Ryu zu überprüfen. Ich habe erklärt, wie ein Switching Hub (Switch) beim letzten Mal aussieht, aber ich werde seine "Spezifikationen" noch einmal erläutern.

スイッチングハブ説明1.png Beim Einschalten wird nichts in der MAC-Adresstabelle des Switching Hubs aufgezeichnet. Wenn der Switch daher Frames vom ersten verbundenen Host empfängt, sendet er Frames an alle verbundenen Ports. (Der empfangende Host überprüft die "Ziel-MAC-Adresse" des gesendeten Pakets und ignoriert sie, wenn sie sich von seiner eigenen MAC-Adresse unterscheidet.) Gleichzeitig wird der MAC-Adresstabelle "Quell-MAC-Adresse (= Host)" hinzugefügt. Und "die Portnummer, mit der der Host mit dieser MAC-Adresse verbunden ist" wird aufgezeichnet.

スイッチングハブ説明2.png Wenn in Zukunft ein Frame, dessen Ziel-MAC-Adresse in der MAC-Adresstabelle aufgezeichnet ist, zum Switching Hub fließt, wird der Frame nur zu dem in der MAC-Adresstabelle geschriebenen Port geleitet.

Vor der Verbreitung von Switching-Hubs waren Hubs, sogenannte "Repeater-Hubs", die von einem Host empfangene Daten an alle anderen Hosts übertragen, der Mainstream. Das Senden an alle Hosts hat zu Problemen geführt, z. B. zu einer Zunahme der Anzahl der im Netzwerk fließenden Pakete, einer Zunahme der Kollisionen und einer Abnahme der Effizienz der Netzwerknutzung. In der Vergangenheit waren Switching Hubs teuer, daher gab es eine Zeit, in der sie zu Hause Repeater-Hubs und in Büros Switching Hubs waren. Heutzutage können Switching Hubs für 1000 Yen gekauft werden. Repeater-Hubs gehören der Vergangenheit an. Zur Erinnerung, dieser Repeater-Hub wurde auch als "dummer Hub" bezeichnet.

Bei Implementierung mit dieser Grundfunktion von OpenFlow scheint es möglich zu sein, den Betrieb des Switching Hub zu programmieren.

Der Quellcode des OpenFlow-Controllers, der den Switching Hub implementiert, befindet sich in der zuvor erstellten Entwicklungsumgebung unter "/ home / ryu / ryu / ryu / app". Schauen wir uns das an (der Quellcode wird auch im [Web] veröffentlicht (https://osrg.github.io/ryu-book/ja/html/switching_hub.html)).

Initialisierung der MAC-Adresstabellenvariablen mac_to_port in init. Und Zeile 32 ist wichtig für das Verständnis der Ryu-Anwendung.

simple_switch_13.py(32,Zeile 33)


    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):

Die 32. Zeile ist der Dekorateur und die 33. Zeile ist der Event-Handler. "Decorator" ist ein Element, das ich in dem Python-Grundkurs, den ich in der Vergangenheit geschrieben habe, weggelassen habe. Die folgende Seite kann hilfreich sein.

Wenn in Ryu eine OpenFlow-Nachricht empfangen wird, tritt das der Nachricht entsprechende Ereignis auf. Die Ryu-Anwendung implementiert einen Ereignishandler für die Nachricht, die Sie empfangen möchten. Sie können einen Ereignishandler deklarieren, indem Sie den Dekorator set_ev_cls schreiben. Das erste Argument von set_ev_cls gibt das Ereignis an, das die Ryu-Anwendung empfangen möchte. Das zweite Argument gibt einen oder eine Liste von Zuständen zwischen dem OpenFlow-Switch und dem OpenFlow-Controller an.

Status Erläuterung
ryu.controller.handler.HANDSHAKE_DISPATCHER Hallo Nachrichtenaustausch
ryu.controller.handler.CONFIG_DISPATCHER Funktionsanforderung senden
ryu.controller.handler.MAIN_DISPATCHER Normalzustand
ryu.controller.handler.DEAD_DISPATCHER Trennung

Das erste Argument von set_ev_cls ist EventOFP ** SwitchFeatures **. Der Name der Ereignisklasse lautet ryu.controller.ofp_event.EventOFP + ** Name der OpenFlow-Nachricht **. (Im Fall einer Packet In-Nachricht ist dies beispielsweise EventOFPPacketIn.) In diesem Fall codieren wir den switch_features_handler als Ereignis, wenn der Switch eine Verbindung herstellt. Ich denke, dass set_ev_cls bereits im Ryu-Framework implementiert ist, in dem einige Schritte wie der Handshake, den der OpenFlow-Switch und der Controller für die Kommunikation mit dem OpenFlow-Protokoll benötigen, damit umgehen. Ich werde. Daher können Sie sich beim Empfang eines Ereignisses nur auf das anwendungsspezifische Verhalten konzentrieren.

simple_switch_13.py(switch_features_Handler-Methode)


    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        datapath = ev.msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser

        match = parser.OFPMatch()
        actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
                                          ofproto.OFPCML_NO_BUFFER)]
        self.add_flow(datapath, 0, match, actions)

Die ofproto-Bibliothek ist eine Bibliothek zum Erstellen und Analysieren von Nachrichten des OpenFlow-Protokolls. Ist ofproto_parser ein Nachrichtenparser mit Namen?

Im Switching Hub wird kein Ereignis beschrieben, wenn der Switch eine Verbindung herstellt. Tabellenfehler Wird als Ereignis behandelt, um den Zeitpunkt für das Hinzufügen eines Flow-Eintrags zu ermitteln. Ein Table-Miss-Flow-Eintrag ist ein Eintrag mit der niedrigsten Priorität (0) und entspricht allen Paketen. Entspricht dem Standard in der case-Anweisung.

simple_switch_13.py(Zeilen 45-48)


        #Entspricht allen Paketbedingungen
        match = parser.OFPMatch() 
        #Senden Sie das gesamte Paket ohne Pufferung an den Controller
        actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
                                          ofproto.OFPCML_NO_BUFFER)] 
        #Fügen Sie der Flusstabelle den Flow-Eintrag mit der Priorität 0 hinzu
        self.add_flow(datapath, 0, match, actions)

Die Bedingung (Übereinstimmung) ist leer, dh alle Bedingungen. Die Aktion zum Weiterleiten an den Controller-Port gibt den Controller als Ausgabeziel an, und OFPCML_NO_BUFFER wird angegeben, damit max_len das gesamte Paket an den Controller sendet.

Hinweis:Der Anfang des Pakets auf dem Controller(Ethernet-Header)Es ist aus Effizienzgründen besser, nur den Rest im Switch zu senden und zu puffern. Um jedoch den Open vSwitch-Fehler zu vermeiden, senden wir das gesamte Paket hierher. Dieser Fehler ist Open vSwitch 2.1.Mit 0 behoben(Vom Ryu-Beamten)

In dieser Beschreibung wird durch Angabe der Ausgabeaktion für den Port des OpenFlow-Controllers zur Verarbeitung dieses Eintrags Packet-In ausgegeben, wenn das empfangene Paket nicht mit allen normalen Flow-Einträgen übereinstimmt. .. Der Grund, warum eine solche Beschreibung erforderlich ist, besteht darin, dass der OpenFlow-Switch Pakete verwirft oder verwirft, die standardmäßig nicht mit dem Flow-Eintrag übereinstimmen.

Erstellen Sie als Nächstes einen Handler für das Packet In-Ereignis, um eingehende Pakete von unbekannten Zielen zu akzeptieren.

simple_switch_13.py(Zeilen 61-62)


    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def _packet_in_handler(self, ev):

Das erste Argument von set_ev_cls ist EventOFP ** PacketIn **. Das zweite Argument ist ebenfalls MAIN_DISPATCHER, was den Normalzustand bedeutet.

simple_switch_13.py(Zeilen 67-81)


    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def _packet_in_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser
        in_port = msg.match['in_port'] #Portnummer abrufen

        pkt = packet.Packet(msg.data)
        eth = pkt.get_protocols(ethernet.ethernet)[0] #Ethernet-Header abrufen

        dst = eth.dst #Ziel-MAC-Adresse
        src = eth.src #Quell-MAC-Adresse

        dpid = datapath.id
        self.mac_to_port.setdefault(dpid, {})

        self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port)

        self.mac_to_port[dpid][src] = in_port 

Das Array mac_to_port legt die Portnummer fest, die der "Quell-MAC-Adresse" des Datenpfads "ID (OpenFlow-Switch-Identifikations-ID)" entspricht. Das Programm macht dasselbe wie das Aufzeichnen der zu Beginn dieses Kapitels beschriebenen MAC-Adresstabelle.

simple_switch_13.py(Zeilen 82-93)



        if dst in self.mac_to_port[dpid]:
            out_port = self.mac_to_port[dpid][dst]
        else:
            out_port = ofproto.OFPP_FLOOD

        actions = [parser.OFPActionOutput(out_port)]

        #Wenn die Ziel-MAC-Adresse gefunden wird
        if out_port != ofproto.OFPP_FLOOD:
            match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
            #Table-miss Set 1 mit höherer Priorität als Flow Entry
            self.add_flow(datapath, 1, match, actions) 

Wenn die "Ziel-MAC-Adresse" vorhanden ist, die der Datenpfad-ID des Arrays mac_to_port entspricht, geben Sie diese Portnummer an. Wenn sie nicht vorhanden ist, senden Sie einen Frame an alle Ports. Der Prozess wird als "Ausgabe (Port)" angegeben.

Wenn die Ziel-MAC-Adresse gefunden wird, fügen Sie der Flusstabelle des OpenFlow-Switch einen Eintrag hinzu. Im Gegensatz zum Table-Miss-Flow-Eintrag gibt OFPMatch diesmal den Empfangsport (in_port) und die Ziel-MAC-Adresse (eth_dst) als Bedingungen an.

Die Methode add_flow, die der Flusstabelle einen Flow-Eintrag hinzufügt, lautet: Weist den OpenFlow-Switch an, die Flusstabelle mit der Methode parser.OFPFlowMod zu aktualisieren.

simple_switch_13.py(Zeilen 50-59)


    def add_flow(self, datapath, priority, match, actions):
        ofproto = datapath.ofproto
        parser = datapath.ofproto_parser

        inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                             actions)]

        mod = parser.OFPFlowMod(datapath=datapath, priority=priority,
                                match=match, instructions=inst)
        datapath.send_msg(mod)

simple_switch_13.py(Zeilen 95-101)


        data = None
        if msg.buffer_id == ofproto.OFP_NO_BUFFER:
            data = msg.data

        out = parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id,
                                  in_port=in_port, actions=actions, data=data)
        datapath.send_msg(out)

Geben Sie abschließend eine PacketOut-Nachricht aus, um das empfangene Paket weiterzuleiten.

Führen Sie die Ryu-Anwendung aus

Machen wir den OpenFlow-Switch mithilfe des erstellten OpenFlow-Controllers zu einem Switching-Hub. Dies erfordert jedoch einen OpenFlow-Switch und -Host. Nicht im Haus eines normalen Menschen. (Es scheint, dass einige Leute zu Hause ein Server-Rack haben, aber w) Das dafür vorbereitete ist "Mininet". Mininet hat eine Funktion zum Konfigurieren eines virtuellen Netzwerks mit OpenFlow. Mininet ist auch auf der offiziell vorbereiteten VM installiert.

Geben Sie vor dem Starten von Mininet ifconfig in die Konsole ein. ifconfig ist ein Befehl zum Überprüfen der IP-Adresse, Netzmaske usw., die der Netzwerkschnittstelle dieses PCs zugewiesen ist (obwohl es sich tatsächlich um eine virtuelle Maschine handelt). Sie sehen eine Netzwerkschnittstelle für diesen PC mit dem Namen "eth0" und eine spezielle Schnittstelle mit dem Namen "local loopback" mit dem Namen "lo". Danach mit dem unten beschriebenen Mininet (mn) -Befehl eine Netzwerktopologie, in der insgesamt drei Hosts mit jedem Port eines Switches verbunden sind (in welcher Form ein Computer im Kommunikationsnetzwerk verbunden ist) Kann emuliert werden.

ryu@ryu-vm:~$ sudo mn --topo single,3 --mac --switch ovsk --controller remote -x
*** Creating network
*** Adding controller
Unable to contact the remote controller at 127.0.0.1:6633
*** Adding hosts:
h1 h2 h3
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1) (h3, s1)
*** Configuring hosts
h1 h2 h3
Error starting terms: Cannot connect to display ←
*** Starting controller
*** Starting 1 switches
s1
*** Starting CLI:
mininet>

Mininetの構成.png

Das Lehrbuch sagt "5 xterms werden auf Ihrem Desktop-PC gestartet", aber xterm wird nicht gestartet. Ich erhalte eine Fehlermeldung.

Error starting terms: Cannot connect to display

Ich konnte das nicht lösen (bitte helfen Sie jemandem >>), also habe ich mich ehrlich entschieden, separate Konsolen zu starten und zu betreiben.

Mit ssh eine Verbindung zu Ubuntu herstellen Informationen zum Herstellen einer Verbindung zur VM auf VirtualBox mit Teraterm finden Sie hier.

Machen Sie die von Mininet erstellte Bridge von einer anderen Konsole aus mit OpenFlow 1.3 kompatibel.

sudo ovs-vsctl set Bridge s1 protocols=OpenFlow13

Führen Sie dann den folgenden Befehl aus.

ryu-manager --verbose ryu.app.simple_switch_13

Es stellt eine Verbindung zu OVS her, wie unten gezeigt, ein Handshake wird durchgeführt, ein Table-Miss-Flow-Eintrag wird hinzugefügt und es wartet auf Packet In.

connected socket:<eventlet.greenio.GreenSocket object at 0x26aac50> address:('127.0.0.1', 42601)
hello ev <ryu.controller.ofp_event.EventOFPHello object at 0x26aa750>
move onto config mode
EVENT ofp_event->SimpleSwitch13 EventOFPSwitchFeatures
switch features ev version: 0x4 msg_type 0x6 xid 0x50c38af1 OFPSwitchFeatures(auxiliary_id=0,capabilities=71,datapath_id=1,n_buffers=256,n_tables=254)
move onto main mode

Starten Sie eine weitere Konsole und führen Sie den folgenden Befehl aus: Dieser Befehl ist ein Befehl zum Speichern der Flusstabelle des OpenFlow-Switch s1.

sudo ovs-ofctl -O openflow13 dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x0, duration=287.127s, table=0, n_packets=0, n_bytes=0, priority=0 actions=CONTROLLER:65535

Die in switch_features_handler definierte Flusstabelle (Priorität 0, unbedingt, Aktion CONTROLLER, Übertragungsdatengröße 65535 (0xffff = OFPCML_NO_BUFFER)) wird angegeben.

Bestätigung des Switching Hub-Betriebs

Es ist endlich eine Bestätigung des Betriebs. Pingen Sie von verbundenem Host 1 zu Host 2. Sogar Programmierer sind mit Ping vertraut. Sie verwenden es, um die Kommunikation mit einem anderen Computer im Netzwerk oder einer URL im Internet zu überprüfen. Lassen Sie uns zunächst einen kurzen Blick darauf werfen, was Ping tut. Wenn Sie dies nicht wissen, wissen Sie nicht, wie die Flusstabelle aussehen soll und ob der Inhalt des Speicherauszugs korrekt ist. Beim Pingen von Host 1 zu Host 2 wird die folgende Verarbeitung intern ausgeführt.

Paket Erläuterung
1 ARP request ARP ist ein Protokoll, das eine MAC-Adresse von einer IP-Adresse erhält. Host 1 fragt alle Hosts im selben Netzwerk: "Ich möchte mit dieser IP-Adresse mit dem Host kommunizieren. Bitte teilen Sie mir die MAC-Adresse des Computers mit der IP-Adresse mit." Der Grund für die Anforderung aller Hosts ist, dass Host 1 nicht weiß, mit welchem Port Host 2 verbunden ist.
2 ARP reply Der Host mit derselben IP-Adresse, die die ARP-Anfrage erhalten hat, antwortet "Ich bin hier, die MAC-Adresse ist diese" an Host 1.
3 ICMP echo request Da 2 es Host 1 ermöglicht, die MAC-Adresse von Host 2 zu kennen, sendet er ein ICMP-Paket an Host 2.
4 ICMP echo reply Host 2 kennt die MAC-Adresse von Host 1 und gibt daher ein ICMP-Paket an Host 1 zurück.

Der Austausch zwischen 3 und 4 wird als Ping bezeichnet. Hosts und Server mit IP-Adressen enthalten eine Tabelle, die als ARP-Tabelle bezeichnet wird. Es ähnelt der MAC-Adresstabelle, aber die MAC-Adresstabelle enthält eine Kombination aus "MAC-Adresse und Portnummer", während die ARP-Adresstabelle eine Kombination aus "MAC-Adresse und IP-Adresse" enthält. Host 1 muss die Existenz von Host 2 kennen, um 3 verarbeiten oder ein ICMP-Paket zur Kommunikationsbestätigung senden zu können. Normalerweise werden 1 und 2 ausgeführt, wenn der Host mit dem Netzwerk verbunden ist und die ARP-Tabelle erstellt wird. Wenn also der Ping-Befehl von der Konsole aus ausgeführt wird, werden 3 und 4 sofort ausgeführt.

Sobald Sie das Ping-Verhalten kennen, starten Sie drei Konsolen und führen Sie den Befehl tcpdump aus, damit Sie sehen können, welche Pakete von Host 1 bis Host 3 empfangen wurden. Ich werde. Bitte beachten Sie, dass sich der Hostname auch vom Befehl in der PDF unterscheidet.

Host 1 Konsole

ryu@ryu-vm:~$ sudo tcpdump -en -i s1-eth1
tcpdump: WARNING: s1-eth1: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on s1-eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

Host 2-Konsole

ryu@ryu-vm:~$ sudo tcpdump -en -i s1-eth2
tcpdump: WARNING: s1-eth2: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on s1-eth2, link-type EN10MB (Ethernet), capture size 65535 bytes

Host 3-Konsole

tcpdump: WARNING: s1-eth3: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on s1-eth3, link-type EN10MB (Ethernet), capture size 65535 bytes

Führen Sie nun auf der Konsole, auf der Sie den Befehl mn zum ersten Mal ausgeführt haben, den folgenden Befehl aus, um Host 1 an Host 2 zu pingen.

--- 10.0.0.2 ping statistics --1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 89.463/89.463/89.463/0.000 ms 

Ein Paket wurde ohne Verlust weitergeleitet. Starten Sie eine neue Konsole und geben Sie den Befehl zum Speichern der Flusstabelle für den OpenFlow-Switch s1 erneut ein.

ryu@ryu-vm:~$ sudo  ovs-ofctl -O openflow13 dump-flows s1
OFPST_FLOW reply (OF1.3) (xid=0x2):
 cookie=0x0, duration=110.621s, table=0, n_packets=2, n_bytes=140, priority=1,in_port=2,dl_dst=00:00:00:00:00:01 actions=output:1
 cookie=0x0, duration=110.58s, table=0, n_packets=1, n_bytes=42, priority=1,in_port=1,dl_dst=00:00:00:00:00:02 actions=output:2
 cookie=0x0, duration=2752.545s, table=0, n_packets=3, n_bytes=182, priority=0 actions=CONTROLLER:65535

Zusätzlich zum Table-Miss-Flow-Eintrag wurden zwei Flow-Einträge hinzugefügt.

(1) Eingehender Port (in_port): 2, Ziel-MAC-Adresse (dl_dst): Host 1 → Aktionen: Ausgabe an Port 1 (2) Eingehender Port (in_port): 1, Ziel-MAC-Adresse (dl_dst): Host 2 → Aktionen: Ausgabe an Port 2

Der Eintrag in (1) wird zweimal referenziert (n_packets) und der Eintrag in (2) wird einmal referenziert. Da (1) eine Kommunikation von Host 2 zu Host 1 ist, stimmen die ARP-Antwort (2 in der vorherigen Tabelle) und die ICMP-Echoantwort (4 in der vorherigen Tabelle) überein. (2) ist die Kommunikation von Host 1 zu Host 2 durch die ICMP-Echoanforderung (3 in der obigen Tabelle). Die ARP-Anforderung (1 in der obigen Tabelle) wurde an alle Hosts gesendet und wird nicht gezählt.

Der Inhalt von tcpdump wurde aktualisiert. Überprüfen wir ihn also.

Host 1 Konsole

22:37:49.681949 00:00:00:00:00:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.2 tell 10.0.0.1, length 28
22:37:49.727635 00:00:00:00:00:02 > 00:00:00:00:00:01, ethertype ARP (0x0806), length 42: Reply 10.0.0.2 is-at 00:00:00:00:00:02, length 28
22:37:49.727666 00:00:00:00:00:01 > 00:00:00:00:00:02, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 10.0.0.2: ICMP echo request, id 1907, seq 1, length 64
22:37:49.771373 00:00:00:00:00:02 > 00:00:00:00:00:01, ethertype IPv4 (0x0800), length 98: 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 1907, seq 1, length 64
22:37:54.776004 00:00:00:00:00:02 > 00:00:00:00:00:01, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.1 tell 10.0.0.2, length 28
22:37:54.776045 00:00:00:00:00:01 > 00:00:00:00:00:02, ethertype ARP (0x0806), length 42: Reply 10.0.0.1 is-at 00:00:00:00:00:01, length 28

Die erste Zeile ist eine ARP-Anforderung, die von Host 1 selbst nach Host 2 sucht. Die zweite Zeile ist die ARP-Antwort von Host 2. Die dritte Zeile ist eine ICMP-Echoanforderung von Host 1 selbst an Host 2. Die vierte Zeile ist die ICMP-Echoantwort von Host 2. Die 5. und 6. Zeile entsprechen ARP Request and Reply zum Aktualisieren der ARP-Tabelle.

Host 2-Konsole

22:37:49.684703 00:00:00:00:00:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.2 tell 10.0.0.1, length 28
22:37:49.684727 00:00:00:00:00:02 > 00:00:00:00:00:01, ethertype ARP (0x0806), length 42: Reply 10.0.0.2 is-at 00:00:00:00:00:02, length 28
22:37:49.771102 00:00:00:00:00:01 > 00:00:00:00:00:02, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 10.0.0.2: ICMP echo request, id 1907, seq 1, length 64
22:37:49.771171 00:00:00:00:00:02 > 00:00:00:00:00:01, ethertype IPv4 (0x0800), length 98: 10.0.0.2 > 10.0.0.1: ICMP echo reply, id 1907, seq 1, length 64
22:37:54.774704 00:00:00:00:00:02 > 00:00:00:00:00:01, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.1 tell 10.0.0.2, length 28
22:37:54.777621 00:00:00:00:00:01 > 00:00:00:00:00:02, ethertype ARP (0x0806), length 42: Reply 10.0.0.1 is-at 00:00:00:00:00:01, length 28

Die erste Zeile empfängt die von Host 1 durchgehend gesendete ARP-Anforderung. Die zweite Zeile ist eine ARP-Antwort von Host 2 selbst. Die dritte Zeile ist die ICMP-Echoanforderung, die von Host 1 empfangen wurde. Die vierte Zeile ist eine ICMP-Echoantwort von Host 2 selbst. Die 5. und 6. Zeile entsprechen ARP Request and Reply zum Aktualisieren der ARP-Tabelle.

Host 3-Konsole

22:37:49.684694 00:00:00:00:00:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.0.0.2 tell 10.0.0.1, length 28

Host 3 empfängt nur die ARP-Anfrage, die Host 1 ursprünglich an das Ganze gesendet hat. Es ist nicht an sich selbst gerichtet, reagiert also nicht.

Zusammenfassung

Erledigt! Ich konnte mit OpenFlow einen Switching Hub implementieren ...! !! Bisher habe ich geschrieben, dass in OpenFlow als Option ein logischer Ausgabeport namens NORMAL-Port angegeben wird. Wenn für den Ausgabeport NORMAL angegeben ist, wird das Paket mit der ursprünglichen Funktion des Switching-Hubs verarbeitet Es wird so sein. Mit anderen Worten, Sie können es als Switching-Hub verwenden, indem Sie es einfach anweisen, alle Pakete an den NORMAL-Port auszugeben. Es ist nicht erforderlich, einen Switching Hub zu implementieren. Es genügte jedoch, einige der Funktionen der SDN- und Ryu-Frameworks zu verstehen. Die Einrichtung dieses Switching Hubs entspricht dem Inhalt des vom Ryu-Beamten erstellten E-Books oder Wikis. In Zukunft wird auch die oben erwähnte Implementierungsmethode der Firewall und des Routers beschrieben, und es werden nicht nur die Emulation physischer Geräte, sondern auch die für SDN einzigartigen Vorteile vorgestellt. Zum Beispiel hat Ryu eine REST-Verknüpfungsfunktion und Flusstabellen können von einem externen Programm hinzugefügt / aktualisiert werden, ohne eine Steuerung zu durchlaufen.

Es wurde gesagt, dass SDN die Notwendigkeit von Netzwerktechnikern beseitigt, aber es ist ein Augenöffner. Ich höre auch, dass das Programmieren Teil der Pflichtfächer wird. In diesem Fall wird das Codieren zu einer allgemeinen Ausbildung, und es kann die Zeit kommen, in der Personen, die sich mit Netzwerktechnologie auskennen, Netzwerke auf natürliche Weise mit ihrer eigenen Programmiertechnologie konfigurieren, steuern und verwalten. Als Programmierer hörte ich oft den Begriff "Full Stack Engineer". [IT-Glossar](http://e-words.jp/w/%E3%83%95%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3 % 82% AF% E3% 82% A8% E3% 83% B3% E3% 82% B8% E3% 83% 8B% E3% 82% A2.html) lautet wie folgt.

Zum Beispiel beim Erstellen und Betreiben von Websites und Webdiensten, Beschaffen und Einrichten von Servern und Netzwerken, Erstellen und Programmieren von serverseitigen Softwareumgebungen, Datenbankdesign, Webdesign, clientseitiger Programmierung und HTML/Ingenieure, die über Kenntnisse und Erfahrungen in allen verwandten Bereichen wie der CSS-Codierung verfügen und Websites erstellen, Dienste starten und selbstständig arbeiten können.

Ich habe es nicht bemerkt, als ich nur die Welt der Software kannte, aber der wahre Full-Stack-Ingenieur kann ein dreidimensionaler Ingenieur sein, der die physikalische Schicht der OSI 7-Schicht bis zur Anwendungsschicht sowie die Vorder- und Rückseite der Anwendungsschicht kennt. Abwesend···. Seltsam. Computer und IT-Technologie sollen uns einfacher machen, aber es gibt immer mehr Dinge, an die wir uns erinnern und die wir wissen müssen.

Verweise

Einführung in Präsentationen, Artikel, Webseiten usw., die ich beim Schreiben dieses Artikels als Referenz verwendet habe.

Papier-

SDN-Richtlinie NTT Communications Netzwerk der nächsten Generation, das vom größten Netzbetreiber NTT in Betracht gezogen wird. Die Zukunft wird vorgestellt, in der SDN Administratoren von Netzwerkunternehmern ermöglicht, die Netzwerkkonfiguration (bis zu einem gewissen Grad) nach Belieben zu optimieren.

Präsentation

Neue Netzwerksteuerungstechnologie OpenFlow und deren Verwendung Es sind alte Informationen, aber sie erklären das Konzept von SDN und OpenFLow auf leicht verständliche Weise mit vielen Zahlen. NEC ist ein Unternehmen, das von Anfang an an SDN-Aktivitäten teilgenommen hat.

Openflow-Experiment Zusätzlich zum Betrieb von OpenFlow führen wir ein Verbindungsexperiment mit mehreren Switches durch.

SDN-Betriebsprobleme und Vorteile aus der Perspektive der Entwicklung von SDN-Geräten wie OpenFlow Switch SDN, das viele Vorteile hat, hat auch Herausforderungen. In meinem Artikel wurde es nicht erwähnt. Bitte lesen Sie diese Folie.

SDN neueste Trends und Anwendungsbeispiele Es gibt Verweise auf andere SDN-Protokolle als OpenFlow und andere Frameworks als Ryu. Wenn ich diese Folie lese, scheint es, dass Ryus offizieller Text natürlich nicht alle Merkmale von Ryu erklärt.

[Von Okinawa Open Laboratory gesponsertes 1. praktisches Seminar (RYU, vSwitch)](https://www.okinawaopenlabs.org/wp/wp-content/uploads/%E7%AC%AC1%E5%9B%9E%E3 % 83% 8F% E3% 83% B3% E3% 82% BA% E3% 82% AA% E3% 83% B3% E3% 82% BB% E3% 83% 9F% E3% 83% 8A% E3% 83 % BC.pdf) Praktisches Seminar von NTT Communications, dem Entwickler von Ryu, 2014 in Okinawa. Ich beneide dich.

SDN-Studiengruppe - Aktuelle und Zukunft der SDN-Technologie- Obwohl die Erklärung diesmal weggelassen wird, gibt es in SDN "Hop-by-Hop-Typ" und "Overlay-Typ". Die einfache Methode ist ein Hop-by-Hop-Typ, aber Unternehmen fördern auch einen Overlay-Typ, der die vorhandene Infrastruktur nutzen kann. Diese Folie beschreibt den aktuellen Status von SDN aus Unternehmenssicht.

Artikel im Internet

SDN (1/5), das Sie in 5 Minuten absolut verstehen können Ich kann es in 5 Minuten verstehen (lacht)

Ideal und Realität von SDN: Nachdenken über die praktische Verwendung von SDN im Netzwerkbetrieb Als Fortsetzung des obigen Artikels werden die Ideale und die Realität von SDN erläutert. Das Level ist höher als bei anderen Artikeln.

Ziel für Netzwerktechniker - Was ist SDN? Ein einfacher Artikel erklärt SDN. Wir empfehlen Ihnen, die gesamte Serie zu lesen.

Ryu SDN Framework - Open Source SDN-Plattformsoftware Es scheint ein Interview mit dem Ryu-Entwickler in einer Zeitschrift namens NTT Technology Journal zu sein.

Teilnahme an einem Seminar über OpenFlow-Controller Ryu Eindrücke von Ryus Seminar. Es gibt nicht so viele SDN-Studiensitzungen und es gibt noch weniger Informationen zu Ryu (aber Ryu-Studien im Vergleich zu anderen OpenFlow-Frameworks hinsichtlich der Qualität und Quantität japanischer Dokumente und der einfachen Vorbereitung einer Entwicklungsumgebung. Ich denke es ist einfach). Ich möchte auch an der Lernsitzung teilnehmen.

Tech-Circle #19 SDN_Trema Hands-on Ich habe neulich teilgenommen. Ryu wurde nicht erwähnt, aber es war interessant, wie das für Unternehmen verwendete SDN und das aktuelle SDDC (Software Defined Datacenter, dh die furchtlose Idee, das gesamte Rechenzentrum zu virtualisieren).


SDN-Grundkurs für Programmierer 1: Was ist SDN SDN-Grundkurs für Programmierer 2: OpenFlow-Controller und -Schalter SDN-Grundkurs für Programmierer 3: Versuchen Sie, mit Ryu einen Switching Hub zu erstellen

Recommended Posts

SDN-Grundkurs für Programmierer 3: Erstellen Sie mit Ryu einen Switching Hub
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Versuchen Sie, eine einfache Website mit Responder und sqlite3 zu erstellen
(Für Anfänger) Versuchen Sie, mit Django eine einfache Web-API zu erstellen
Versuchen Sie, mit einer Shell zu programmieren!
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.