P4 est un langage de programmation conçu pour programmer des règles de routage de paquets. Contrairement à un langage à usage général tel que C ou Python, P4 est un langage spécifique au domaine avec un certain nombre de constructions optimisées pour le routage réseau.
P4 est un langage open source sous licence et pris en charge par une organisation à but non lucratif appelée P4 Language Consortium. Il est également soutenu par l'Open Networking Foundation (ONF) et la Linux Foundation (LF), les deux plus grandes organisations faîtières dans les projets de mise en réseau open source.
Le langage a été initialement inventé en 2013 et décrit en 2014 dans un document SIGCOMM CCR intitulé «Protocol Independent, Packet Routing Processor Programming».
Depuis sa création, P4 a connu une croissance exponentielle et a évolué, devenant rapidement la norme pour décrire la transmission de paquets par les périphériques réseau, y compris les adaptateurs réseau, les commutateurs et les routeurs.
«SDN a transformé l'industrie des réseaux et P4 fait passer SDN à un niveau supérieur, offrant une programmabilité dans le domaine du routage», a déclaré Guru Parulkar, directeur exécutif de l'Open Networking Foundation.
Le langage P4 a été créé à l'origine par un groupe d'ingénieurs et de chercheurs de Google, Intel, Microsoft Research, Barefoot, Princeton et Stanford. L'objectif était simple: créer un langage facile à utiliser qu'un développeur de logiciels peut apprendre en une journée et l'utiliser pour décrire avec précision la façon dont les paquets sont envoyés sur le réseau.
Dès le début, P4 a été conçu pour être indépendant de l'objectif (c'est-à-dire qu'un programme écrit en P4 pourrait être compilé tel quel à diverses fins, comme ASIC, FPGA, CPU, NPU et GPU).
De plus, le langage est indépendant du protocole (c'est-à-dire que le programme P4 peut décrire des protocoles standard existants ou peut être utilisé pour indiquer de nouveaux modes d'adressage personnalisés).
Dans l'industrie, P4 est utilisé pour programmer des appareils. Peut-être qu'à l'avenir, les normes Internet-RFC et IEEE incluront également la spécification P4.
P4 peut être utilisé pour les appareils programmables et à fonction fixe. Par exemple, il est utilisé pour enregistrer avec précision le comportement du pipeline de commutateurs dans les API Switch Abstraction Interface (SAI) utilisées par le système d'exploitation de commutateur SONiC open source. P4 est également utilisé dans le projet ONF Stratum pour décrire le comportement de commutation sur une variété d'appareils fixes et programmables.
La première description du comportement du commutateur et des adaptateurs réseau vous permet de créer un modèle exécutable précis de l'ensemble du réseau avant le déploiement. Les grands fournisseurs de cloud peuvent tester et déboguer entièrement le réseau à l'aide d'un logiciel, ce qui réduit considérablement le temps et le coût des tests des interactions de laboratoire sans nécessiter d'équipement coûteux.
À l'aide de P4, les fournisseurs d'équipements réseau peuvent s'appuyer sur un comportement de routage de base commun à tous les produits, ce qui permet la réutilisation de l'infrastructure de test, simplifie le développement de logiciels de gestion et garantit en fin de compte l'interopérabilité.
Bien sûr, P4 peut être utilisé pour écrire des programmes qui décrivent des méthodes de routage complètement nouvelles. Par exemple, P4 est largement utilisé pour la télémétrie et les mesures dans les centres de données, les réseaux d'entreprise et les fournisseurs de services.
La communauté des chercheurs s'est également intensifiée. Plusieurs grands groupes de recherche en technologie de réseau universitaire ont publié de nouvelles applications intéressantes basées sur des programmes P4, notamment l'équilibrage de charge, des protocoles cohérents et la mise en cache des valeurs clés. Un nouveau paradigme de programmation est en cours de création, les innovations passent du matériel au logiciel, ce qui permet à de nombreuses idées inattendues, nouvelles et brillantes d'apparaître.
La communauté de développement a apporté des contributions importantes au développement de code, notamment des compilateurs, des pipelines, des modèles comportementaux, des API, des environnements de test, des applications, etc. Il existe des développeurs dédiés dans des sociétés telles que Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx et ZTE; des universités, y compris BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass et USI; et les projets open source, notamment CORD, FD.io, OpenDaylight, ONOS, OvS, SAI et Stratum, mettent en évidence le fait que P4 est un projet communautaire indépendant.
Génération typique d'un contrôleur P4:
Perspectives d'application
Étant donné que le langage est destiné au routage d'applications, la liste des exigences et des options de conception est différente de celle des langages de programmation à usage général. Les principales caractéristiques du langage sont:
- Indépendance par rapport à la mise en œuvre de l'objectif;
- Indépendance du ou des protocoles utilisés;
- Reconfigurabilité sur le terrain.
Indépendance par rapport à la mise en œuvre cibleLes programmes P4 sont conçus pour être indépendants de l'implémentation, ce qui signifie qu'ils peuvent être compilés pour de nombreux types différents de machines exécutives, telles que les processeurs à usage général, les FPGA, les systèmes sur puce, les processeurs de réseau et les ASIC. Ces différents types de machines sont appelés cibles P4, et un compilateur est requis pour chaque cible pour convertir le code source P4 en modèle de commutateur cible. Le compilateur peut être intégré dans l'appareil cible, un logiciel externe ou même un service cloud. Étant donné que bon nombre des objectifs d'origine des programmes P4 étaient utilisés pour une simple commutation de paquets, vous pouvez souvent entendre le terme «commutateur P4», même si l'utilisation de «P4 cible» est plus correcte.
Indépendance du ou des protocoles utilisésP4 est indépendant du protocole. Cela signifie que la langue n'a pas de prise en charge intégrée pour les protocoles courants tels que IP, Ethernet, TCP, VxLAN ou MPLS. Au lieu de cela, le programmeur P4 décrit les formats d'en-tête et les noms de champ des protocoles requis dans le programme, qui à leur tour sont interprétés et traités par le programme compilé et le périphérique cible.
Reconfigurabilité sur le terrainL'indépendance du protocole et le modèle de langage abstrait permettent une reconfigurabilité - les cibles P4 devraient pouvoir modifier le traitement des paquets après le déploiement du système. Cette fonctionnalité est traditionnellement associée au routage via des processeurs à usage général ou des processeurs de réseau, plutôt que des circuits intégrés à fonctions fixes.
Bien qu'aucun langage ne puisse empêcher l'optimisation d'un certain ensemble de protocoles, ces optimisations sont invisibles pour l'auteur de la langue et peuvent, à terme, réduire la flexibilité du système et du but et leur reconfigurabilité.
Ces caractéristiques de la langue ont été à l'origine posées par ses créateurs avec une orientation vers son utilisation répandue dans l'infrastructure de réseau.
Déjà, la langue est utilisée dans de nombreuses entreprises:
1) Centres de données hyperscales;La société chinoise Tencent est la plus grande société d'investissement au monde et l'une des plus grandes sociétés de capital-risque. Les filiales de Tencent, tant en Chine que dans d'autres pays du monde, se spécialisent dans divers domaines des activités de haute technologie, y compris divers services Internet, les développements dans le domaine de l'intelligence artificielle et du divertissement électronique.
P4 et le routage programmable sont des technologies avancées utilisées dans l'architecture de réseau de l'entreprise.
En tant que créateur, Google est fier de noter l'introduction rapide du P4 dans l'industrie des réseaux et, en particulier, dans le domaine de la conception architecturale des centres de données.
2) sociétés commerciales;Goldman Sachs, profitant de sa collaboration avec la communauté open source et du développement de normes et de solutions communes, apporte déjà l'innovation à l'infrastructure réseau et propose les meilleures solutions aux clients.
3) Production;L'ensemble de l'industrie des réseaux bénéficiera d'un langage comme P4, qui définit de manière unique le comportement de renvoi d'appel. Considérez également dans Cisco, le transfert de leurs gammes de produits pour utiliser cette langue.
Juniper Networks a inclus le Runtime P4 et P4 dans un certain nombre de produits et fournit un accès programmatique au processeur intégré Juniper et à son code de programme.
Ruijie Networks est un partisan actif du P4 et des avantages qu'il apporte aux réseaux. Avec P4, une entreprise peut créer et fournir des solutions de pointe pour un large éventail de clients.
4) Fournisseurs de télécommunications;AT&T a été l'un des premiers partisans de P4, l'un des premiers à utiliser P4 pour déterminer le comportement qu'il voulait voir sur les réseaux et à utiliser des dispositifs de transfert programmables P4 sur son réseau.
Deutsche Telekom utilise le langage pour prototyper les fonctions clés du réseau dans le cadre d'Access 4.0.
5) Industrie des semi-conducteurs;Le langage a permis de mettre en œuvre un nouveau paradigme pour le transfert de capacités logicielles vers le plan de routage réseau par Barefoot.
Xilinx a été l'un des fondateurs de P4.org et a participé activement au développement du langage P4 et l'a implémenté dans des plates-formes programmables FPGA pour les équipements SmartNIC et NFV, libérant l'un des premiers compilateurs P4
16 dans le cadre de la conception SDNet.
6) Logiciel.VMware estime que P4 crée une énergie, une innovation et une communauté formidables qui mènent à une transformation significative et nécessaire du réseau. VMware faisait à l'origine partie de ce mouvement de l'industrie, car une nouvelle vague d'innovation est entraînée par des approches logicielles qui étendent les capacités de l'infrastructure et la mettent en œuvre dans les derniers produits.
Ainsi, P4 est un langage de programmation indépendant du but et du protocole utilisé par l'industrie et la communauté scientifique pour déterminer de manière unique le comportement du routage de paquets en tant que programme, qui, à son tour, peut être compilé à plusieurs fins. Les objectifs actuels incluent les commutateurs matériels et logiciels, les commutateurs d'hyperviseur, les NPU, les GPU, les FPGA, les SmartNIC et les ASIC.
Les principales caractéristiques du langage élargissent considérablement le champ d'application de son application et assurent sa mise en œuvre rapide dans l'architecture de réseau.
Par où commencer
P4 est un projet open source; toutes les informations actuelles sont sur le site
P4.orgLien vers le référentiel
https://github.com/p4lang , où vous pouvez obtenir le code source des exemples et des supports de formation.
Plugin pour Eclipse avec prise en charge P4, mais nous pouvons recommander
P4 Studio de Barefoot.
Analysons les principales abstractions du noyau:
Définition des en -
têtes - avec leur aide, les en-têtes du protocole sont définis.
La définition des en-têtes définit:
- description des formats de package et des noms de champ d'en-tête
- champs autorisés fixes et variables
Par exemple
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;
}
Les analyseurs sont leur tâche pour analyser les en-têtes.
L'exemple d'analyse suivant déterminera la transition de l'état final d'une machine d'un état initial à l'un des deux états finaux:
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;
}
}…
}
Tables - contiennent l'état de la machine associant les clés utilisateur aux actions.
Actions - Une description de la façon dont le package doit être manipulé.
Les tableaux contiennent des états (définis au niveau de la gestion) pour le transfert des paquets, décrivent l'unité d'action de correspondance
La correspondance des paquets est effectuée par:
- Correspondance exacte
- Correspondance la plus longue avec un préfixe (LPM)
- Triple correspondance (masquage)
table ipv4_lpm{
reads {
ipv4.dstAddr: lpm;
} actions {
forward();
}
}
Toutes les actions possibles doivent être définies à l'avance dans les tableaux.
Les actions consistent en du code et des données. Les données arrivent au niveau de la gestion (par exemple, adresses IP / numéros de port). Certaines primitives sans boucle peuvent être spécifiées directement en action, mais le nombre de commandes doit être prévisible. Par conséquent, les actions ne peuvent contenir aucune boucle ni instruction conditionnelle.
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;
}
Modules Match-Action - actions pour créer une clé de recherche, rechercher dans un tableau, effectuer des actions.
Un exemple de module typique est illustré dans la figure:
Flux de contrôle - indique l'ordre d'application des modules Match-Action. Il s'agit d'un programme impératif qui définit la logique de haut niveau et la séquence Match-Action. Le flux de contrôle relie tous les objets, définissant le niveau de contrôle.
Les objets externes sont des objets spécifiques avec une architecture et des API clairement définies. Par exemple, calcul de la somme de contrôle, registres, compteurs, compteurs, etc.
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
}
Les métadonnées sont la structure de données associée à chaque package.
Il existe 2 types de métadonnées:
Métadonnées personnalisées (structure vide pour tous les packages)Vous pouvez mettre tout ce que vous voulez ici
Disponible partout dans le pipeline
pratique pour votre propre usage, par exemple, pour stocker le hachage d'un paquet
Métadonnées internes - fournies par l'architectureLe port d'entrée et le port de sortie sont définis ici
Horodatage de la mise en file d'attente du paquet, profondeur de la file d'attente
hachage de multidiffusion / file d'attente de multidiffusion
Priorité du package, importance du package
Spécification du port de sortie (par exemple, file d'attente de sortie)
Compilateur P4
Le compilateur P4 (P4C) génère:
- Exécution du plan de données
- API pour le contrôle de l'état de la machine dans le plan de données
Un exemple de commutateur logiciel dans P4
Les codes source peuvent être téléchargés à partir du référentiel.
p4lang / p4c-bm: crée une configuration JSON pour bmv2
p4lang / bmv2: un commutateur logiciel qui comprend les configurations JSON de la version bmv2
La figure montre le diagramme de compilation du projet:
Manipulations avec tableaux, lecture de registres, compteur:
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>
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>
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>
Le code source contient le programme simple_switch_CLI pour une utilisation pratique de l'API du commutateur logiciel.
Vous pouvez télécharger cet exemple et d'autres dans le référentiel.
PS Au début de l'été, Intel a signé un accord pour acquérir Barefoot Networks, dans le but de répondre rapidement aux besoins des utilisateurs d'Hyperscale Cloud. Selon Navin Shenoy (vice-président exécutif et directeur général du groupe Data Center chez Intel Corporation) - cela permettra à Intel de fournir des charges de travail plus importantes et plus d'opportunités aux clients des centres de données.
À mon avis, n'oubliez pas qu'Intel est un leader dans la production de puces FPGA et qu'il dispose d'un excellent environnement Quartus. Vous pouvez donc vous attendre à ce qu'avec l'avènement d'Intel, Barefoot élargisse non seulement sa gamme de produits, mais Quartus et P4 Studio recevront également de sérieuses mises à jour et ajouts aux gammes Toffino et Toffino 2.
Le membre officiel de la communauté P4 est
Factor Group .