
A P4 egy programozási nyelv, amelyet a csomagok irányítási szabályainak megírására terveztek. Ellentétben a C-hez vagy a Pythonhoz hasonló általános célú nyelvekkel, a P4 egy domain-orientált nyelv, amely számos, a hálózati irányításhoz optimalizált konstrukcióval rendelkezik.
A P4 egy nyílt forráskódú nyelv, amelyet egy nonprofit szervezet, a P4 Language Consortium támogat és engedélyez. Támogatja továbbá az Open Networking Foundation (ONF) és a Linux Foundation (LF) – a hálózati technológiák területén két legnagyobb nyílt forráskódú projektet támogató szervezet is.
A nyelvet eredetileg 2013-ban találták ki, és 2014-ben írták le a SIGCOMM CCR folyóiratban a 'Protokollfüggetlen csomagirányító processzor programozásának' című dokumentumban.
A létrehozása óta a P4 exponenciálisan növekszik és fejlődik, gyorsan válva a hálózati eszközök számára a csomagátviteli szabvány leírásának, beleértve a hálózati adaptereket, switcheket és routereket.
"Az SDN átalakította a hálózati ipart, és a P4 egy új szintre emeli az SDN-t, biztosítva a programozhatóságot az irányítás terén" - mondta Guru Parulkar, az Open Networking Foundation ügyvezető igazgatója.
A P4 nyelvet eredetileg a Google, az Intel, a Microsoft Research, a Barefoot, a Princeton és a Stanford mérnökeiből és kutatóiból álló csoport hozta létre. A cél egyszerű volt: egy könnyen használható nyelv létrehozása, amelyet a szoftverfejlesztők nap alatt megtanulhatnak, és amely pontosan leírja, hogy a csomagok hogyan haladnak a hálózaton.
A P4-től kezdve a céltól függetlenként fejlesztették (azaz egy P4-en írt program változtatás nélkül fordítható különböző célokra, mint például ASIC, FPGA, CPU, NPU és GPU).
A nyelv protokollfüggetlen is (azaz a P4 programok meglévő szabványos protokollokat írhatnak le, vagy új testre szabott címzési módokat definiálhatnak).
Az iparban a P4-et eszközök programozására használják. Lehetséges, hogy a jövőben az Internet-RFC és az IEEE szabványok is tartalmazni fogják a P4 specifikációját.
A P4 használható programozható és fix funkciójú eszközök számára is. Például pontosan rögzíti a kapcsoló cső viselkedését a kapcsoló absztrakciós interfészek (SAI) API-jában, amelyet az SONiC nyílt forráskódú operációs rendszerek használnak. A P4 szerepet játszik az ONF Stratum projektben is, amely a kapcsolás viselkedésének leírására szolgál különböző fix és programozható eszközökön keresztül.
A kapcsolók és hálózati adapterek viselkedésének leírása először lehetővé teszi a teljes hálózat pontos végrehajtható modelljének elkészítését a telepítés előtt. A nagy felhőszolgáltatók teljes mértékben tesztelhetik és hibakereshetik a hálózatot szoftver segítségével, ami jelentősen csökkenti a laboratóriumi kölcsönhatás tesztelésének idejét és költségeit, anélkül hogy drága berendezésekre lenne szükség.
A P4 használatával a hálózati eszközök gyártói számíthatnak a routing általános alap viselkedésére az összes termékben, ami lehetővé teszi a tesztelési infrastruktúra újrahasznosítását, leegyszerűsíti a kezelőszoftver fejlesztését, és végső soron garantálja a kompatibilitást.
Természetesen a P4 használható olyan programok írására, amelyek teljesen új routing módszereket írnak le. Például a P4 széleskörűen alkalmazzák telemetria és mérések terén adatközpontokban, vállalati hálózatokban és szolgáltatóknál.
A kutatói közösség is fellendült. Számos vezető akadémiai kutatócsoport a hálózati technológiák területén érdekes új alkalmazásokat publikált a P4 programok alapján, beleértve a terheléselosztást, az összehangolt protokollokat és a kulcskereső gyorsítótárazást. Egy új programozási paradigma jön létre, az innovációk átkerülnek a hardverből a szoftverbe, lehetővé téve sok váratlan, új és zseniális ötlet megjelenését.
A fejlesztői közösség jelentős hozzájárulást nyújtott a kód fejlesztéséhez, beleértve a fordítókat, csőprogramokat, viselkedési modelleket, API-interfészeket, tesztelési környezeteket, alkalmazásokat és még sok mást. Elkötelezett fejlesztők találhatók olyan vállalatoknál, mint az Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx és ZTE; egyetemek, beleértve a BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass és USI; valamint nyílt forráskódú projektek, például a CORD, FD.io, OpenDaylight, ONOS, OvS, SAI és Stratum, hangsúlyozzák, hogy a P4 egy független közszolgáltatás.
A P4 nyelvhez tartozó tipikus vezérlőgenerálás:

Alkalmazási perspektívák

Mivel a nyelvet irányítási alkalmazásokra szánták, a követelmények és a tervezési lehetőségek listája eltér a hagyományos programozási nyelvekétől. A nyelv főbb jellemzői a következők:
- A célmegvalósítástól való függetlenség;
- A használt protokoll(ok)tól való függetlenség;
- Mezők újrakonfigurálhatósága.
A célmegvalósítástól való függetlenség
A P4 programokat úgy alakítják, hogy ne függjenek a megvalósítástól, vagyis átkonvertálhatók különböző tipusú végrehajtó gépekre, mint például általános processzorok, FPGA-k, rendszerchippek, hálózati processzorok és ASIC-k. Ezeket a különböző típusú gépeket P4 céloknak nevezik, és minden célhoz szükséges egy fordító, amely a P4 forrást a célswitch modelljévé alakítja. A fordító beépíthető a céleszközbe, külső szoftverbe vagy akár felhőszolgáltatásba is. Mivel sok kezdeti cél a P4 programokhoz egyszerű csomagkapcsolásra szolgált, gyakran hallható a "P4 switch" kifejezés, még akkor is, ha a „P4 cél” használata pontosabb.
A használt protokoll(ok)tól való függetlenség
A P4 protokollfüggetlen. Ez azt jelenti, hogy a nyelv nem tartalmaz beépített támogatást a közismert protokollok, mint például az IP, Ethernet, TCP, VxLAN vagy MPLS számára. Ehelyett a P4 programozó a szükséges protokollok fejlécformátumait és mezőneveit írja le a programban, amelyeket a lefordított program és a céleszköz értelmez és feldolgoz.
Mezők újrakonfigurálhatósága
A protokolloktól és az absztrakt nyelvtől való függetlenség lehetővé teszi az újrakonfigurálhatóságot – a P4 céljainak lehetőséget kell biztosítaniuk a csomagok feldolgozásának módosítására a rendszer telepítése után. Ezt a lehetőséget hagyományosan a rendszerprocesszorok vagy a hálózati processzorok általi routolás, nem pedig a fix funkciókkal rendelkező integrált áramkörök biztosítják.
Bár a nyelv nem tartalmaz olyan elemeket, amelyek hátráltatnák egy adott protokollkészlet optimalizálását, ezek az optimalizálások láthatatlanok a nyelv szerzője számára, és végső soron csökkenthetik a rendszer és céljainak rugalmasságát és újrakonfigurálhatóságát.
A nyelv ezen jellemzőit eredetileg a létrehozói a hálózati infrastruktúrában való széleskörű használatra orientálták.
A nyelvet már most is sok vállalat használja:
1) Hiperméretes adatközpontok;
A Tencent kínai vállalat a világ legnagyobb befektetési cége és az egyik legnagyobb kockázati tőkevállalat. A Tencent leányvállalatai, akár Kínában, akár más országokban, a magasan technológiájú üzletágak különböző területeire specializálódtak, beleértve az internetes szolgáltatásokat, a mesterséges intelligenciával kapcsolatos fejlesztéseket és az elektronikus szórakoztatást.
A P4 és a programozható routolás élvonalbeli technológiák, amelyeket a vállalat hálózati architektúrájában alkalmaznak.
Mint az egyik alkotó, a Google büszkén jegyzi meg a P4 gyors elterjedését a hálózati iparban, különösen a DC architektúrák tervezésében.
2) Kereskedelmi vállalatok;
A Goldman Sachs, kihasználva az open source közösséggel való együttműködést és a közös szabványok és megoldások fejlesztését, már most is innovációkat hoz a hálózati infrastruktúrába, és a legjobb megoldásokat kínálja az ügyfeleknek.
3) Gyártás;
Az egész hálózati ipar profitálni fog egy olyan nyelvből, mint a P4, amely egyértelműen meghatározza az irányítás viselkedését. Ezt a Cisco is osztja, amely a termékpalettáját erre a nyelvre való áttérésre törekszik.
A Juniper Networks beépítette a P4-et és a P4 Runtime-ot számos termékébe, és szoftveres hozzáférést biztosít a Juniper beépített processzorához és programkódjához.
A Ruijie Networks aktívan támogatja a P4-et és az általa a hálózatok számára nyújtott előnyöket. A P4 segítségével a vállalat legjobb minőségű megoldásokat tud létrehozni és szállítani széles ügyfélkör számára.
4) Távközlési szolgáltatók;
Az AT&T az egyik első támogatója volt a P4-nek, és az egyik első, aki a P4-et használta a hálózati viselkedés meghatározására, és P4 programozható átirányító eszközöket alkalmazott a hálózatában.
A Deutsche Telekomnál a nyelvet kulcsfontosságú hálózati funkciók prototípusának létrehozására használják az Access 4.0 program keretében.
5) Félvezetőipar;
A nyelv lehetővé tette egy új szoftvermegbízási paradigma megvalósítását a Barefoot által a hálózati irányítás síkjában.
A Xilinx az egyik alapítója volt a P4.org-nak, és aktívan részt vett a P4 nyelv fejlesztésében, valamint megvalósította azt FPGA-alapú programozható platformokon a SmartNIC és NFV berendezésekhez, és kiadta az egyik első P416 fordítót az SDNet dizájn részeként.
6) Szoftver.
A VMware-nél úgy vélik, hogy a P4 óriási energiát, innovációt és közösséget teremt, amely jelentős és szükséges átalakulásokhoz vezet a hálózatokban. A VMware kezdetben része volt ennek az iparági mozgalomnak, mivel az új innovációs hullámot programozási megközelítések okozzák, amelyek bővítik az infrastruktúra lehetőségeit és megvalósítják azt a legújabb termékekben.
Így a P4 egy célfüggetlen és protokollfüggetlen programozási nyelv, amelyet az ipar és a tudományos közösség használ a csomagirányítás viselkedésének egyértelmű meghatározására, mint egy program, amely viszont több célra is lefordítható. Ma a célok között szerepelnek a hardveres és szoftveres kapcsolók, a hipervizor kapcsolók, az NPU-k, a grafikus processzorok, az FPGA-k, a SmartNIC-ek és az ASIC-ek.
A nyelv főbb jellemzői jelentősen kibővítik alkalmazási területeit, és gyorsan implementálhatóvá teszik azt a hálózati architektúrákba.
Hogyan kezdjük?
A P4 egy nyílt projekt, minden aktuális információ a
link a tárolóra , ahol megkaphatja a példák forráskódját és oktatási anyagokat.
az Eclipse-hez P4 támogatással, de tudunk ajánlani a Barefoot-tól.

Nézzük meg a mag főbb absztrakcióit:
Címek meghatározása — ezek segítségével határozzák meg a protokoll címeket.
A címek meghatározásában van:
- csomagformátumok leírása és a címek mezőinek nevei
- rögzített és változó engedélyezett mezők
Például
fejléc Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
fejléc IPv4_h{
bitverzió;
bitihl;
bitdiffserv;
bittotalLen;
bitazonosító;
bitzászlók;
bitfragOffset;
bitttl;
bitprotokoll;
bithdrChecksum;
bitsrcAddr;
bitdstAddr;
varbitopciók;
}
Parser-ek — feladatuk a címek elemzése.
A következő parser példa meghatározza a gép végállapotának átmenetét egy kezdeti állapotból két végső állapotba:

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;
}
}…
}
Táblázatok — tartalmazzák a gép állapotait, amelyek összekapcsolják a felhasználói kulcsokat a műveletekkel. Műveletek — leírja, hogyan kell manipulálni a csomagot.
A táblázatok állapotokat tartalmaznak (amelyeket vezérlési szinten határoznak meg) a csomagok átküldésére, leírják a Match-Action művelet egységét.
A csomagok összevetése ezen alapul:
- Pontossági megfelelés
- Leghosszabb prefixmatch (LPM)
- Háromszoros megfelelés (maszk)
table ipv4_lpm{
olvasta{
ipv4.dstAddr: lpm;
} actions {
tovább();
}
}
Minden lehetséges műveletet előre meg kell határozni a táblázatokban.
A műveletek kódot és adatokat tartalmaznak. Az adatok a vezérlési szintről érkeznek (például IP-címek / port számok). A meghatározott, ciklusmentes primitívek közvetlenül megadhatók a műveletben, de a parancsok számának előre kiszámíthatónak kell lennie. Ezért a műveletek nem tartalmazhatnak ciklusokat vagy feltételes utasításokat.
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;
}
Match-Action modulok — a keresési kulcs létrehozására, a táblázatban való keresésre, műveletek végrehajtására vonatkozó tevékenységek.
A modul tipikus példája az alábbi ábrán látható:

Vezérlési áramlás — meghatározza a Match-Action modulok alkalmazásának sorrendjét. Ez egy imperatív program, amely megadja a magas szintű logikát és a Match-Action sorrendjét. A vezérlési áramlás összekapcsolja az összes objektumot, meghatározva a vezérlés szintjét.
Külső objektumok — ezek specifikus objektumok, világosan meghatározott architektúrával és API interfészekkel. Például ellenőrző összeg számítása, regiszterek, számlálók, stb.
extern regisztrálj{
regisztrálj(bit méret);
void olvas(out T eredmény, in bit index);
void ír(in bit index, in T érték);
}
extern Checksum16{
Checksum16(); //konstruktor
void clear(); //elő készítése a számításra
void update(in T data); //adat hozzáadása a checksumhoz
void remove(in T data); //adat eltávolítása a meglévő checksumról
bitget(); //a checksum lekérése az utolsó clear óta hozzáadott adatokhoz
}
Metainformációk — adatszerkezetek, amelyek minden egyes csomaghoz kapcsolódnak.
Kétféle metainformáció létezik:
Felhasználói metainformáció (üres struktúra minden csomaghoz)
Itt bármit elhelyezhet, amit szeretne
elérhető a pipeline minden szakaszában
használható a saját céljaira, például a csomag hash-ának tárolására
Belső metainformáció — az architektúra biztosítja
A bemeneti és kimeneti port itt kerülnek meghatározásra
Időbélyeg, amikor a csomag sorba került, a sor mélysége
multicast hash / multicast queue
A csomag prioritása, a csomag fontossága
A kimeneti port specifikációja (például a kimeneti sor)
P4 fordító
A P4 fordító (P4C) létrehozza:
- Adatlane futási idő
- API az adatlane gép állapotának kezelésére

P4 nyelven írt példa programváltó
A forráskódokat letöltheti a tárolóból.
p4lang/p4c-bm: JSON konfigurációt készít a bmv2 számára
p4lang/bmv2: olyan programváltó, amely megérti a bmv2 JSON verziójának konfigurációit
A ábrán a projekt fordításának séma látható:

Műveletek táblákkal, olvasási regiszterekkel, számlálókkal:
- alapértelmezett_táblázat <table name> <action name> <action parameters>
- asztal_add <table name> <action name> <match fields> => <action
parameters> [priority] - táblázat_törlés <table name> <entry handle>
A forráskódok tartalmazzák a simple_switch_CLI programot, amely megkönnyíti az API használatát.
Ezt és más példákat letölthet a tárolóból.

P.S. Nyár elején az Intel megállapodást írt alá a Barefoot Networks felvásárlásáról, hogy gyorsan kielégítse a Hyperscale Cloud felhasználók igényeit. Ahogy Navin Shenoy (az Intel Corporation Adatközponti Csoportjának ügyvezető alelnöke és igazgatója) kijelentette — ez lehetővé teszi az Intel számára, hogy nagyobb munkaterheléseket és több lehetőséget kínáljon az adatközpontok ügyfelei számára.
Személyes véleményem szerint nem szabad elfelejteni, hogy az Intel a FPGA chipek gyártásának vezetője, és kiváló Quartus környezete van. Ezért várható, hogy az Intel berkeibe kerülve a Barefoot nemcsak a termékpalettáját bővíti, hanem a Quartus és a P4 Studio is komoly frissítéseket és bővítéseket vár Toffino és Toffino 2 modellekkel.
A P4 közösség hivatalos tagja — a cég .
Forrás: habr.com
