Programmiersprache P4

Programmiersprache P4
P4 ist eine Programmiersprache zum Programmieren von Paket-Routing-Regeln. Im Gegensatz zu einer Allzwecksprache wie C oder Python ist P4 eine domänenspezifische Sprache mit einer Reihe von Designs, die für das Netzwerkrouting optimiert sind.

P4 ist eine Open-Source-Sprache, die von einer gemeinnützigen Organisation namens P4 Language Consortium lizenziert und gepflegt wird. Es wird außerdem von der Open Networking Foundation (ONF) und der Linux Foundation (LF) unterstützt, zwei der größten Dachorganisationen für Open-Source-Netzwerkprojekte.
Die Sprache wurde ursprünglich im Jahr 2013 geprägt und in einem SIGCOMM CCR-Artikel aus dem Jahr 2014 mit dem Titel „Protocol Independent, Packet Routing Processor Programming“ beschrieben.

Seit seiner Einführung ist P4 exponentiell gewachsen und hat sich schnell zu einem Standard für die Beschreibung der Übertragung von Paketen durch Netzwerkgeräte, einschließlich Netzwerkadapter, Switches und Router, entwickelt.

„SDN hat die Netzwerkbranche verändert, und P4 bringt SDN auf die nächste Ebene, indem es Programmierbarkeit in das Routing bringt“, sagte Guru Parulkar, Geschäftsführer der Open Networking Foundation.

Die P4-Sprache wurde ursprünglich von einer Gruppe von Ingenieuren und Forschern von Google, Intel, Microsoft Research, Barefoot, Princeton und Stanford entwickelt. Das Ziel war einfach: eine benutzerfreundliche Sprache zu erstellen, die ein Softwareentwickler an einem Tag erlernen und verwenden kann, um genau zu beschreiben, wie Pakete über Netzwerke gesendet werden.

Von Anfang an war P4 darauf ausgelegt, zielunabhängig zu sein (d. h. ein in P4 geschriebenes Programm konnte unverändert kompiliert werden, um auf einer Vielzahl von Zielen wie ASICs, FPGAs, CPUs, NPUs und GPUs ausgeführt zu werden).

Die Sprache ist außerdem protokollunabhängig (d. h. ein P4-Programm kann bestehende Standardprotokolle beschreiben oder zur Angabe neuer benutzerdefinierter Adressierungsmodi verwendet werden).

In der Industrie wird P4 zur Geräteprogrammierung verwendet. Vielleicht werden Internet-RFC- und IEEE-Standards in Zukunft auch die P4-Spezifikation umfassen.

P4 kann sowohl für programmierbare als auch für Geräte mit fester Funktion verwendet werden. Beispielsweise wird es verwendet, um das Verhalten der Switch-Pipeline in den Switch Abstraction Interface (SAI)-APIs, die vom Open-Source-Switch-Betriebssystem SONiC verwendet werden, genau aufzuzeichnen. P4 wird auch im ONF Stratum-Projekt verwendet, um das Schaltverhalten verschiedener fester und programmierbarer Geräte zu beschreiben.

Durch die Beschreibung des Verhaltens des Switches und der Netzwerkadapter können Sie erstmals vor der Bereitstellung ein genaues ausführbares Modell des gesamten Netzwerks erstellen. Große Cloud-Anbieter können das Netzwerk vollständig mithilfe von Software testen und debuggen, wodurch Zeit und Kosten für Interoperabilitätstests im Labor erheblich reduziert werden, ohne dass teure Hardware erforderlich ist.

Durch den Einsatz von P4 können Netzwerkgeräteanbieter ein gemeinsames zugrunde liegendes Routing-Verhalten für alle Produkte erwarten, was die Wiederverwendung der Testinfrastruktur ermöglicht, die Entwicklung von Verwaltungssoftware vereinfacht und letztendlich die Interoperabilität gewährleistet.

Natürlich lassen sich mit P4 Programme schreiben, die völlig neue Wege des Routings beschreiben. P4 wird beispielsweise häufig für Telemetrie und Messungen in Rechenzentren, Unternehmens- und Dienstanbieternetzwerken verwendet.

Auch die Forschungsgemeinschaft hat sich verstärkt. Mehrere führende akademische Netzwerkforschungsgruppen haben aufregende neue Anwendungen veröffentlicht, die auf P4-Programmen basieren, darunter Lastausgleich, Konsensprotokolle und Schlüsselwert-Caching. Ein neues Programmierparadigma entsteht, Innovation verlagert sich von der Hardware zur Software und lässt viele unerwartete, neue und geniale Ideen entstehen.

Die Entwicklergemeinschaft hat bedeutende Beiträge zur Codeentwicklung geleistet, darunter Compiler, Pipelines, Verhaltensmodelle, APIs, Test-Frameworks, Anwendungen und mehr. Unternehmen wie Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx und ZTE haben engagierte Entwickler; von Universitäten wie BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass und USI; und Open-Source-Projekte wie CORD, FD.io, OpenDaylight, ONOS, OvS, SAI und Stratum unterstreichen die Tatsache, dass P4 ein unabhängiges Community-Projekt ist.

Typische Controller-Generation für die P4-Sprache:

Programmiersprache P4

Anwendungsaussichten

Programmiersprache P4
Da die Sprache für Routing-Anwendungen gedacht ist, unterscheidet sich die Liste der Anforderungen und Gestaltungsmöglichkeiten im Vergleich zu universellen Programmiersprachen. Die Hauptmerkmale der Sprache sind:

  1. Unabhängigkeit von der Zielumsetzung;
  2. Unabhängigkeit des/der verwendeten Protokoll(e);
  3. Rekonfigurierbarkeit vor Ort.

Unabhängigkeit von der Zielumsetzung

P4-Programme sind so konzipiert, dass sie unabhängig von der Implementierung sind, was bedeutet, dass sie für viele verschiedene Arten von Ausführungs-Engines kompiliert werden können, wie z. B. Allzweckprozessoren, FPGAs, System-on-Chips, Netzwerkprozessoren und ASICs. Diese verschiedenen Maschinentypen werden als P4-Ziele bezeichnet und jedes Ziel erfordert einen Compiler, um den P4-Quellcode in ein Ziel-Switch-Modell zu konvertieren. Der Compiler kann in das Zielgerät, in externe Software oder sogar in einen Cloud-Dienst integriert sein. Da viele der ursprünglichen Ziele für P4-Programme auf einfache Paketvermittlung abzielten, hört man häufig den Begriff „P4-Switch“, auch wenn „P4-Ziel“ genauer ist.

Unabhängigkeit des/der verwendeten Protokoll(e).

P4 ist protokollunabhängig. Dies bedeutet, dass die Sprache keine native Unterstützung für gängige Protokolle wie IP, Ethernet, TCP, VxLAN oder MPLS bietet. Stattdessen beschreibt der P4-Programmierer die Headerformate und Feldnamen der erforderlichen Protokolle im Programm, die wiederum vom kompilierten Programm und dem Zielgerät interpretiert und verarbeitet werden.

Rekonfigurierbarkeit vor Ort

Die Protokollunabhängigkeit und das abstrakte Sprachmodell ermöglichen eine Rekonfigurierbarkeit – P4-Ziele sollten in der Lage sein, die Paketverarbeitung nach der Bereitstellung des Systems zu ändern. Diese Fähigkeit wurde traditionell eher mit der Weiterleitung über Allzweckprozessoren oder Netzwerkprozessoren als über integrierte Schaltkreise mit fester Funktion in Verbindung gebracht.

Obwohl es in der Sprache nichts gibt, was einer Optimierung der Leistung eines bestimmten Satzes von Protokollen entgegenstehen würde, sind diese Optimierungen für den Autor der Sprache unsichtbar und können letztendlich die Flexibilität des Systems und der Ziele sowie deren Rekonfigurierbarkeit verringern.

Diese Merkmale der Sprache wurden ursprünglich von ihren Schöpfern mit dem Schwerpunkt auf ihre weit verbreitete Verwendung in der Netzwerkinfrastruktur festgelegt.

Die Sprache wird bereits in vielen Unternehmen verwendet:

1) Hyperscale-Rechenzentren;

Das chinesische Unternehmen Tencent ist die größte Investmentgesellschaft der Welt und eine der größten Risikokapitalgesellschaften. Die Tochtergesellschaften von Tencent, sowohl in China als auch in anderen Ländern auf der ganzen Welt, sind auf verschiedene Bereiche des High-Tech-Geschäfts spezialisiert, darunter verschiedene Internetdienste, Entwicklungen im Bereich künstlicher Intelligenz und elektronische Unterhaltung.

P4 und programmierbares Routing sind fortschrittliche Technologien, die in der Netzwerkarchitektur des Unternehmens eingesetzt werden.

Als einer der Urheber ist Google stolz darauf, die schnelle Einführung von P4 in der Netzwerkbranche und insbesondere im Architekturdesign von Rechenzentren zu verzeichnen.

2) Handelsunternehmen;

Goldman Sachs nutzt die Zusammenarbeit mit der Open-Source-Community und die Entwicklung gemeinsamer Standards und Lösungen, um die Netzwerkinfrastruktur zu erneuern und bessere Lösungen für Kunden bereitzustellen.

3) Produktion;

Die gesamte Netzwerkbranche würde von einer Sprache wie P4 profitieren, die das Weiterleitungsverhalten eindeutig definiert. Cisco glaubt auch daran, seine Produktlinien auf die Verwendung dieser Sprache zu übertragen.

Juniper Networks hat P4 und P4 Runtime in eine Reihe von Produkten integriert und bietet programmgesteuerten Zugriff auf den eingebetteten Juniper-Prozessor und seinen Softwarecode.

Ruijie Networks ist ein starker Befürworter von P4 und den Vorteilen, die es für Netzwerke mit sich bringt. Mit P4 kann das Unternehmen erstklassige Lösungen für ein breites Kundenspektrum entwickeln und liefern.

4) Telekommunikationsanbieter;

AT&T war ein früher Anwender von P4, einer der ersten, der P4 zur Definition des gewünschten Verhaltens in seinen Netzwerken nutzte und programmierbare P4-Weiterleitungsgeräte in seinem Netzwerk verwendete.

Bei der Deutschen Telekom wird die Sprache im Rahmen des Access 4.0-Programms zur Prototypisierung wichtiger Netzwerkfunktionen eingesetzt.

5) Halbleiterindustrie;

Die Sprache ermöglichte es Barefoot, ein neues Paradigma für die Bereitstellung von Softwarefunktionen auf der Netzwerk-Routing-Ebene zu implementieren.

Xilinx war einer der Gründer von P4.org und war aktiv an der Entwicklung der P4-Sprache beteiligt und implementierte sie in FPGA-basierte programmierbare Plattformen für SmartNIC- und NFV-Hardware und veröffentlichte einen der ersten P416-Compiler als Teil des SDNet-Designs.

6) Software.

VMware ist davon überzeugt, dass P4 enorme Energie, Innovation und Gemeinschaft schafft, die eine sinnvolle und notwendige Transformation im Netzwerk vorantreiben. VMware war von Anfang an Teil dieser Branchenbewegung, da eine neue Innovationswelle durch softwarebasierte Ansätze vorangetrieben wird, die die Infrastrukturfunktionen erweitern und in die neuesten Produkte implementieren.

Somit ist P4 eine ziel- und protokollunabhängige Programmiersprache, die von Industrie und Wissenschaft verwendet wird, um das Paket-Routing-Verhalten als Programm eindeutig zu definieren, das wiederum für mehrere Ziele kompiliert werden kann. Zu den Zielen gehören heute Hardware- und Software-Switches, Hypervisor-Switches, NPUs, GPUs, FPGAs, SmartNICs und ASICs.

Die Hauptmerkmale der Sprache erweitern den Anwendungsbereich erheblich und gewährleisten eine schnelle Implementierung in Netzwerkarchitekturen.

Wo anfangen

P4 ist ein offenes Projekt, alle relevanten Informationen finden Sie auf der Website P4.org

Repository-Link https://github.com/p4lang, wo Sie Beispielquellcode und Tutorials erhalten.

Plugin für Eclipse mit P4-Unterstützung, können wir aber empfehlen P4 Studio von Barfuß.

Programmiersprache P4

Schauen wir uns die Hauptabstraktionen des Kernels an:

Header definieren — Mit ihrer Hilfe werden Protokollheader ermittelt.

Die Header-Definition gibt Folgendes an:

  • Beschreibung der Paketformate und Header-Feldnamen
  • feste und variable zulässige Felder

Beispielsweise

header Ethernet_h{
    bit<48>  dstAddr;
    bit<48>  srcAddr;
    bit<16>  etherType;
}

header IPv4_h{
    bit<4>  version;
    bit<4>  ihl;
    bit<8>  diffserv;
    bit<16>  totalLen;
    bit<16>  identification;
    bit<3>  flags;
    bit<13>  fragOffset;
    bit<8>  ttl;
    bit<8>  protocol;
    bit<16>  hdrChecksum;
    bit<32>  srcAddr;
    bit<32>  dstAddr;
    varbit<320>  options;
}

Parser — Ihre Aufgabe ist es, die Schlagzeilen zu analysieren.

Das folgende Parser-Beispiel bestimmt den Übergang des Endzustands der Maschine von einem Anfangszustand in einen von zwei Endzuständen:

Programmiersprache P4

parser MyParser(){
 state  start{transition parse_ethernet;}
 state  parse_ethernet{
    packet.extract(hdr.ethernet);
    transition select(hdr.ethernet.etherType){
        TYPE_IPV4: parse_ipv4;
        default: accept;
        }
    }…
}

Tabellen – enthalten Maschinenzustände, die Benutzertasten mit Aktionen verknüpfen. Aktionen — eine Beschreibung, wie das Paket manipuliert werden sollte.

Die Tabellen enthalten Zustände (definiert auf Managementebene) für die Paketweiterleitung, beschreiben die Match-Action-Einheit

Pakete werden abgeglichen von:

  • Genaue Übereinstimmung
  • Längste Präfixübereinstimmung (LPM)
  • Dreifaches Matching (Maskierung)

table ipv4_lpm{
    reads{
        ipv4.dstAddr: lpm;
    } actions {
        forward();
    }
}

Alle möglichen Aktionen müssen vorab in Tabellen definiert werden.

Aktionen bestehen aus Code und Daten. Die Daten stammen aus der Managementebene (z. B. IP-Adressen/Portnummern). Bestimmte schleifenfreie Grundelemente können direkt in der Aktion angegeben werden, die Anzahl der Anweisungen muss jedoch vorhersehbar sein. Daher dürfen Aktionen keine Schleifen oder bedingten Anweisungen enthalten.

action ipv4_forward(macAddr_t dstAddr, egressSpec_t port){
    standard_metadata.egress_spec = port;
    hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
    hdr.ethernet.dstAddr = dstAddr;
    hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}

Match-Action-Module — Aktionen zum Erstellen eines Suchschlüssels, zum Durchsuchen einer Tabelle und zum Ausführen von Aktionen.

Ein typisches Beispiel für ein Modul ist in der Abbildung dargestellt:

Programmiersprache P4

Kontrollfluss – gibt die Reihenfolge an, in der Match-Action-Module verwendet werden. Dies ist ein zwingendes Programm, das die High-Level-Logik und die Match-Action-Sequenz definiert. Der Kontrollfluss verbindet alle Objekte, indem er die Kontrollebene definiert.

Externe Objekte sind spezifische Objekte mit klar definierter Architektur und API-Schnittstellen. Zum Beispiel Prüfsummenberechnung, Register, Zähler, Zähler usw.

extern register{
    register(bit<32> size);
    void read(out T result, in bit<32> index);
    void write(in bit<32> index, in T value);
}

extern Checksum16{
  Checksum16();    //constructor
  void clear();    //prepare unit for computation
  void update(in T data);    //add data to checksum
  void remove(in T data);  /remove data from existing checksum
  bit<16> get(); //get the checksum for the data added since last clear
}

Metadaten – Datenstrukturen, die jedem Paket zugeordnet sind.

Es gibt zwei Arten von Metadaten:

  Benutzerdefinierte Metadaten (leere Struktur für alle Pakete)
    Sie können hier alles einfügen, was Sie möchten
    Verfügbar in der gesamten Pipeline
    Praktisch für die Verwendung für eigene Zwecke, beispielsweise zum Speichern eines Paket-Hashs

  Interne Metadaten – bereitgestellt von der Architektur
    Eingabe-Port und Ausgabe-Port werden hier definiert
    Zeitstempel, wann das Paket in die Warteschlange gestellt wurde, Warteschlangentiefe
    Multicast-Hash / Multicast-Warteschlange
    Paketpriorität, Paketwichtigkeit
    Spezifikation des Ausgabeports (z. B. Ausgabewarteschlange)

P4-Compiler

Der P4-Compiler (P4C) generiert:

  1. Laufzeit der Datenebene
  2. API zum Verwalten des Maschinenstatus auf der Datenebene

Programmiersprache P4

Beispiel für einen Software-Switch in P4-Sprache

Quellcodes können aus dem Repository heruntergeladen werden.

p4lang/p4c-bm: Erstellt eine JSON-Konfiguration für bmv2
p4lang/bmv2: ein Software-Switch, der JSON-Konfigurationen der bmv2-Version versteht

Die Abbildung zeigt das Projektkompilierungsdiagramm:

Programmiersprache P4

Manipulationen mit Tabellen, Leseregistern, Zählern:

  • table_set_default <table name> <action name> <action parameters>
  • table_add <table name> <action name> <match fields> => <action
    parameters> [priority]
  • table_delete <table name> <entry handle>


Der Quellcode enthält das Programm simple_switch_CLI zur komfortablen Nutzung der Software-Switch-API.

Sie können dieses und andere Beispiele aus dem Repository herunterladen.

Programmiersprache P4

PS Anfang des Sommers unterzeichnete Intel eine Vereinbarung zur Übernahme von Barefoot Networks, um schnell auf die Bedürfnisse von Hyperscale-Cloud-Benutzern eingehen zu können. Wie Navin Shenoy (Executive Vice President und General Manager der Data Center Group der Intel Corporation) sagte, wird Intel dadurch größere Arbeitslasten und mehr Möglichkeiten für Rechenzentrumskunden bereitstellen können.

Meiner persönlichen Meinung nach sollten wir nicht vergessen, dass Intel führend in der Produktion von FPGA-Chips ist und über eine hervorragende Quartus-Umgebung verfügt. Das bedeutet, dass wir davon ausgehen können, dass Barefoot mit der Ankunft von Intel nicht nur seine Produktlinie erweitern wird, sondern auch Quartus und P4 Studio ernsthafte Updates und Ergänzungen der Toffino- und Toffino 2-Reihe erhalten werden.

Offizielles Mitglied der P4-Community – Unternehmen Faktorgruppe.

Source: habr.com

Kommentar hinzufügen