
P4 är ett programmeringsspråk avsett för programmering av paketroutingregler. Till skillnad från allmänna programmeringsspråk som C eller Python är P4 ett ämnesorienterat språk med ett antal konstruktioner som är optimerade för nätverksrouting.
P4 är ett öppen källkods-språk, licensierat och understött av en ideell organisation som kallas P4 Language Consortium. Det stöds också av Open Networking Foundation (ONF) och Linux Foundation (LF), två av de största paraplyorganisationerna för open-source-projekt inom nätverks teknologi.
Språket utvecklades ursprungligen 2013 och beskrevs 2014 i ett dokument från SIGCOMM CCR med titeln "Protokolloberoende, programmering av paketroutingprocessorer".
Sedan dess har P4 vuxit exponentiellt och utvecklats, snabbt blivit en standard för beskrivning av pakethantering i nätverksenheter, inklusive nätverksadaptrar, switchar och routrar.
“SDN har transformerat nätverksindustrin, och P4 tar SDN till en ny nivå genom att tillhandahålla programmerbarhet inom routing,” sade Guru Parulkar, VD för Open Networking Foundation.
Språket P4 skapades ursprungligen av en grupp ingenjörer och forskare från Google, Intel, Microsoft Research, Barefoot, Princeton och Stanford. Målet var enkelt: skapa ett användarvänligt språk som en mjukvaruutvecklare skulle kunna lära sig på en dag och använda för att noggrant beskriva hur paket hanteras i nätverket.
Från början har P4 utvecklats som ett måloberoende språk (dvs. ett program skrivet i P4 kan kompileras utan förändringar för att köras på olika plattformar som ASIC, FPGA, CPU, NPU och GPU).
Språket är också protokolloberoende (dvs. ett P4-program kan beskriva befintliga standardprotokoll eller användas för att specificera nya anpassade adresseringsmetoder).
Inom industrin används P4 för att programmera enheter. I framtiden kan Internet-RFC och IEEE-standarder också inkludera P4-specifikationen.
P4 kan användas både för programmerbara och för enhetslösningar med fast funktion. Till exempel används det för att noggrant registrera betäckningen av switchens rörledningar i API-gränssnitten för Switch Abstraction Interface (SAI), som används av operativsystemet för switchar med öppen källkod SONiC. P4 används också i ONF Stratum-projektet för att beskriva switchbeteende genom en rad stationära och programmerbara enheter.
Beskrivningen av beteendet hos switchar och nätverksadaptrar möjliggör för första gången att skapa en exakt körbar modell av hela nätverket före distribution. Stora molnleverantörer kan helt testa och felsöka nätverket med hjälp av programvara, vilket betydligt minskar tid och kostnader för testning av interaktioner i labbmiljö, utan att kräva dyr utrustning.
Genom att använda P4 kan nätverksutrustningstillverkare förvänta sig konsekvent beteende för routing i alla produkter, vilket möjliggör återanvändning av testinfrastruktur, förenklar mjukvaruutveckling för styrning och, i slutändan, säkerställer kompatibilitet.
Självklart kan P4 användas för att skriva program som beskriver helt nya sätt att utföra routing. Till exempel används P4 i stor utsträckning för telemetri och mätningar i datacenter, företagsnätverk och serviceleverantörer.
Forskarsamhället har också intensifierat sina insatser. Flera ledande akademiska forskargrupper inom nätverksteknologi har publicerat intressanta nya tillämpningar baserade på P4-program, inklusive lastbalansering, samordnade protokoll och nyckelvärdekassering. En ny programvaruparadigm skapas; innovationer flyttas från hårdvara till mjukvara, vilket möjliggör uppkomsten av en mängd oväntade, nya och geniala idéer.
Utvecklargemenskapen har gjort betydande bidrag till utvecklingen av koden, inklusive kompilatorer, pipeline-program, beteendemodeller, API:er, testmiljöer, applikationer och mycket mer. Hängivna utvecklare finns i företag som Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx och ZTE; från universitet som BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass och USI; och projekt med öppen källkod, inklusive CORD, FD.io, OpenDaylight, ONOS, OvS, SAI och Stratum, betonar faktumet att P4 är ett oberoende samhällsprojekt.
Typisk generation av kontrollanter för P4-språket:

Tillämpningsperspektiv

Eftersom språket är avsett för routingapplikationer, skiljer sig kraven och designalternativen jämfört med allmänna programmeringsspråk. De viktigaste egenskaperna hos språket är:
- Oberoende av målinställning;
- Oberoende av använda protokoll;
- Omkonfigurerbarhet av fält.
Oberoende av målinställning
P4-program utvecklas så att de inte är beroende av implementering, vilket innebär att de kan kompileras för många olika typer av exekveringsmaskiner, såsom allsidiga processorer, FPGA:er, system på chip, nätverksprocessorer och ASIC:er. Dessa olika typer av maskiner kallas P4-mål och för varje mål behövs en kompilator för att omvandla P4-koden till modellen för den avsedda switchen. Kompilatorn kan vara inbyggd i mål-enheten, extern programvara eller till och med en molntjänst. Eftersom många av de ursprungliga målen för P4-program användes för enkel paketväxling är termen "P4-switch" ofta i bruk, även om användningen av "P4-mål" är mer korrekt.
Oberoende av använda protokoll
P4 är oberoende av protokoll. Det innebär att språket inte har inbyggt stöd för vanliga protokoll som IP, Ethernet, TCP, VxLAN eller MPLS. Istället beskriver P4-programmeraren format för headers och fältnamn för de protokoll som behövs i programmet, som i sin tur tolkas och behandlas av den kompilerade programvaran och mål-enheten.
Omkonfigurerbarhet av fält
Oberoende av protokoll och modellen för abstrakt språk möjliggör omkonfigurering — P4:s mål måste ha möjlighet att ändra paketbehandlingen efter att systemet har implementerats. Denna möjlighet är traditionellt kopplad till routning genom allmänna processor eller nätverksprocessorer, inte integrerade kretsar med fasta funktioner.
Även om språket inte har något som skulle hindra optimering av en viss uppsättning protokoll, är dessa optimeringar osynliga för språkets författare och kan i slutändan minska systemets flexibilitet och dess mål och omkonfigurering.
Dessa egenskaper hos språket lades från början in av dess skapare med sikte på dess omfattande användning i nätverksinfrastrukturen.
Språket används redan av många företag:
1) Hyperskalära datacenter;
Det kinesiska företaget Tencent är världens största investeringsföretag och ett av de största riskkapitalföretagen. Dotterbolag till Tencent, både i Kina och i andra länder, specialiserar sig inom olika områden av högteknologisk verksamhet, inklusive olika internettjänster, AI-utveckling och elektroniska underhållning.
P4 och programmerbar routning är avancerade teknologier som används i företagets nätverksarkitektur.
Som en av skaparna är Google stolt över den snabba införandet av P4 inom nätverksindustrin och särskilt inom design av datacenter.
2) Kommersiella företag;
Goldman Sachs, genom att dra nytta av arbetet med öppen källkod och utvecklingen av gemensamma standarder och lösningar, bidrar redan nu med innovationer till nätverksinfrastrukturen och tillhandahåller de bästa lösningarna för kunder.
3) Produktion;
Hela nätverksindustrin kommer att dra nytta av ett språk som P4, som tydligt definierar beteendet för adressering. Cisco anser också detta och övergår sina produktlinjer till att använda detta språk.
Juniper Networks har inkluderat P4 och P4 Runtime i en rad produkter och ger programmatisk tillgång till Junipers inbyggda processor och dess programkod.
Ruijie Networks är en aktiv förespråkare för P4 och dess fördelar för nätverk. Med hjälp av P4 kan företaget skapa och leverera förstklassiga lösningar för en bred kundbas.
4) Telekomoperatörer;
AT&T var en av de första förespråkarna för P4, en av de första som använde P4 för att definiera det beteende de ville se i nätverken och som använde P4-programmerbara omkopplare i sitt nätverk.
I Deutsche Telekom används språket för att prototypa viktiga nätverksfunktioner inom programmet Access 4.0.
5) Halvledarindustrin;
Språket möjliggjorde en ny paradigm som överför mjukvarukapabiliteter till nätverksrouting genom företaget Barefoot.
Xilinx var en av grundarna av P4.org och deltog aktivt i utvecklingen av P4-språket, implementerade det i programmerbara plattformar baserade på FPGA för SmartNIC- och NFV-utrustning, och släppte en av de första P416-kompilatorerna som en del av utformningen av SDNet.
6) Mjukvara.
På VMware tror man att P4 skapar enorm energi, innovation och ett samhälle som leder till betydande och nödvändiga transformationer inom nätverken. VMware var ursprungligen en del av denna branschrörelse, eftersom en ny våg av innovationer drivas av programvaruansatser som utökar infrastruktursmöjligheterna och implementerar det i de senaste produkterna.
Därför är P4 ett mål- och protokolloberoende programmeringsspråk som används av industrin och det vetenskapliga samhället för entydig definition av paketroutingbeteende som ett program, vilket i sin tur kan kompileras för flera mål. Idag inkluderar målen hårdvaru- och programvaruomkopplare, hypervisoromkopplare, NPU, grafikkort, FPGA, SmartNIC och ASIC.
De huvuddrag hos språket utökar avsevärt dess tillämpningsområden och möjliggör en snabb implementering i nätverksarkitekturer.
Komma igång
P4 är ett öppet projekt, all aktuell information finns på webbplatsen
Länk till arkivet , där du kan få källkoder för exempel och utbildningsmaterial.
för Eclipse med P4-stöd, men vi kan rekommendera från företaget Barefoot.

Låt oss gå igenom de grundläggande abstraktionerna i kärnan:
Definition av rubriker — de används för att definiera protokollrubriker.
I definitionen av rubriker anges:
- beskrivningar av paketformat och rubrikfältens namn
- fastställda och variabla tillåtna fält
Till exempel
huvud Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
huvud IPv4_h{
bitversion;
bitihl;
bitdiffserv;
bittotalLen;
bitidentification;
bitflags;
bitfragOffset;
bitttl;
bitprotocol;
bithdrChecksum;
bitsrcAddr;
bitdstAddr;
varbitoptions;
}
Parser — deras uppgift är att analysera rubriker.
Följande exempel på en parser kommer att definiera övergången av maskinens slutliga tillstånd från ett starttillstånd till ett av två slutliga:

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;
}
}…
}
Tabeller — innehåller maskinens tillstånd som kopplar användarnycklar med handlingar. Åtgärder — en beskrivning av hur man ska manipulera paketet.
Tabellerna innehåller tillstånd (definierat på ledningsnivå) för vidarebefordran av paket, beskriver enhetsåtgärden Match-Action.
Pakets matchning utförs baserat på:
- Exakt matchning
- Den längsta matchningen med prefix (LPM)
- Trekorts matchning (maskering)
tabell ipv4_lpm{
läser{
ipv4.dstAddr: lpm;
} åtgärder {
vidarebefordra();
}
}
Alla möjliga åtgärder måste definieras i tabellerna i förväg.
Åtgärder består av kod och data. Data kommer från ledningsnivå (till exempel, IP-adresser / portnummer). Specificerade, null-loopade primitiva åtgärder kan anges direkt inom åtgärden, men antalet kommandon måste vara förutsägbart. Därför kan åtgärder inte innehålla några loopar eller villkorssatser.
åtgärd 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-moduler — åtgärder för att skapa söknycklar, söka i tabellen, utföra åtgärder.
Ett typiskt exempel på en modul visas i figuren:

Kontrollflöde — anger ordningen för tillämpning av Match-Action-moduler. Detta är ett imperativt program som definierar hög nivå logik och sekvens av Match-Action. Kontrollflödet kopplar alla objekt och anger kontrollnivån.
Externa objekt — detta är specifika objekt med tydligt definierad arkitektur och API-gränssnitt. Till exempel kontrollsumma, register, räknare, etc.
extern register{
register(bit size);
void read(out T result, in bit index);
void write(in bit index, in T value);
}
extern Checksum16{
Checksum16(); //konstruktor
void clear(); //förbered enheten för beräkning
void update(in T data); //lägga till data till checksum
void remove(in T data); //ta bort data från befintlig checksum
bitget(); //hämta checksum för den data som lagts till sedan senaste rensning
}
Metadat — datatyper kopplade till varje paket.
Det finns 2 typer av metadata:
Användardefinierade metadata (tom struktur för alla paket)
Du kan lägga vad du vill här
Tillgängligt genom hela pipeline
bekvämt att använda för dina egna syften, till exempel för att lagra paketets hash
Interna metadata — tillhandahålls av arkitekturen
Ingångsport, utgångsport definieras här
Tidsstämpel för när paketet ställdes i kö, ködjup
multicast-hash / multicast-queue
Paketprioritet, paketets betydelse
Specifikation av utgångsport (till exempel utgångskö)
P4-kompilator
P4-kompilator (P4C) genererar:
- Data plane-runtime
- API för att hantera maskinens tillstånd i data plane

Exempel på en programvaruswitch på P4
Källkoder kan laddas ner från repot.
p4lang/p4c-bm: skapar JSON-konfiguration för bmv2
p4lang/bmv2: programvaruswitch som förstår JSON-konfigurationer av bmv2-version
Bild visar kompileringen av projektet:

Manipulationer med tabeller, läsregister, räknare:
- tabell_ställ_upp_standard <table name> <action name> <action parameters>
- lägg till tabell <table name> <action name> <match fields> => <aktion
parameters> [priority] - ta bort tabell <table name> <entry handle>
I källkoderna finns programmet simple_switch_CLI för enkelt användande av API:et för programvaruswitch.
Detta och andra exempel kan laddas ner från repot.

P.S. I början av sommaren undertecknade Intel ett avtal om att förvärva Barefoot Networks, med sikte på att snabbt tillgodose behoven hos användare av Hyperscale Cloud. Som Navin Shenoy (verkställande vice president och general manager för Data Center Group på Intel Corporation) sa – detta kommer att möjliggöra Intel att erbjuda större arbetsbelastningar och fler möjligheter för kunder inom datacenter.
Enligt min personliga åsikt bör man inte glömma att Intel är en ledande tillverkare av FPGA-chip och att de har en utmärkt miljö i Quartus. Det betyder att med Barefoot:s inträde hos Intel kan företagets produktlinje utökas, och både Quartus och P4 Studio förväntas få betydande uppdateringar och en serie som heter Toffino och Toffino 2.
Officiell medlem av P4-gemenskapen – företaget .
Källa: habr.com
