
P4 ist eine Programmiersprache, die für die Programmierung von Regeln zur Paketweiterleitung entwickelt wurde. Im Gegensatz zu allgemeinen Programmiersprachen wie C oder Python ist P4 eine anwendungsbezogene Sprache mit einer Reihe von Konstruktionen, die für die Netzwerkrouting optimiert sind.
P4 ist eine Open-Source-Sprache, die von einer gemeinnützigen Organisation namens P4 Language Consortium lizenziert und unterstützt wird. Sie wird auch von der Open Networking Foundation (ONF) und der Linux Foundation (LF) unterstützt – zwei der größten Dachorganisationen in Open-Source-Projekten im Bereich Netzwerktechnologien.
Die Sprache wurde ursprünglich 2013 erfunden und 2014 in einem Dokument der SIGCOMM CCR mit dem Titel "Protokollunabhängige Programmierung des Paket-Routing-Prozessors" beschrieben.
Seit ihrer Gründung wächst und entwickelt sich P4 exponentiell und wird schnell zum Standard für die Beschreibung der Paketübertragung durch Netzgeräte, einschließlich Netzwerkadapter, Switches und Router.
"SDN hat die Netzwerkbranche transformiert, und P4 hebt SDN auf ein neues Level, indem es Programmierbarkeit im Bereich des Routings 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 von Google, Intel, Microsoft Research, Barefoot, Princeton und Stanford entwickelt. Das Ziel war einfach: eine benutzerfreundliche Sprache zu schaffen, die ein Softwareentwickler an einem Tag lernen kann und die zur genauen Beschreibung dessen verwendet werden kann, wie Pakete im Netzwerk weitergeleitet werden.
Von Anfang an wurde P4 als zielunabhängig entwickelt (d.h. ein auf P4 geschriebenes Programm kann 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. Möglicherweise werden in Zukunft Internet-RFC und IEEE-Standards ebenfalls die P4-Spezifikation beinhalten.
P4 kann sowohl für programmierbare Geräte als auch für Geräte mit fester Funktion verwendet werden. Zum Beispiel wird es verwendet, um das Verhalten von Switch-Pipelines in API-Schnittstellen der Switch-Abstraktionsschnittstelle (SAI) präzise aufzuzeichnen, die von der Open-Source-Switch-Software SONiC verwendet werden. P4 wird auch im ONF Stratum-Projekt eingesetzt, um das Verhalten von Switching über eine Vielzahl von stationären und programmierbaren Geräten zu beschreiben.
Die Beschreibung des Verhaltens von Switches und Netzwerkadaptern ermöglicht es erstmals, ein präzises ausführbares Modell des gesamten Netzwerks vor der Bereitstellung zu erstellen. Große Cloud-Anbieter können das Netzwerk vollständig mit Software testen und debuggen, was die Zeit und Kosten für Labortests der Interoperabilität deutlich reduziert, ohne teure Hardware zu benötigen.
Durch die Verwendung von P4 können Netzwerkgerätehersteller auf ein einheitliches Grundverhalten der Routing in allen Produkten setzen, was die Wiederverwendung der Testinfrastruktur ermöglicht, die Softwareentwicklung für das Management vereinfacht und letztlich die Kompatibilität gewährleistet.
Natürlich kann P4 verwendet werden, um Programme zu schreiben, die völlig neue Methoden des Routings beschreiben. Zum Beispiel wird P4 häufig für Telemetrie und Messungen in Rechenzentren, Unternehmensnetzen und Dienstanbietern eingesetzt.
Die Forschungscommunity hat sich ebenfalls verstärkt. Mehrere führende akademische Forschungsgruppen im Bereich Netzwerktechnologien haben interessante neue Anwendungen auf der Grundlage von P4-Programmen veröffentlicht, darunter Lastenausgleich, konsistente Protokolle und Schlüsselwert-Caching. Eine neue Programmierparadigmen wird geschaffen, Innovationen wandern von der Hardware zur Software, was eine Vielzahl unerwarteter, neuer und genialer Ideen ermöglicht.
Die Community der Entwickler hat einen signifikanten Beitrag zur Entwicklung des Codes geleistet, einschließlich Compiler, Pipeline-Programme, Verhaltensmodelle, API-Schnittstellen, 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; von Universitäten wie BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass und USI; und Projekte mit offenem Quellcode, einschließlich CORD, FD.io, OpenDaylight, ONOS, OvS, SAI und Stratum, unterstreichen die Tatsache, dass P4 ein unabhängiges öffentliches Projekt ist.
Typische Controller-Generierung für die P4-Sprache:

Anwendungsaussichten

Da die Sprache für Routing-Anwendungen konzipiert ist, weicht die Liste der Anforderungen und Designoptionen von Programmiersprachen allgemeiner Art ab. Die Hauptmerkmale der Sprache sind:
- 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 der Implementierung abhängen, d.h. sie können für viele verschiedene Arten von Ausführungsmaschinen kompiliert werden, wie z.B. CPUs, FPGAs, System-on-Chip, Netzwerkprozessoren und ASICs. Diese verschiedenen Maschinentypen sind als P4-Ziele bekannt, und für jedes Ziel wird ein Compiler benötigt, um den Quellcode von P4 in das Modell des Ziel-Switches zu transformieren. Der Compiler kann im Zielgerät, in externer Software oder sogar als Cloud-Service eingebettet sein. Da viele der ursprünglichen Ziele für P4-Programme für einfaches Paket-Switching verwendet wurden, hört man häufig den Begriff „P4-Switch“, auch wenn die Verwendung von „P4-Ziel“ genauer ist.
Unabhängigkeit von den verwendeten Protokollen
P4 ist protokollunabhängig. Das bedeutet, dass die Sprache keine eingebaute Unterstützung für gängige Protokolle wie IP, Ethernet, TCP, VxLAN oder MPLS hat. Stattdessen beschreibt der P4-Programmierer die Headerformate und die Namen der Felder der erforderlichen Protokolle im Programm, die dann von dem kompilierten Programm und dem Zielgerät interpretiert und verarbeitet werden.
Rekonfigurierbarkeit der Felder
Die Unabhängigkeit vom Protokoll und das Modell der abstrakten Sprache erlauben Rekonfigurierbarkeit — die Ziele von P4 sollten in der Lage sein, die Paketverarbeitung nach der Bereitstellung des Systems zu ändern. Diese Möglichkeit ist traditionell mit der Routing über allgemeine Prozessoren oder Netzwerkprozessoren verbunden und nicht mit integrierten Schaltungen mit festen Funktionen.
Obwohl die Sprache nichts enthält, was die Optimierung eines bestimmten Protokolls behindern könnte, sind diese Optimierungen für den Autor der Sprache unsichtbar und können letztendlich die Flexibilität des Systems und seiner Ziele sowie deren Rekonfigurierbarkeit verringern.
Die Eigenschaften der Sprache wurden ursprünglich von ihren Schöpfern mit dem Fokus auf die universelle Nutzung in der Netzwerkinfrastruktur entwickelt.
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 der Welt, sind auf verschiedene Bereiche der High-Tech-Branche spezialisiert, einschließlich verschiedener Internetdienste, Entwicklungen im Bereich künstliche Intelligenz und elektronische Unterhaltungsangebote.
P4 und programmierbares Routing sind fortschrittliche Technologien, die in der Netzwerkarchitektur des Unternehmens verwendet werden.
Als einer der Schöpfer freut sich Google über die schnelle Einführung von P4 in der Netzwerkindustrie und insbesondere im Bereich des Rechenzentrums-Designs.
2) Handelsunternehmen;
Goldman Sachs bringt bereits jetzt durch die Nutzung der Vorteile der Zusammenarbeit mit der Open-Source-Community und der Entwicklung gemeinsamer Standards und Lösungen Innovationen in die Netzwerkstruktur ein und bietet den besten Service für seine Kunden an.
3) Produktion;
Die gesamte Netzwerktechnologie wird von einer Sprache wie P4 profitieren, die das Verhalten der Weiterleitung klar definiert. Dies wird auch von Cisco so gesehen, die ihre Produktlinien auf die Nutzung dieser Sprache umstellen.
Juniper Networks hat P4 und P4 Runtime in eine Reihe von Produkten integriert und ermöglicht den programmatischen Zugriff auf den integrierten Prozessor von Juniper und dessen Programmcode.
Ruijie Networks ist ein aktiver Befürworter von P4 und den Vorteilen, die es Netzwerken bringt. Mit P4 kann das Unternehmen erstklassige Lösungen für eine breite Palette von Kunden entwickeln und bereitstellen.
4) Telekommunikationsanbieter;
AT&T war einer der ersten Befürworter von P4, einer der ersten, die P4 verwendeten, um das Verhalten zu definieren, das sie in Netzwerken sehen wollten, und die P4-fähige programmierbare Weiterleitungsgeräte in ihrem Netzwerk nutzt.
Bei der Deutschen Telekom wird die Sprache verwendet, um Prototypen wichtiger Netzwerkfunktionen im Rahmen des Programms Access 4.0 zu erstellen.
5) Halbleiterindustrie;
Die Sprache ermöglichte es, ein neues Paradigma für die Übertragung von Softwarefähigkeiten in die Routing-Ebene durch das Unternehmen Barefoot umzusetzen.
Xilinx war einer der Gründer von P4.org und war aktiv an der Entwicklung der P4-Sprache beteiligt und hat sie in programmierbare Plattformen auf FPGA-Basis für SmartNIC- und NFV-Geräte integriert, indem einer der ersten P416-Compiler als Teil des Designs SDNet veröffentlicht wurde.
6) Software.
Das Unternehmen VMware ist der Ansicht, dass P4 enorme Energie, Innovationen und eine Gemeinschaft schafft, die zu bedeutenden und notwendigen Transformationen im Netzwerk führen. VMware war von Anfang an Teil dieses Branchenbewegung, da die neue Welle von Innovationen durch softwarebasierte Ansätze ausgelöst wird, die die Infrastrukturfähigkeiten erweitern und sie in die neuesten Produkte umsetzen.
Somit ist P4 eine ziel- und protokollunabhängige Programmiersprache, die von der Industrie und der Wissenschaftsgemeinschaft verwendet wird, um das Verhalten der Paketweiterleitung eindeutig als Programm zu definieren, das wiederum für mehrere Ziele kompiliert werden kann. Zu den heutigen Zielen gehören Hardware- und Software-Switches, Hypervisor-Switches, NPU, GPUs, 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 Quellcodes von Beispielen und Schulungsmaterialien erhalten können.
für Eclipse mit P4-Unterstützung, aber wir können empfehlen von Barefoot.

Lassen Sie uns die wichtigsten Abstraktionen des Kerns betrachten:
Bestimmung der Header — sie bestimmen die Protokoll-Header.
In der Header-Bestimmung wird festgelegt:
- Beschreibung der Paketformate und Header-Feldnamen
- feste und variable zulässige Felder
Zum Beispiel
Kopfzeile Ethernet_h{
BitdstAddr;
BitsrcAddr;
BitetherType;
}
Kopfzeile IPv4_h{
Bit Version;
Bit IHL;
Bit DiffServ;
Bit TotalLen;
Bit Identifikation;
Bit Flags;
Bit FragOffset;
Bit TTL;
Bit Protokoll;
Bit HdrChecksum;
Bit SrcAddr;
Bit DstAddr;
varbit Optionen;
}
Parser — ihre Aufgabe ist es, die Header zu analysieren.
Das folgende Beispiel eines Parsers wird den Übergang des Endzustands einer Maschine von einem Anfangszustand in einen von zwei Endzuständen bestimmen:

parser MeinParser(){
zustand start{übergang parse_ethernet;}
zustand parse_ethernet{
packet.extract(hdr.ethernet);
übergang wählen(hdr.ethernet.etherType){
TYPE_IPV4: parse_ipv4;
standard: akzeptieren;
}
}…
}
Tabellen — enthalten die Zustände der Maschine, die Benutzer-Schlüssel mit Aktionen verknüpfen. Aktionen — Beschreibung, wie mit dem Paket umgegangen werden soll.
Tabellen enthalten Zustände (auf der Management-Ebene definiert), um Pakete weiterzuleiten, und beschreiben die Aktionseinheit Match-Action.
Die Paketübereinstimmung erfolgt nach:
- Exakter Übereinstimmung
- Der längsten Übereinstimmung mit Prefix (LPM)
- Dreifacher Abgleich (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 Management-Ebene (z.B. IP-Adressen / Portnummern). Bestimmte, nicht-zirkuläre Primitiven können direkt in der Aktion definiert werden, aber die Anzahl der Befehle muss vorhersehbar sein. Daher dürfen Aktionen keine Zyklen oder bedingte Operatoren 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 — Aktionen zum Erstellen eines Suchschlüssels, Suchen in der Tabelle, Ausführen von Aktionen.
Ein typisches Beispiel eines Moduls ist in der Abbildung dargestellt:

Kontrollfluss — gibt die Reihenfolge der Anwendung der Match-Action-Module an. Dies ist ein imperatives Programm, das die Logik auf höherer Ebene und die Reihenfolge der Match-Action definiert. Der Kontrollfluss verknüpft alle Objekte und legt die Steuerungsebene fest.
Externe Objekte — sind spezifische Objekte mit klar definierter Architektur und API-Schnittstellen. Zum Beispiel die Berechnung von Prüfziffern, Register, Zähler usw.
extern registrieren{
registrieren(bit größe);
void lesen(out T ergebnis, in bit index);
void schreiben(in bit index, in T wert);
}
extern Prüfziffer16{
Prüfziffer16(); //Konstruktor
void clear(); //Einheit für Berechnung vorbereiten
void update(in T data); //Daten zur Prüfziffer hinzufügen
void remove(in T data); //Daten aus bestehender Prüfziffer entfernen
Bitget(); //Überprüfen Sie die Prüfziffer für die seit dem letzten Löschen hinzugefügten Daten
}
Metadaten — Datens struktur, die mit jedem Paket verknüpft ist.
Es gibt 2 Arten von Metadaten:
Benutzerdefinierte Metadaten (leere Struktur für alle Pakete)
Hier können Sie alles ablegen, was Sie möchten.
Verfügbar über die gesamte Pipeline
nützlich für eigene Zwecke, z.B. zur Speicherung des Paket-Hashes
Interne Metadaten — werden von der Architektur bereitgestellt
Eingangs- und Ausgangsport werden hier festgelegt.
Zeitstempel, wann das Paket in die Warteschlange gestellt wurde, Warteschwentiefe
Multicast-Hash / Multicast-Warteschlange
Paketpriorität, Bedeutung des Pakets
Spezifikation des Ausgangsports (z. B. Ausgabewarteschlange)
P4-Compiler
Der P4-Compiler (P4C) generiert:
- Laufzeit der Datenebene
- API zur Verwaltung des Maschinenstatus in der Datenebene

Beispiel eines Software-Switches in P4
Der Quellcode kann 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
Die Abbildung zeigt das Kompilierungsschema des Projekts:

Manipulationen mit Tabellen, Leseregistern, Zählern:
- Tabelle 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>
Im Quellcode befindet sich das Programm simple_switch_CLI zur bequemen Nutzung der API des Software-Switches.
Dieses und andere 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 Anwender von Hyperscale Cloud schnell zu erfüllen. Laut Navin Shenoy (Executive Vice President und General Manager der Data Center Group bei Intel Corporation) - wird dies Intel erlauben, größere Arbeitslasten und mehr Möglichkeiten für Rechenzentrums-Kunden bereitzustellen.
Meiner persönlich Meinung nach sollte man nicht vergessen, dass Intel ein führender Hersteller von FPGA-Chips ist und über eine hervorragende Quartus-Umgebung verfügt. Daher kann man erwarten, dass mit dem Einstieg von Barefoot in Intel, nicht nur die Produktlinie erweitert wird, sondern auch Quartus und P4 Studio auf ernsthafte Updates und Ergänzungen mit der Reihe Toffino und Toffino 2 warten.
Offizielles Mitglied der P4-Community - Firma .
Quelle: habr.com
