Język programowania P4

Język programowania P4
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:

Język programowania P4

Perspektywy zastosowania

Język programowania P4
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:

  1. Niezależność od docelowej realizacji;
  2. Niezależność od używanego protokołu(-ów);
  3. 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 P4.org

Link do repozytorium https://github.com/p4lang, gdzie możesz uzyskać kody źródłowe przykładów i materiały szkoleniowe.

Wtyczka dla Eclipse z obsługą P4, ale możemy polecić P4 Studio od firmy Barefoot.

Język programowania P4

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:

Język programowania P4

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:

Język programowania P4

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:

  1. Czas wykonania data plane
  2. API do zarządzania stanem maszyny w data plane

Język programowania P4

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:

Język programowania P4

Operacje na tabelach, rejestrach odczytu, licznikach:

  • ustawienia_domyslne_tabeli <table name> <action name> <action parameters>
  • dodaj_stół <table name> <action name> <match fields> => &lt;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.

Język programowania P4

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 Faktor grup.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster