
P4 ist eine Programmiersprache, die speziell für die Programmierung von Paketweiterleitungsregeln entwickelt wurde. Im Gegensatz zu allgemeinen Programmiersprachen wie C oder Python ist P4 eine domänenspezifische Sprache mit mehreren Konstrukten, die für die Netzwerkweiterleitung optimiert sind.
P4 ist eine Open-Source-Sprache, die lizenziert und von einer gemeinnützigen Organisation, dem P4 Language Consortium, unterstützt wird. Zudem wird sie von der Open Networking Foundation (ONF) und der Linux Foundation (LF) – zwei der größten Dachorganisationen in Open-Source-Projekten im Bereich Netzwerktechnologien – unterstützt.
Die Sprache wurde ursprünglich 2013 entwickelt und 2014 in einem Dokument der SIGCOMM CCR mit dem Titel "Protokollunabhängige Programmierung von Paketweiterleitungsprozessoren" veröffentlicht.
Seit ihrer Einführung hat P4 exponentiell an Bedeutung gewonnen und entwickelt sich schnell zum Standard für die Beschreibung der Paketübertragung durch Netzgeräte, einschließlich Netzwerkkarten, Switches und Router.
„SDN hat die Netzwerkindustrie revolutioniert, und P4 hebt SDN auf ein neues Niveau, indem es Programmierbarkeit im Bereich Routing ermöglicht“, sagte Guru Parulkar, Geschäftsführer der Open Networking Foundation.
Die P4-Sprache wurde ursprünglich von einer Gruppe von Ingenieuren und Forschern aus Google, Intel, Microsoft Research, Barefoot, Princeton und Stanford entwickelt. Ziel war es, eine benutzerfreundliche Sprache zu schaffen, die ein Softwareentwickler innerhalb eines Tages erlernen kann, um präzise zu beschreiben, wie Pakete im Netzwerk weitergeleitet werden.
Von Anfang an wurde P4 als zielunabhängig entwickelt (d.h. ein in P4 geschriebenes Programm könnte ohne Änderungen für verschiedene Ziele wie ASIC, FPGA, CPU, NPU und GPU kompiliert werden).
Die Sprache ist auch protokollunabhängig (d.h. ein P4-Programm kann bestehende Standardprotokolle beschreiben oder verwendet werden, um neue anpassbare Adressierungsmodi anzugeben).
In der Industrie wird P4 zur Programmierung von Geräten eingesetzt. Zukünftig könnten auch Internet-RFCs und IEEE-Standards die P4-Spezifikation umfassen.
P4 kann sowohl für programmierbare als auch für Geräte mit festen Funktionen verwendet werden. Zum Beispiel wird es verwendet, um das Verhalten des Switch-Pipe bei API-Schnittstellen der Switch-Abstraktionsschnittstelle (SAI) präzise aufzuzeichnen, die in Open-Source-Switching-Betriebssystemen wie SONiC eingesetzt werden. P4 findet auch Anwendung im ONF Stratum-Projekt zur Beschreibung von Switching-Verhalten über eine Vielzahl stationärer und programmierbarer Geräte.
Die Beschreibung des Verhaltens von Switches und Netzwerkkarten ermöglicht es erstmals, ein genaues ausführbares Modell des gesamten Netzwerks vor der Bereitstellung zu erstellen. Große Cloud-Anbieter können das Netzwerk vollständig mithilfe von Software testen und debuggen, was die Zeit und Kosten für das Testen der Interaktionen im Labor erheblich reduziert, ohne dass teure Hardware erforderlich ist.
Bei der Verwendung von P4 können Netzwerkgeräteanbieter auf ein einheitliches, grundlegendes Routing-Verhalten in allen Produkten rechnen. Dies ermöglicht die Wiederverwendung der Testinfrastruktur, vereinfacht die Softwareentwicklung für das Management und gewährleistet letztendlich die Kompatibilität.
Natürlich kann P4 auch genutzt werden, um Programme zu schreiben, die völlig neue Routing-Methoden beschreiben. P4 findet beispielsweise breite Anwendung in der Telemetrie und Messtechnik in Rechenzentren, Unternehmensnetzwerken und bei Dienstanbietern.
Die Forschungscommunity hat ebenfalls an Schwung gewonnen. Mehrere führende akademische Forschungsgruppen für Netzwerktechnologien haben interessante neue Anwendungen auf der Basis von P4-Programmen veröffentlicht, darunter Lastverteilung, konsistente Protokolle und Schlüsselwert-Caching. Es entsteht eine neue Programmierparadigma, wobei Innovationen von der Hardware in die Software übertragen werden, wodurch eine Vielzahl unerwarteter, neuer und genialer Ideen hervorgebracht wird.
Die Entwicklergemeinschaft hat bedeutende Beiträge zur Codeentwicklung geleistet, einschließlich Compiler, Pipeline-Programme, Verhaltensmodelle, APIs, Testumgebungen, Anwendungen und vieles mehr. Engagierte Entwickler sind in Unternehmen wie Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx und ZTE tätig; aus Universitäten wie BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass und USI; und Projekte mit Open Source, darunter CORD, FD.io, OpenDaylight, ONOS, OvS, SAI und Stratum, betonen die Tatsache, dass P4 ein unabhängiges öffentliches Projekt ist.
Typische Controller-Generierung für die Sprache P4:

Anwendungsperspektiven

Da die Sprache für Routing-Anwendungen gedacht ist, unterscheiden sich die Anforderungen und Designoptionen erheblich von allgemeinen Programmiersprachen. Zu den Hauptmerkmalen der Sprache gehören:
- Unabhängigkeit von der Zielimplementierung;
- Unabhängigkeit von den verwendeten Protokollen;
- Rekonfigurierbarkeit der Felder.
Unabhängigkeit von der Zielimplementierung
P4-Programme werden so entwickelt, dass sie nicht von einer spezifischen Implementierung abhängen, das heißt, sie können für viele verschiedene Typen von Ausführungsmaschinen kompiliert werden, wie zum Beispiel allgemeine Prozessoren, FPGAs, System-on-Chip, Netzwerkprozessoren und ASICs. Diese unterschiedlichen Maschinentypen werden als P4-Ziele bezeichnet, und für jedes Ziel ist ein Compiler erforderlich, um den P4-Quellcode in das Modell eines Ziel-Switches zu transformieren. Der Compiler kann im Zielgerät, in externer Software oder sogar in einem Cloud-Service integriert sein. Da viele der ursprünglichen Ziele für P4-Programme für einfache Paketvermittlung verwendet wurden, wird häufig der Begriff 'P4-Switch' verwendet, obwohl 'P4-Ziel' präziser ist.
Protokollunabhängigkeit
P4 ist unabhängig von Protokollen. Das bedeutet, dass die Sprache keine integrierte Unterstützung für gängige Protokolle wie IP, Ethernet, TCP, VxLAN oder MPLS bietet. Stattdessen beschreibt der P4-Programmierer die Header-Formate und die Feldnamen der benötigten Protokolle im Programm, die wiederum von dem kompilierten Programm und dem Zielgerät interpretiert und verarbeitet werden.
Feld-Rekonfigurierbarkeit
Die Unabhängigkeit von Protokollen und das abstrakte Sprachmodell erlauben eine Rekonfigurierbarkeit – P4-Ziele sollten in der Lage sein, die Verarbeitung von Paketen nach der Bereitstellung des Systems zu ändern. Diese Fähigkeit wird traditionell mit der Routenführung durch allgemeine Prozessoren oder Netzwerkprozessoren und nicht mit integrierten Schaltkreisen mit festen Funktionen in Verbindung gebracht.
Obwohl die Sprache nichts enthält, was eine Optimierung für eine bestimmte Protokollgruppe behindern könnte, sind diese Optimierungen für den Autor der Sprache unsichtbar und können letztendlich die Flexibilität des Systems sowie die Ziele und deren Rekonfigurierbarkeit beeinträchtigen.
Die Eigenschaften dieser Sprache wurden von ihren Entwicklern mit dem Ziel geschaffen, sie in der Netzwerkinfrastruktur weit verbreitet einzusetzen.
Derzeit wird die Sprache in vielen Unternehmen verwendet:
1) Hyperscale-Rechenzentren;
Das chinesische Unternehmen Tencent ist das größte Investmentunternehmen der Welt und eines der größten Venture-Capital-Unternehmen. Die Tochtergesellschaften von Tencent, sowohl in China als auch in anderen Ländern, sind auf verschiedene Bereiche der Hochtechnologiebranche spezialisiert, einschließlich Internetdiensten, Entwicklungen im Bereich Künstliche Intelligenz und elektronischer Unterhaltung.
P4 und programmierbare Routing-Technologien sind fortschrittliche Technologien, die in der Netzwerkarchitektur des Unternehmens eingesetzt werden.
Als einer der Schöpfer ist Google stolz auf die schnelle Einführung von P4 in der Netzwerkindustrie und insbesondere im Bereich des architektonischen Designs von Rechenzentren.
2) Handelsunternehmen;
Goldman Sachs nutzt die Vorteile der Zusammenarbeit mit der Open-Source-Community und der Entwicklung gemeinsamer Standards und Lösungen, um bereits jetzt Innovationen in die Netzwerk-Infrastruktur einzubringen und optimale Lösungen für die Kunden anzubieten.
3) Produktion;
Die gesamte Netzwerkbranche profitiert von einer Sprache wie P4, die das Verhalten der Weiterleitung eindeutig definiert. Dies wird auch von Cisco unterstützt, das seine Produktlinien auf die Verwendung dieser Sprache umstellt.
Juniper Networks hat P4 und P4 Runtime in eine Reihe von Produkten integriert und ermöglicht programmgesteuerten Zugriff auf den integrierten Prozessor von Juniper und dessen Programmcode.
Ruijie Networks ist ein aktiver 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 eine breite Kundenbasis erstellen und bereitstellen.
4) Telekommunikationsanbieter;
AT&T war einer der ersten Unterstützer von P4 und nutzte P4 zunächst, um das gewünschte Verhalten in Netzwerken zu definieren und setzt P4-programmierbare Weiterleitungsgeräte in ihrem Netzwerk ein.
Bei Deutsche Telekom wird die Sprache zur Prototypenentwicklung zentraler Netzwerkfunktionen im Rahmen des Programms Access 4.0 eingesetzt.
5) Halbleiterindustrie;
Die Sprache ermöglichte es Barefoot, ein neues Paradigma für die Übertragung von Softwarefähigkeiten in die Netzwerk-Routing-Ebene zu implementieren.
Xilinx war einer der Gründer von P4.org und hat aktiv an der Entwicklung der P4-Sprache mitgewirkt. Sie haben diese in programmierbaren Plattformen auf Basis von FPGA für SmartNIC- und NFV-Geräte integriert und einen der ersten P416-Compiler als Teil des Designs SDNet veröffentlicht.
6) Software.
Bei VMware glaubt man, dass P4 enorme Energie, Innovationen und Gemeinschaften schafft, die zu bedeutenden und notwendigen Veränderungen im Netzwerk führen. VMware war ursprünglich Teil dieser Branchbewegung, da eine neue Innovationswelle durch softwarebasierte Ansätze ausgelöst wird, die die Infrastruktur erweitern und in den neuesten Produkten implementiert werden.
P4 ist eine plattformunabhängige und protokollunabhängige Programmiersprache, die von der Industrie und der Wissenschaft verwendet wird, um das Verhalten von Paketweiterleitungen eindeutig zu definieren. Dieses Verhalten kann dann als Programm kompiliert werden, das mehrere Ziele unterstützen kann. Zu den heutigen Zielen gehören Hardware- und Software-Switches, Hypervisor-Switches, NPUs, Grafikkarten, FPGAs, SmartNICs und ASICs.
Die Hauptmerkmale der Sprache erweitern erheblich die Anwendungsbereiche und ermöglichen eine schnelle Implementierung in Netzwerkarchitekturen.
Wie man anfängt
P4 ist ein Open-Source-Projekt, alle aktuellen Informationen finden Sie auf der Website
Link zum Repository , wo Sie den Quellcode von Beispielen und Lernmaterialien erhalten können.
für Eclipse mit P4-Unterstützung, aber wir können auch empfehlen von Barefoot.

Lassen Sie uns die grundlegenden Abstraktionen des Kerns untersuchen:
Headerdefinitionen – damit werden die Protokollheader definiert.
In der Headerdefinition wird festgelegt:
- die Beschreibung der Paketformate und die Namen der Headerfelder
- feste und variable erlaubte Felder
Zum Beispiel
Kopfzeile Ethernet_h{
BitdstAddr;
BitsrcAddr;
BitetherType;
}
Kopfzeile IPv4_h{
Bit Version;
Bit IHL;
Bit DiffServ;
Bit GesamtLänge;
Bit Identifikation;
Bit Flags;
Bit FragOffset;
Bit TTL;
Bit Protokoll;
Bit HdrChecksum;
Bit QuellAdresse;
Bit ZielAdresse;
varbit Optionen;
}
Parser — ihre Aufgabe ist es, Header zu analysieren.
Das folgende Beispiel des Parsers definiert den Übergang des Endzustands der Maschine von einem Anfangszustand in einen von zwei Endzuständen:

parser MeinParser(){
zustand start{Übergang parse_ethernet;}
zustand parse_ethernet{
paket. extrahieren(hdr.ethernet);
Übergang auswählen(hdr.ethernet.etherType){
TYP_IPV4: parse_ipv4;
standard: akzeptieren;
}
}…
}
Tabellen — enthalten Zustände der Maschine, die Benutzer-Keys mit Aktionen verknüpfen. Aktionen — Beschreibung, wie mit dem Paket umgegangen werden soll.
Die Tabellen enthalten Zustände (festgelegt auf Managementebene) zur Weiterleitung von Paketen und beschreiben die Aktionseinheit Match-Action.
Die Pakete werden verglichen anhand:
- Genauer Übereinstimmung
- Der längsten Übereinstimmung mit Präfix (LPM)
- Dreifache Übereinstimmung (Maskierung)
Tabelle ipv4_lpm{
liest{
ipv4.dstAddr: lpm;
} Aktionen {
weiterleiten();
}
}
Alle möglichen Aktionen müssen im Voraus in den Tabellen definiert werden.
Aktionen bestehen aus Code und Daten. Die Daten stammen von der Managementebene (z. B. IP-Adressen / Portnummern). Bestimmte, zyklusfreie Primitivfunktionen können direkt in der Aktion angegeben werden, jedoch muss die Anzahl der Befehle vorhersehbar sein. Daher können Aktionen keine Schleifen oder bedingten Anweisungen enthalten.
Aktion 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 — die Aktionen zur Erstellung des Suchschlüssels, zur Suche in der Tabelle und zur Ausführung von Aktionen.
Ein typisches Beispiel für ein Modul ist in der Abbildung dargestellt:

Steuerfluss — gibt die Reihenfolge an, in der die Match-Action-Module angewendet werden. Dies ist ein imperatives Programm, das die Logik auf hoher Ebene und die Reihenfolge der Match-Action definiert. Der Steuerfluss verbindet alle Objekte und bestimmt das Steuerungsniveau.
Externe Objekte — sind spezifische Objekte mit klar definierter Architektur und API-Schnittstellen. Zum Beispiel die Berechnung von Prüfziffern, Register, Zähler usw.
extern register{
register(bit Größe);
void read(out T Ergebnis, in bit Index);
void write(in bit Index, in T Wert);
}
extern Checksum16{
Checksum16(); //Konstruktor
void clear(); //Einheit für Berechnung vorbereiten
void update(in T data); //Daten zur Checksumme hinzufügen
void remove(in T data); //Daten aus bestehender Checksumme entfernen
Bitget(); //Die Checksumme der seit dem letzten Clear hinzugefügten Daten abrufen
}
Metadaten — Datenstrukturen, die mit jedem Paket verbunden sind.
Es gibt 2 Arten von Metadaten:
Benutzerdefinierte Metadaten (leere Struktur für alle Pakete)
Hier können Sie alles einfügen, was Sie möchten.
Verfügbar über den gesamten Pipeline-Verlauf
praktisch für Ihre eigenen Zwecke, z.B. zur Speicherung des Paket-Hashes
Interne Metadaten — werden durch die Architektur bereitgestellt
Eingangs- und Ausgangsport werden hier definiert
Zeitstempel, wann das Paket in die Warteschlange gestellt wurde, Warteschlachtentiefe
Multicast-Hash / Multicast-Warteschlange
Paketpriorität, Paketwichtigkeit
Ausgangsport-Spezifikation (z.B. Ausgabewarteschlange)
P4-Compiler
Der P4-Compiler (P4C) generiert:
- Datenebenenlaufzeit
- API zur Verwaltung des Maschinenstatus in der Datenebene

Beispiel für einen Software-Switch in P4
Die Quellcodes können aus dem Repository heruntergeladen werden.
p4lang/p4c-bm: erstellt eine JSON-Konfiguration für bmv2
p4lang/bmv2: Software-Switch, der JSON-Konfigurationen der Version bmv2 versteht
In der Abbildung ist das Kompilierungsschema des Projekts dargestellt:

Manipulationen mit Tabellen, Lese-Registers, Zählern:
- Tisch als Standard festlegen <table name> <action name> <action parameters>
- tabelle_hinzufügen <table name> <action name> <match fields> => <aktion
parameters> [priority] - Tabelle löschen <table name> <entry handle>
In den Quellcodes ist das Programm simple_switch_CLI enthalten, das die Nutzung der API des Software-Switches erleichtert.
Dieses und weitere Beispiele können Sie im Repository herunterladen.

P.S. Anfang des Sommers hat Intel eine Vereinbarung zum Erwerb von Barefoot Networks unterzeichnet, um die Bedürfnisse der Hyperscale-Cloud-Nutzer schnell zu befriedigen. Wie Navin Shenoy (Executive Vice President und General Manager der Data Center Group bei Intel Corporation) erklärte, wird dies Intel ermöglichen, größere Workloads und mehr Möglichkeiten für Kunden von Rechenzentren bereitzustellen.
Meiner Meinung nach sollte man nicht vergessen, dass Intel der führende Hersteller von FPGA-Chips ist und eine hervorragende Umgebung namens Quartus bietet. Das bedeutet, dass wir erwarten können, dass mit dem Eintritt von Barefoot in Intel nicht nur das Produktportfolio ergänzt wird, sondern auch Quartus und P4 Studio ernsthafte Updates sowie eine Erweiterung mit der Toffino- und Toffino-2-Serie bevorstehen.
Offizielles Mitglied der P4-Community — das Unternehmen .
Quelle: habr.com
