
P4 ir programmēšanas valoda, kas paredzēta paketes maršrutēšanas noteikumu programmēšanai. Atšķirībā no vispārējas lietošanas valodām, piemēram, C vai Python, P4 ir priekšmetam orientēta valoda ar virkni konstrukciju, kas optimizētas tīkla maršrutēšanai.
P4 ir atvērtā koda valoda, kas licencēta un atbalstīta no bezpeļņas organizācijas, ko sauc par P4 Language Consortium. To arī atbalsta Open Networking Foundation (ONF) un Linux Foundation (LF) — divas lielākās umbrelām organizācijas atvērtā koda tīkla tehnoloģiju projektos.
Valoda tika sākotnēji izstrādāta 2013. gadā un aprakstīta 2014. gadā SIGCOMM CCR dokumentā ar nosaukumu "Protokolu neatkarīga paketes maršrutēšanas procesora programmēšana."
Kopš tā izveides P4 eksponenciāli aug un attīstās, ātri kļūstot par standarizēta paketes apraksta formātu tīkla ierīcēm, ieskaitot tīkla adapterus, slēgšanas ierīces un maršrutētājus.
"SDN ir pārveidojis tīkla industriju, bet P4 paceļ SDN jaunā līmenī, nodrošinot programmējamību maršrutēšanas jomā," sacīja Gūru Parulkars, Open Networking Foundation izpilddirektors.
P4 valodu sākotnēji izstrādāja inženieru un pētnieku grupa no Google, Intel, Microsoft Research, Barefoot, Princeton un Stanford. Mērķis bija vienkāršs: izveidot viegli lietojamu valodu, ko programmatūras izstrādātājs varētu apgūt dienas laikā un izmantot, lai precīzi aprakstītu, kā paketes tiek pārsūtītas tīklā.
No paša sākuma P4 tika izstrādāta kā mērķim neatkarīga (t.i., programma, kas uzrakstīta P4, var tikt kompilēta bez izmaiņām dažādām platformām, piemēram, ASIC, FPGA, CPU, NPU un GPU).
Valoda ir arī protokolu neatkarīga (t.i., P4 programma var aprakstīt esošos standarta protokolus vai izmantot jaunus pielāgojamus adresēšanas režīmus).
Rūpniecībā P4 tiek pielietots ierīču programmēšanā. Nākotnē varētu būt, ka Internet-RFC un IEEE standarti arī iekļaus P4 specifikāciju.
P4 var izmantot gan programmējamiem, gan fiksētas funkcijas ierīcēm. Piemēram, to izmanto, lai precīzi ierakstītu pārslēgšanas uzvedību saskarnes abstrakcijas interfeisos (SAI), ko izmanto atvērtā koda slēdzēja OS SONiC. P4 tiek izmantots arī ONF Stratum projektā, lai aprakstītu slēgšanas uzvedību caur daudziem stacionāriem un programmējamiem ierīcēm.
Slēgšanas un tīkla adapteru uzvedības apraksts pirmo reizi ļauj izveidot precīzu izpildāmo tīkla modeli pirms tā izvietošanas. Lieli mākoņu pakalpojumu sniedzēji var pilnībā pārbaudīt un atkļūdzināt tīklu, izmantojot programmatūru, ievērojami samazinot laiku un izmaksas par interakcijas testēšanu laboratorijā, neiegādājoties dārgu aprīkojumu.
Izmantojot P4, tīklu iekārtu piegādātāji var paļauties uz kopējo pamata maršrutēšanas uzvedību visos produktos, kas ļauj atkārtoti izmantot testēšanas infrastruktūru, vienkāršo programmatūras attīstību un galu galā nodrošina savietojamību.
Protams, P4 var izmantot, lai rakstītu programmas, kas apraksta pilnīgi jaunus maršrutēšanas veidus. Piemēram, P4 tiek plaši izmantots telemetrijai un mērījumiem datu centros, uzņēmumu tīklos un pakalpojumu sniedzēju tīklos.
Pētniecības kopiena arī ir aktivizējusies. Daudzas vadošās akadēmiskās pētniecības grupas tīklu tehnoloģijās ir publicējušas interesantas jaunas lietojumprogrammas, pamatojoties uz P4 programmām, tostarp slodzes sadalīšanu, saskaņotus protokolus un atslēgas vērtību kešatmiņu. Tiek radīta jauna programmēšanas paradigma, inovatīvi risinājumi tiek pārvietoti no aparatūras uz programmatūru, ļaujot rasties daudzām negaidītām, jaunām un ģeniālām idejām.
Izstrādātāju kopiena ir ievērojami ieguldījusi koda izstrādē, tostarp kompilatoros, caurvju programmās, uzvedības modeļos, API saskarnēs, testēšanas vidēs, lietojumprogrammās un daudz kas cits. Pievienošanās ir no tādām kompānijām kā Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx un ZTE; universitātēm, tostarp BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass un USI; un atvērtā koda projektiem, tostarp CORD, FD.io, OpenDaylight, ONOS, OvS, SAI un Stratum, uzsverot to, ka P4 ir neatkarīgs sabiedrisks projekts.
Tipisks P4 valodas kontrolieru ģenerators:

Pielietošanas perspektīvas

Tā kā valoda paredzēta maršrutēšanas lietojumprogrammām, prasību un dizaina opciju saraksts atšķiras salīdzinājumā ar vispārējo mērķi programmēšanas valodām. Valodas galvenās iezīmes ir:
- Neatkarība no mērķa realizācijas;
- Neatkarība no izmantotā protokola(-iem);
- Lauku rekonfigurējamība.
Neatkarība no mērķa realizācijas
P4 programmas tiek izstrādātas tā, lai tās nebūtu atkarīgas no realizācijas, tas ir, tās var tikt kompilētas dažāda veida izpildes mašīnām, piemēram, vispārējiem procesoriem, FPGA, sistēmām uz čipa, tīkla procesoriem un ASIC. Šie dažādie mašīnu veidi ir pazīstami kā P4 mērķi, un katram mērķim nepieciešams kompilators, lai pārvērstu P4 avota kodu mērķa slēdža modelī. Kompilators var būt iebūvēts mērķa ierīcē, ārējā programmatūrā vai pat mākoņu pakalpojumā. Tā kā daudzi sākotnējie mērķi P4 programmām tika izmantoti vienkāršai paketu slēgšanai, bieži var dzirdēt terminu "P4 slēdzis", pat ja "P4 mērķis" ir precīzāk.
Neatkarība no izmantotā protokola(-iem)
P4 ir neatkarīgs no protokoliem. Tas nozīmē, ka valodai nav iebūvētas atbalsta populāriem protokoliem, piemēram, IP, Ethernet, TCP, VxLAN vai MPLS. Tā vietā P4 programmētājs apraksta nepieciešamo protokolu galvenes formātus un lauku nosaukumus programmā, kurus savukārt interpretē un apstrādā kompilētā programma un mērķa ierīce.
Lauku rekonfigurējamība
Neatkarība no protokola un abstraktās valodas modelis ļauj pārkonfigurējamību - P4 mērķiem jābūt spējīgiem mainīt paketu apstrādi pēc sistēmas izvietošanas. Šī iespēja tradicionāli ir saistīta ar maršrutēšanu, izmantojot vispārējas lietošanas procesorus vai tīkla procesorus, nevis integrētās shēmas ar fiksētām funkcijām.
Lai gan valodā nav nekas, kas traucētu optimizēt noteiktā protokolu kopu darbību, šīs optimizācijas ir neredzamas valodas autoram un, galu galā, var samazināt sistēmas elastību un mērķus un to pārkonfigurējamību.
Šīs valodas īpašības sākotnēji tika ieviestas tās radītāju ar mērķi plaši izmantot to tīkla infrastruktūrā.
Jau tagad valodu izmanto daudzās kompānijās:
1) Hipermēroga datu centri;
Ķīnas uzņēmums Tencent ir lielākā ieguldījumu kompānija pasaulē un viena no lielākajām riska ieguldījumu kompānijām. Tencent meitasuzņēmumi gan Ķīnā, gan citās pasaules valstīs specializējas dažādās augsto tehnoloģiju jomās, tostarp dažādos interneta pakalpojumos, mākslīgā intelekta izstrādē un elektroniskajās izklaidēs.
P4 un programmējama maršrutēšana ir modernās tehnoloģijas, kas tiek izmantotas uzņēmuma tīkla arhitektūrā.
Būdams viens no radītājiem, Google ar lepnumu uzsver P4 ātro ieviešanu tīkla industrijā un, jo īpaši, datu centru arhitektūras projektēšanā.
2) Komerciālas kompānijas;
Goldman Sachs, izmantojot priekšrocības, ko sniedz atvērtā koda kopienas sadarbība un kopīgu standartu un risinājumu izstrāde, jau tagad rada inovācijas tīkla infrastruktūrā, piedāvājot labākos risinājumus klientiem.
3) Ražošana;
Visa tīkla industrija gūs labumu no tādas valodas kā P4, kas viennozīmīgi nosaka pāradresācijas uzvedību. To uzskata arī Cisco, pārvietojot savu produktu līnijas uz šīs valodas izmantošanu.
Juniper Networks ir iekļāvis P4 un P4 Runtime vairākos produktos, nodrošinot programmatūras piekļuvi Juniper iebūvētajam procesoram un tā programmatūras kodam.
Ruijie Networks ir aktīvs P4 atbalstītājs un tā sniegtajiem ieguvumiem tīkliem. Izmantojot P4, uzņēmums var izstrādāt un piedāvāt labākos savā klasē risinājumus plašam klientu lokam.
4) Telekomunikāciju pakalpojumu sniedzēji;
AT&T bija viens no pirmajiem P4 atbalstītājiem, viens no pirmajiem, kas izmantoja P4, lai noteiktu uzvedību, kādu vēlējās redzēt tīklos, un izmanto P4 programmējamos pāradresēšanas ierīces savā tīklā.
Deutsche Telekom izmanto valodu, lai izstrādātu būtisko tīkla funkciju prototipus programmas Access 4.0 ietvaros.
5) Pusvadītāju rūpniecība;
Valoda ļāva īstenot jaunu programmatūras iespēju pārejas paradigmu tīklu maršrutēšanā, ko izstrādāja Barefoot.
Xilinx bija viens no P4.org dibinātājiem un aktīvi piedalījās P4 valodas izstrādē, īstenojot to programmējamās FPGA platformās SmartNIC un NFV aprīkojumam, izlaidet vienu no pirmajiem P416 kompilatoriem kā daļu no SDNet dizaina.
6) Programmatūra.
VMware uzskata, ka P4 rada milzīgu enerģiju, inovācijas un kopienu, kas nov leads līdz nozīmīgām un nepieciešamām pārmaiņām tīklā. VMware sākotnēji bija daļa no šī nozares kustības, jo jauna inovāciju viļņa izraisīja programmatūras pieejas, kas paplašina infrastruktūras iespējas un īsteno to jaunākajos produktos.
Tādējādi P4 ir mērķus un protokola neatkarīga programmēšanas valoda, ko izmanto rūpniecība un zinātniskā kopiena, lai viennozīmīgi definētu paketes maršrutēšanas uzvedību kā programmu, kuru Savukārt var sasaistīt vairākām mērķiem. Šodien mērķi ietver aparatūras un programmatūras slēdžus, hipervizoru slēdžus, NPU, grafikās procesorus, FPGA, SmartNIC un ASIC.
Valodas galvenās iezīmes būtiski paplašina tās pielietojumu sfēras un nodrošina tās ātru ieviešanu tīkla arhitektūrās.
Ar no kā sākt
P4 ir atvērts projekts, visa aktuālā informācija atrodama vietnē
Saites uz repozitoriju , kur var iegūt piemēru avota kodus un mācību materiālus.
Eclipse ar P4 atbalstu, bet varam ieteikt no Barefoot.

Apskatīsim galvenās kodola abstrakcijas:
Galvu definēšana — to palīdzībā tiek noteikti protokola galvenes.
Galvu definēšanā tiek norādīts:
- paketa formātu apraksts un galvenes lauku nosaukumi
- fiksētie un mainīgie atļautie lauki
Piemēram
sada Ethernet_h{
bitsdstAddr;
bitssrcAddr;
bitsetherType;
}
sada IPv4_h{
bits versija;
bits ihl;
bits diffserv;
bits kopējāGarums;
bits identifikācija;
bits karogi;
bits fragmentaPārslēgšana;
bits ttl;
bits protokols;
bits hdrChecksum;
bits srcAdrese;
bits dstAdrese;
varbit opcijas;
}
Parseri — to uzdevums ir analizēt galvenes.
Nākamais parsera piemērs noteiks stāvokļa mašīnas pāreju no vienas sākumstāvokļa uz vienu no diviem pēdējiem stāvokļiem:

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;
}
}…
}
Tabulas — satur mašīnas stāvokļus, kas saista lietotāju atslēgas ar darbībām. Darbības — apraksts, kā rīkoties ar paketi.
Tabulas satur stāvokļus (noteiktus vadības līmenī) paketu pārsūtīšanai, apraksta darbības vienību Match-Action
Paketēm tiek veikta salīdzināšana pēc:
- Precīzas atbilstības
- Garākās prefiksa atbilstības (LPM)
- Trīskāršas atbilstības (maskēšanas)
galda ipv4_lpm{
nolasīšana{
ipv4.dstAddr: lpm;
} darbības {
pārsūtīt();
}
}
Visas iespējamās darbības iepriekš jānosaka tabulās.
Darbības sastāv no koda un datiem. Dati nāk no vadības līmeņa (piemēram, IP adreses / portu numuri). Noteikti, bezcikla primitīvi var tikt norādīti tieši darbībā, bet komandu skaitam jābūt paredzamam. Tāpēc darbības nevar saturēt nekādas cilpas vai nosacījuma operatorus.
darbība 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 moduļi — darbības, lai izveidotu meklēšanas atslēgu, meklētu tabulā, veiktu darbības.
Tipisks moduļa piemērs ir parādīts attēlā:

Vadības plūsma — norāda Match-Action moduļu izmantošanas secību. Tā ir imperatīva programma, kas nosaka augsta līmeņa loģiku un Match-Action secību. Vadības plūsma sasaista visus objektus, nosakot vadības līmeni.
Ārējie objekti — tas ir specifiski objekti ar skaidri definētu arhitektūru un API saskarnēm. Piemēram, kontrolsumma aprēķināšana, reģistri, skaitītāji utt.
ārējais reģistrēt{
reģistrēt(bit izmērs);
void lasīt(out T rezultāts, in bit indekss);
void rakstīt(in bit indekss, in T vērtība);
}
ārējais Checksum16{
Checksum16(); //konstruktors
void clear(); //sagatavo vienību aprēķināšanai
void update(in T data); //pievieno datus kontrolsummas aprēķinam
void remove(in T data); //noņem datus no esošās kontrolsummas
bitsget(); //iegūst kontrolsummu par datiem, kas pievienoti kopš pēdējās dzēšanas
}
Metadati — datu struktūras, kas saistītas ar katru paketi.
Pastāv 2 veidu meta dati:
Lietotāja meta dati (tukša struktūra visām paketēm)
Šeit varat ievietot visu, ko vēlaties
Pieejami visā pipeline
ērti izmantot saviem mērķiem, piemēram, paketes hash glabāšanai
Iekšējie meta dati — nodrošina arhitektūra
Ieiešanas ports, izejas ports tiek noteikti šeit
Laiks, kad pakete tika pievienota rindai, rindas dziļums
multikasts hash / multikasta rinda
Paketes prioritāte, paketes nozīmīgums
Izvades porta specifikācija (piemēram, izvadījuma rinda)
P4 kompilators
P4 kompilators (P4C) ģenerē:
- Datu plūsmas izpildlaika
- API datu plūsmas mašīnas stāvokļa pārvaldīšanai

P4 valodā rakstīta programmatiskā slēdzis piemērs
Avota kodi pieejami lejupielādei no krātuvēm.
p4lang/p4c-bm: ģenerē JSON konfigurāciju bmv2
p4lang/bmv2: programmatiskā slēdzis, kas saprot JSON versijas bmv2 konfigurācijas
Zīmējums parāda projekta kompilācijas shēmu:

Manipulācijas ar tabulām, lasīšanas reģistriem, skaitītājiem:
- noklusēt_tabulā <table name> <action name> <action parameters>
- pievienot_tabulu <table name> <action name> <match fields> => <darbība
parameters> [priority] - dzēst_tabulu <table name> <entry handle>
Avota kodā iekļauta programma simple_switch_CLI, lai nodrošinātu ērtu API izmantošanu programmatiskajā slēdzī.
Šos un citus piemērus jūs varat lejupielādēt krātuvē.

P.S. Vasaras sākumā uzņēmums Intel parakstīja līgumu par Barefoot Networks iegādi, ar mērķi ātri apmierināt Hyperscale Cloud lietotāju vajadzības. Kā norādīja Navin Shenoy (izpildviceprezidents un datu centra grupas ģenerāldirektors Intel Corporation) — tas ļaus Intel nodrošināt lielākas slodzes un vairāk iespēju datu centru klientiem.
Manā personīgajā viedoklī nevajadzētu aizmirst, ka Intel ir līderis FPGA mikroshēmu ražošanā, un tai ir lieliska Quartus vide. Tātad, gaidāms, ka ar Barefoot pievienošanos Intel, uzņēmumam būs ne tikai jauni produkti, bet arī Quartus un P4 Studio gaida nopietnus atjauninājumus un Toffino un Toffino 2 produktu palielinājumu.
Oficiālais P4 kopienas dalībnieks — uzņēmums .
Avots: habr.com
