
P4 to język programowania zaprojektowany do programowania reguł routingu pakietów. W przeciwieństwie do języków ogólnego przeznaczenia, takich jak C czy Python, P4 jest językiem dedykowanym z szeregiem konstrukcji zoptymalizowanych do routingu sieciowego.
P4 jest językiem open source, licencjonowanym i wspieranym przez organizację non-profit o nazwie P4 Language Consortium. Wspiera go również Open Networking Foundation (ONF) i Linux Foundation (LF) – dwie największe organizacje parasolowe w projektach open source w dziedzinie technologii sieciowych.
Język został pierwotnie stworzony w 2013 roku i opisany w 2014 roku w dokumencie SIGCOMM CCR zatytułowanym „Niezależne od protokołów, programowanie procesora routingu pakietów”.
Od momentu jego powstania P4 rośnie i rozwija się wykładniczo, szybko stając się standardem opisu przesyłania pakietów przez urządzenia sieciowe, w tym karty sieciowe, przełączniki i routery.
„SDN zrewolucjonizowało przemysł sieciowy, a P4 wynosi SDN na nowy poziom, zapewniając programowalność w zakresie rutowania”, powiedział Guru Parulkar, dyrektor wykonawczy Open Networking Foundation.
Język P4 został pierwotnie stworzony przez grupę inżynierów i badaczy z Google, Intel, Microsoft Research, Barefoot, Princeton i Stanford. Celem było stworzenie prostego w użyciu języka, który programista mógłby nauczyć się w ciągu jednego dnia i używać do precyzyjnego opisu tego, jak pakiety są przesyłane w sieci.
Od samego początku P4 był rozwijany jako niezależny od celu (tj. program napisany w P4 mógł być kompilowany bez zmian do działania na różnych celach, takich jak ASIC, FPGA, CPU, NPU i GPU).
Język jest również niezależny od protokołu (tj. program P4 może opisywać istniejące standardowe protokoły lub być używany do definiowania nowych konfigurowalnych trybów adresacji).
W przemyśle P4 jest stosowany do programowania urządzeń. Możliwe, że w przyszłości Internet-RFC i standardy IEEE również uwzględnią specyfikację P4.
P4 może być używany zarówno w programowalnych, jak i w urządzeniach o stałej funkcji. Na przykład, jest wykorzystywany do dokładnego rejestrowania zachowań przełącznika w interfejsach API interfejsu abstrakcji przełącznika (SAI), które są stosowane w systemach operacyjnych przełączników z otwartym kodem źródłowym SONiC. P4 jest również używany w projekcie ONF Stratum do opisywania zachowań przełączania w wielu stacjonarnych i programowalnych urządzeniach.
Opis zachowań przełącznika i kart sieciowych po raz pierwszy umożliwia stworzenie dokładnego modelu wykonawczego całej sieci przed wdrożeniem. Duzi dostawcy chmur mogą w pełni testować i debugować sieć za pomocą oprogramowania, co znacznie skraca czas i koszty testowania interakcji w laboratorium, nie wymagając kosztownego sprzętu.
Korzystając z P4, dostawcy sprzętu sieciowego mogą oczekiwać spójnego podstawowego zachowania routingu we wszystkich produktach, co umożliwia ponowne wykorzystanie infrastruktury testowej, upraszcza rozwój oprogramowania do zarządzania i w końcu zapewnia zgodność.
Oczywiście P4 można wykorzystać do pisania programów, które opisują zupełnie nowe metody routingu. Na przykład, P4 jest szeroko wykorzystywane do telemetrii i pomiarów w centrach danych, sieciach przedsiębiorstw i dostawców usług.
Społeczność badawcza również wykazała się aktywnością. Kilka wiodących akademickich grup badawczych zajmujących się technologiami sieciowymi opublikowało interesujące nowe aplikacje oparte na programach P4, w tym równoważenie obciążenia, protokoły uzgadniania i buforowanie wartości klucza. Powstaje nowa paradygma programowania, innowacje przenoszą się z sprzętu do oprogramowania, co pozwala na pojawienie się wielu nieoczekiwanych, nowych i genialnych pomysłów.
Społeczność deweloperów znacząco przyczyniła się do rozwoju kodu, w tym kompilatorów, programów przetwarzania, modeli zachowań, interfejsów API, środowisk testowych, aplikacji i wielu innych. Oddani deweloperzy pracują w takich firmach jak Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx i ZTE; na uczelniach, w tym BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass i USI; a także w projektach open source, takich jak CORD, FD.io, OpenDaylight, ONOS, OvS, SAI i Stratum, co podkreśla, że P4 jest niezależnym projektem publicznym.
Typowa generacja kontrolerów dla języka P4:

Perspektywy zastosowania

Ponieważ język jest przeznaczony do aplikacji routingu, lista wymagań i opcji projektowych różni się od języków programowania ogólnego przeznaczenia. Główne cechy języka to:
- Niezależność od docelowej realizacji;
- Niezależność od używanego protokołu(-ów);
- Rekonfigurowalność pól.
Niezależność od docelowej realizacji
Programy P4 są projektowane tak, aby nie były zależne od realizacji, co oznacza, że mogą być kompilowane dla wielu różnych typów maszyn wykonawczych, takich jak procesory ogólnego przeznaczenia, FPGA, systemy na chipie, procesory sieciowe i ASIC. Te różne typy maszyn są znane jako cele P4, a dla każdego celu potrzebny jest kompilator do konwersji kodu źródłowego P4 na model docelowego przełącznika. Kompilator może być wbudowany w urządzenie docelowe, zewnętrzne oprogramowanie lub nawet usługi w chmurze. Ponieważ wiele z pierwotnych celów dla programów P4 było używanych do prostego przełączania pakietów, często można usłyszeć termin „przełącznik P4”, nawet jeśli bardziej prawidłowym określeniem jest „cel P4”.
Niezależność od używanego protokołu(-ów)
P4 jest niezależny od protokołów. Oznacza to, że język nie ma wbudowanego wsparcia dla powszechnych protokołów, takich jak IP, Ethernet, TCP, VxLAN czy MPLS. Zamiast tego programista P4 opisuje formaty nagłówków i nazwy pól wymaganych protokołów w programie, które są następnie interpretowane i przetwarzane przez skompilowany program i urządzenie docelowe.
Rekonfigurowalność pól
Niezależność od protokołu i abstrakcyjny model języka umożliwiają rekonfigurowalność — cele P4 powinny mieć możliwość zmiany przetwarzania pakietów po wdrożeniu systemu. Ta funkcjonalność tradycyjnie wiąże się z routowaniem za pomocą procesorów ogólnego przeznaczenia lub procesorów sieciowych, a nie układów scalonych o stałych funkcjach.
Choć w języku nie ma nic, co mogłoby przeszkodzić w optymalizacji działania określonego zestawu protokołów, te optymalizacje są niewidoczne dla autora języka i mogą ostatecznie obniżyć elastyczność systemu oraz jego cele i rekonfigurowalność.
Te cechy języka zostały pierwotnie zakodowane przez jego twórców z myślą o powszechnym zastosowaniu w infrastrukturze sieciowej.
Już teraz język jest używany w wielu firmach:
1) Hipermasywne centra danych;
Chińska firma Tencent jest największym inwestorem na świecie i jednym z największych funduszy venture capital. Spółki zależne Tencent w Chinach i na całym świecie specjalizują się w różnych obszarach high-tech, w tym w różnych usługach internetowych, rozwoju sztucznej inteligencji oraz rozrywki elektronicznej.
P4 i programowalne routowanie to zaawansowane technologie stosowane w architekturze sieciowej firmy.
Jako jeden z twórców, Google z dumą informuje o szybkim wdrożeniu P4 w branży sieciowej, szczególnie w obszarze projektowania architektonicznego centrów danych.
2) Firmy komercyjne;
Goldman Sachs, korzystając z zalet współpracy ze społecznością open source i tworząc wspólne standardy oraz rozwiązania, już teraz wprowadza innowacje w infrastrukturze sieciowej i zapewnia najlepsze rozwiązania dla swoich klientów.
3) Produkcja;
Cała branża sieciowa zyska dzięki takiemu językowi jak P4, który jednoznacznie definiuje zachowanie routingu. Tak samo uważa Cisco, przenosząc swoje linie produktów na wykorzystanie tego języka.
Juniper Networks włączyło P4 i P4 Runtime do wielu swoich produktów, zapewniając programowy dostęp do wbudowanego procesora Juniper oraz jego oprogramowania.
Ruijie Networks jest aktywnym zwolennikiem P4 i korzyści, które przynosi sieciom. Dzięki P4 firma może tworzyć i dostarczać najlepsze w swojej klasie rozwiązania dla szerokiego grona klientów.
4) Dostawcy telekomunikacyjni;
AT&T była jednym z pierwszych zwolenników P4, jako jedna z pierwszych, która użyła P4 do określenia pożądanego zachowania w sieciach i wykorzystała urządzenia do programowalnego przekierowywania P4 w swojej sieci.
W Deutsche Telekom język jest wykorzystywany do tworzenia prototypów kluczowych funkcji sieciowych w ramach programu Access 4.0.
5) Przemysł półprzewodnikowy;
Język umożliwił wprowadzenie nowej paradygmy przenoszenia funkcji oprogramowania w obszar rutowania sieciowego przez firmę Barefoot.
Xilinx był jednym z założycieli P4.org i aktywnie uczestniczył w rozwoju języka P4, implementując go w programowalnych platformach opartych na FPGA dla sprzętu SmartNIC i NFV, wydając jeden z pierwszych kompilatorów P416 jako część projektu SDNet.
6) Oprogramowanie.
W firmie VMware uważa się, że P4 generuje ogromną energię, innowacje i społeczność, co prowadzi do znaczących i potrzebnych transformacji w sieci. VMware od początku było częścią tego ruchu branżowego, ponieważ nowa fala innowacji jest wywołana programowymi podejściami, które rozszerzają możliwości infrastruktury i wprowadzają je w najnowszych produktach.
Tak więc, P4 to język programowania niezależny od celu i protokołu, który jest wykorzystywany przez przemysł i społeczności naukowe do jednoznacznego określenia zachowania routingu pakietów jako programu, który z kolei może być kompilowany dla różnych celów. Dziś cele obejmują przełączniki sprzętowe i programowe, przełączniki hypervisor, NPU, GPU, FPGA, SmartNIC i ASIC.
Główne cechy języka znacząco rozszerzają zakres jego zastosowania i zapewniają jego szybką implementację w architekturach sieci.
Jak zacząć
P4 to otwarty projekt, wszelkie aktualne informacje znajdują się na stronie
Link do repozytorium , gdzie możesz uzyskać kody źródłowe przykładów i materiały szkoleniowe.
dla Eclipse z obsługą P4, ale możemy polecić od firmy Barefoot.

Omówimy główne abstrakcje rdzenia:
Definicja nagłówków — za ich pomocą określane są nagłówki protokołu.
W definicji nagłówków ustala się:
- opis formatów pakietów i nazwy pól nagłówków
- stałe i zmienne pola dozwolone
Na przykład
nagłówek Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
nagłówek IPv4_h{
bit wersja;
bit ihl;
bit diffserv;
bit totalLen;
bit identyfikacja;
bit flagi;
bit offsetFrag;
bit ttl;
bit protokół;
bit hdrChecksum;
bit srcAddr;
bit dstAddr;
varbit opcje;
}
Parsery — ich zadaniem jest analizowanie nagłówków.
Następny przykład parsera określi przejście stanu końcowego maszyny z jednego stanu początkowego do jednego z dwóch końcowych:

parser MyParser(){
stan start{przejdź do parse_ethernet;}
stan parse_ethernet{
pakiet.wyciągnij(hdr.ethernet);
przejdź do select(hdr.ethernet.etherType){
TYPE_IPV4: parse_ipv4;
domyślnie: zaakceptuj;
}
}…
}
Tablice — zawierają stany maszyny łączące klucze użytkowników z działaniami. Działania — opis tego, jak należy manipulować pakietem.
Tablice zawierają stany (określone na poziomie zarządzania) do przesyłania pakietów, opisują jednostkę działania Match-Action
Sparowanie pakietów odbywa się na podstawie:
- Dokładnego dopasowania
- Najdłuższego dopasowania z prefiksem (LPM)
- Potrójnego dopasowania (maskowania)
stół ipv4_lpm{
odczyty{
ipv4.dstAddr: lpm;
} akcje {
przekaż();
}
}
Wszystkie możliwe działania muszą być z góry określone w tablicach.
Działania składają się z kodu i danych. Dane pochodzą z poziomu zarządzania (np. adresy IP / numery portów). Określone, bezcyklowe prymitywy mogą być przypisane bezpośrednio w działaniu, ale liczba poleceń musi być przewidywalna. Dlatego działania nie mogą zawierać żadnych pętli ani instrukcji warunkowych.
akcja 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;
}
Moduły Match-Action — działania mające na celu tworzenie klucza wyszukiwania, przeszukiwania tablicy, wykonywania działań.
Typowy przykład modułu przedstawiony jest na rysunku:

Przepływ sterowania — wskazuje kolejność stosowania modułów Match-Action. To imperatywny program, który określa logikę na wysokim poziomie i sekwencję Match-Action. Przepływ sterowania łączy wszystkie obiekty, określając poziom zarządzania.
Obiekty zewnętrzne — to specyficzne obiekty z wyraźnie określoną architekturą i interfejsami API. Na przykład obliczanie sumy kontrolnej, rejestry, liczniki itd.
zewnętrzny rejestr{
rejestr(bit rozmiar);
void czytaj(out T wynik, in bit indeks);
void pisz(in bit indeks, in T wartość);
}
zewnętrzny Checksum16{
Checksum16(); //konstruktor
void clear(); //przygotuj jednostkę do obliczeń
void update(in T data); //dodaj dane do sumy kontrolnej
void remove(in T data); //usuń dane z istniejącej sumy kontrolnej
bitget(); //pobierz sumę kontrolną dla danych dodanych od ostatniego wyczyszczenia
}
Metadane — struktury danych powiązane z każdym pakietem.
Istnieją 2 rodzaje metadanych:
Metadane użytkownika (pusta struktura dla wszystkich pakietów)
Możesz umieścić tutaj wszystko, co chcesz
Dostępne na całym przebiegu pipeline
wygodne do wykorzystania w swoich celach, na przykład do przechowywania hasha pakietu
Metadane wewnętrzne — zapewniane przez architekturę
Port wejściowy, port wyjściowy są określane tutaj
Znacznik czasu, kiedy pakiet został umieszczony w kolejce, głębokość kolejki
m multicast hash / kolejka multicast
Priorytet pakietu, znaczenie pakietu
Specyfikacja portu wyjściowego (na przykład kolejka wyjściowa)
Kompilator P4
Kompilator P4 (P4C) generuje:
- Czas wykonania data plane
- API do zarządzania stanem maszyny w data plane

Przykład programu switch w języku P4
Kod źródłowy można pobrać z repozytorium.
p4lang/p4c-bm: tworzy konfigurację JSON dla bmv2
p4lang/bmv2: programowy przełącznik, który rozumie konfiguracje JSON wersji bmv2
Na rysunku przedstawiono schemat kompilacji projektu:

Operacje na tabelach, rejestrach odczytu, licznikach:
- ustawienia_domyslne_tabeli <table name> <action name> <action parameters>
- dodaj_stół <table name> <action name> <match fields> => <aktywność
parameters> [priority] - usuń_tabelę <table name> <entry handle>
W kodach źródłowych znajduje się program simple_switch_CLI dla łatwego korzystania z API przełącznika.
Ten i inne przykłady można pobrać z repozytorium.

P.S. Na początku lata firma Intel podpisała umowę o zakupie Barefoot Networks, mając na celu szybką odpowiedź na potrzeby użytkowników Hyperscale Cloud. Jak stwierdził Navin Shenoy (wiceprezes wykonawczy i dyrektor generalny Grupy Centrum Danych w Intel Corporation) — to umożliwi Intelowi dostarczanie większych obciążeń roboczych i więcej możliwości dla klientów centrów danych.
Moim osobistym zdaniem nie można zapominać, że firma Intel jest liderem w produkcji układów FPGA i ma doskonałe środowisko Quartus. To oznacza, że po wejściu do Intela, firma Barefoot nie tylko wzbogaci swoją linię produkcyjną, ale także Quartus i P4 Studio czekają poważne aktualizacje oraz wzbogacenie linii Toffino i Toffino 2.
Oficjalny uczestnik społeczności P4 — firma .
Źródło: habr.com
