Limbajul de programare P4

Limbajul de programare P4
P4 este un limbaj de programare conceput pentru a programa regulile de rutare a pachetelor. Spre deosebire de un limbaj de uz general, cum ar fi C sau Python, P4 este un limbaj specific domeniului, cu o serie de modele optimizate pentru rutarea rețelei.

P4 este un limbaj open source licențiat și întreținut de o organizație non-profit numită P4 Language Consortium. De asemenea, este susținut de Open Networking Foundation (ONF) și Linux Foundation (LF), două dintre cele mai mari organizații umbrelă pentru proiecte de rețea open source.
Limbajul a fost inventat inițial în 2013 și descris într-o lucrare SIGCOMM CCR din 2014 intitulată „Protocol Independent, Packet Routing Processor Programming”.

De la începuturile sale, P4 a crescut și a evoluat exponențial, devenind rapid un standard pentru descrierea transmisiei de pachete de către dispozitivele de rețea, inclusiv adaptoare de rețea, switch-uri și routere.

„SDN a transformat industria de rețele, iar P4 duce SDN la următorul nivel, aducând programabilitate în rutare”, a declarat Guru Parulkar, director executiv al Open Networking Foundation.

Limbajul P4 a fost creat inițial de un grup de ingineri și cercetători de la Google, Intel, Microsoft Research, Barefoot, Princeton și Stanford. Scopul a fost simplu: creați un limbaj ușor de utilizat pe care un dezvoltator de software ar putea să-l învețe într-o zi și să-l folosească pentru a descrie cu exactitate modul în care sunt trimise pachetele prin rețele.

De la bun început, P4 a fost conceput pentru a fi independent de țintă (adică un program scris în P4 ar putea fi compilat neschimbat pentru a rula pe o varietate de ținte, cum ar fi ASIC-uri, FPGA-uri, procesoare, NPU-uri și GPU-uri).

Limbajul este, de asemenea, independent de protocol (adică, un program P4 poate descrie protocoalele standard existente sau poate fi folosit pentru a specifica noi moduri de adresare personalizate).

În industrie, P4 este folosit pentru programarea dispozitivelor. Poate că în viitor, standardele Internet-RFC și IEEE vor include și specificația P4.

P4 poate fi utilizat atât pentru dispozitive cu funcții programabile, cât și pentru cele fixe. De exemplu, este folosit pentru a înregistra cu precizie comportamentul conductei de comutare în API-urile Switch Abstraction Interface (SAI) utilizate de sistemul de operare open source SONiC switch. P4 este, de asemenea, utilizat în proiectul ONF Stratum pentru a descrie comportamentul de comutare într-o varietate de dispozitive fixe și programabile.

Pentru prima dată, descrierea comportamentului comutatorului și adaptoarelor de rețea vă permite să creați un model executabil precis al întregii rețele înainte de implementare. Furnizorii mari de cloud pot testa și depana rețeaua în întregime folosind software, reducând semnificativ timpul și costul testării de interoperabilitate în laborator fără a necesita hardware costisitor.

Prin utilizarea P4, furnizorii de echipamente de rețea se pot aștepta la un comportament comun de rutare de bază pentru toate produsele, permițând reutilizarea infrastructurii de testare, simplificând dezvoltarea software-ului de management și, în cele din urmă, asigurând interoperabilitatea.

Desigur, P4 poate fi folosit pentru a scrie programe care descriu modalități complet noi de rutare. De exemplu, P4 este utilizat pe scară largă pentru telemetrie și măsurători în centrele de date, întreprinderile și rețelele furnizorilor de servicii.

Comunitatea de cercetare a intensificat de asemenea. Mai multe grupuri academice de cercetare în rețele au publicat noi aplicații interesante bazate pe programe P4, inclusiv echilibrarea sarcinii, protocoale de consens și memorarea în cache a valorii cheie. Se creează o nouă paradigmă de programare, inovația trece de la hardware la software, permițând să apară multe idei neașteptate, noi și ingenioase.

Comunitatea dezvoltatorilor a adus contribuții semnificative la dezvoltarea codului, inclusiv compilatoare, conducte, modele comportamentale, API-uri, cadre de testare, aplicații și multe altele. Companii precum Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx și ZTE au dezvoltatori dedicați; de la universități, inclusiv BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass și USI; și proiecte open source, inclusiv CORD, FD.io, OpenDaylight, ONOS, OvS, SAI și Stratum evidențiază faptul că P4 este un proiect comunitar independent.

Generație tipică de controlere pentru limbajul P4:

Limbajul de programare P4

Perspective de aplicare

Limbajul de programare P4
Deoarece limbajul este destinat aplicațiilor de rutare, lista de cerințe și opțiuni de proiectare este diferită în comparație cu limbajele de programare de uz general. Principalele caracteristici ale limbii sunt:

  1. Independență față de implementarea țintei;
  2. Independența protocolului (protocoalelor) utilizat(e);
  3. Reconfigurabilitatea câmpului.

Independență față de implementarea țintei

Programele P4 sunt concepute pentru a fi independente de implementare, ceea ce înseamnă că pot fi compilate pentru multe tipuri diferite de motoare de execuție, cum ar fi procesoare de uz general, FPGA, sistem pe cipuri, procesoare de rețea și ASIC. Aceste tipuri diferite de mașini sunt cunoscute ca ținte P4 și fiecare țintă necesită un compilator pentru a converti codul sursă P4 într-un model de comutare țintă. Compilatorul poate fi încorporat în dispozitivul țintă, în software extern sau chiar într-un serviciu cloud. Deoarece multe dintre țintele inițiale pentru programele P4 erau pentru comutarea simplă de pachete, este foarte obișnuit să auziți termenul „Comutare P4”, chiar dacă „ținta P4” este mai precisă.

Independența protocoalelor utilizate

P4 este independent de protocol. Aceasta înseamnă că limbajul nu are suport nativ pentru protocoale comune, cum ar fi IP, Ethernet, TCP, VxLAN sau MPLS. În schimb, programatorul P4 descrie formatele antetului și numele câmpurilor protocoalelor necesare din program, care la rândul lor sunt interpretate și procesate de programul compilat și dispozitivul țintă.

Reconfigurabilitatea câmpului

Independența protocolului și modelul de limbaj abstract permite reconfigurabilitate - țintele P4 ar trebui să poată schimba procesarea pachetelor după ce sistemul este implementat. Această capacitate a fost în mod tradițional asociată cu rutarea prin procesoare de uz general sau procesoare de rețea, mai degrabă decât cu circuite integrate cu funcție fixă.

Deși nu există nimic în limbaj care ar împiedica optimizarea performanței unui anumit set de protocoale, aceste optimizări sunt invizibile pentru autorul limbajului și pot reduce în cele din urmă flexibilitatea sistemului și a obiectivelor și reconfigurabilitatea acestora.

Aceste caracteristici ale limbii au fost stabilite inițial de creatorii săi, cu accent pe utilizarea sa pe scară largă în infrastructura de rețea.

Limbajul este deja folosit în multe companii:

1) Centre de date hiperscale;

Compania chineză Tencent este cea mai mare companie de investiții din lume și una dintre cele mai mari firme de capital de risc. Filialele Tencent, atât în ​​China, cât și în alte țări din întreaga lume, sunt specializate în diverse domenii ale afacerilor de înaltă tehnologie, inclusiv diverse servicii de internet, dezvoltări în domeniul inteligenței artificiale și al divertismentului electronic.

P4 și rutarea programabilă sunt tehnologii avansate care sunt utilizate în arhitectura de rețea a companiei.

În calitate de unul dintre creatori, Google este mândru să constate adoptarea rapidă a P4 în industria rețelelor și în special în designul arhitectural al centrelor de date.

2) Societati comerciale;

Goldman Sachs profită de faptul că lucrează cu comunitatea open source și dezvoltă standarde și soluții comune pentru a inova infrastructura de rețea și a oferi soluții mai bune pentru clienți.

3) Productie;

Întreaga industrie a rețelelor ar beneficia de un limbaj precum P4 care definește în mod unic comportamentul de redirecționare. De asemenea, Cisco crede în transferul liniilor sale de produse pentru a utiliza acest limbaj.

Juniper Networks a inclus P4 și P4 Runtime într-un număr de produse și oferă acces programatic la procesorul încorporat Juniper și codul software al acestuia.

Ruijie Networks este un susținător puternic al P4 și al beneficiilor pe care le aduce rețelelor. Cu P4, compania poate crea și livra cele mai bune soluții din clasă unei game largi de clienți.

4) Furnizorii de telecomunicații;

AT&T a fost unul dintre primii care au folosit P4 pentru a defini comportamentul pe care dorea să-l vadă în rețelele sale și a folosit dispozitive de redirecționare programabile P4 în rețeaua sa.

La Deutsche Telekom, limbajul este folosit pentru a prototipa funcțiile cheie ale rețelei ca parte a programului Access 4.0.

5) Industria semiconductoarelor;

Limbajul i-a permis lui Barefoot să implementeze o nouă paradigmă pentru furnizarea de capabilități software către planul de rutare a rețelei.

Xilinx a fost unul dintre fondatorii P4.org și a fost implicat activ în dezvoltarea limbajului P4 și l-a implementat în platformele programabile bazate pe FPGA pentru hardware SmartNIC și NFV, lansând unul dintre primele compilatoare P416 ca parte a designului SDNet.

6) Software.

VMware consideră că P4 creează o energie extraordinară, inovație și comunitate care conduce la transformarea semnificativă și necesară în rețea. VMware a făcut parte din această mișcare a industriei încă de la început, deoarece un nou val de inovație este condus de abordări bazate pe software care extind capacitățile de infrastructură și o implementează în cele mai recente produse.

Astfel, P4 este un limbaj de programare independent de țintă și independent de protocol, care este utilizat de industrie și mediul academic pentru a defini în mod unic comportamentul de rutare a pachetelor ca program, care, la rândul său, poate fi compilat pentru mai multe ținte. Astăzi, obiectivele includ comutatoare hardware și software, comutatoare hypervisor, NPU, GPU, FPGA, SmartNIC și ASIC.

Principalele caracteristici ale limbajului extind semnificativ domeniul de aplicare al acestuia și asigură implementarea sa rapidă în arhitecturile de rețea.

Noțiuni de bază

P4 este un proiect deschis, toate informațiile relevante sunt pe site P4.org

Link pentru depozit https://github.com/p4lang, unde puteți obține exemple de cod sursă și tutoriale.

plugin pentru Eclipse cu suport P4, dar vă putem recomanda P4 Studio din Desculț.

Limbajul de programare P4

Să ne uităm la principalele abstracții ale nucleului:

Definirea antetelor — cu ajutorul lor se determină anteturile de protocol.

Definiția antetului specifică:

  • descrierea formatelor de pachete și a numelor câmpurilor antet
  • câmpuri permise fixe și variabile

De exemplu

header Ethernet_h{
    bit<48>  dstAddr;
    bit<48>  srcAddr;
    bit<16>  etherType;
}

header IPv4_h{
    bit<4>  version;
    bit<4>  ihl;
    bit<8>  diffserv;
    bit<16>  totalLen;
    bit<16>  identification;
    bit<3>  flags;
    bit<13>  fragOffset;
    bit<8>  ttl;
    bit<8>  protocol;
    bit<16>  hdrChecksum;
    bit<32>  srcAddr;
    bit<32>  dstAddr;
    varbit<320>  options;
}

Analizoare — sarcina lor este să analizeze titlurile.

Următorul exemplu de analizator va determina tranziția stării finale a mașinii de la o stare inițială la una dintre cele două stări finale:

Limbajul de programare P4

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;
        }
    }…
}

Mese — conțin stări ale mașinii care leagă cheile utilizatorului cu acțiuni. Activitate — o descriere a modului în care ar trebui să fie manipulat pachetul.

Tabelele conțin stări (definite la nivel de management) pentru redirecționarea pachetelor, descriu unitatea Match-Action

Pachetele sunt potrivite după:

  • Potrivire perfecta
  • Cea mai lungă potrivire de prefix (LPM)
  • Potrivire triplă (mascare)

table ipv4_lpm{
    reads{
        ipv4.dstAddr: lpm;
    } actions {
        forward();
    }
}

Toate acțiunile posibile trebuie definite în tabel în prealabil.

Acțiunile constau în cod și date. Datele provin de la nivelul de management (ex. adrese IP/numerele de port). Anumite primitive fără buclă pot fi specificate direct în acțiune, dar numărul de instrucțiuni trebuie să fie previzibil. Prin urmare, acțiunile nu pot conține bucle sau instrucțiuni condiționate.

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;
}

Module Match-Action — acțiuni pentru a crea o cheie de căutare, a căuta într-un tabel, a efectua acțiuni.

Un exemplu tipic de modul este prezentat în figură:

Limbajul de programare P4

Controlul fluxului — indică ordinea în care sunt utilizate modulele Match-Action. Acesta este un program imperativ care definește logica de nivel înalt și secvența Match-Action. Fluxul de control leagă toate obiectele prin definirea nivelului de control.

Obiecte externe sunt obiecte specifice cu o arhitectură clar definită și interfețe API. De exemplu, calculul sumei de control, registre, contoare, contoare etc.

extern register{
    register(bit<32> size);
    void read(out T result, in bit<32> index);
    void write(in bit<32> index, in T value);
}

extern Checksum16{
  Checksum16();    //constructor
  void clear();    //prepare unit for computation
  void update(in T data);    //add data to checksum
  void remove(in T data);  /remove data from existing checksum
  bit<16> get(); //get the checksum for the data added since last clear
}

Metadate — structuri de date asociate fiecărui pachet.

Există 2 tipuri de metadate:

  Metadate personalizate (structură goală pentru toate pachetele)
    Poți pune tot ce vrei aici
    Disponibil în toată conducta
    convenabil pentru utilizare în scopuri proprii, de exemplu, pentru stocarea unui hash de pachet

  Metadate interne - furnizate de arhitectură
    Portul de intrare, portul de ieșire sunt definite aici
    Marca temporală când pachetul a fost pus în coadă, adâncimea cozii
    multicast hash / multicast coada
    Prioritatea pachetului, importanța pachetului
    Specificația portului de ieșire (de exemplu, coada de ieșire)

compilator P4

Compilatorul P4 (P4C) generează:

  1. Timpul de rulare al planului de date
  2. API pentru gestionarea stării mașinii în planul de date

Limbajul de programare P4

Exemplu de comutator software în limba P4

Codurile sursă pot fi descărcate din depozit.

p4lang/p4c-bm: creează configurația JSON pentru bmv2
p4lang/bmv2: un comutator software care înțelege configurațiile JSON ale versiunii bmv2

Figura prezintă diagrama de compilare a proiectului:

Limbajul de programare P4

Manipulari cu tabele, registre de citire, contoare:

  • table_set_default <table name> <action name> <action parameters>
  • table_add <table name> <action name> <match fields> => <action
    parameters> [priority]
  • table_delete <table name> <entry handle>


Codul sursă conține programul simple_switch_CLI pentru utilizarea convenabilă a API-ului de comutare software.

Puteți descărca acest exemplu și alte exemple din depozit.

Limbajul de programare P4

PS La începutul acestei veri, Intel a semnat un acord pentru achiziționarea Barefoot Networks într-un efort de a răspunde rapid nevoilor utilizatorilor Hyperscale Cloud. După cum a spus Navin Shenoy (vicepreședinte executiv și director general al Data Center Group la Intel Corporation), acest lucru va permite Intel să ofere sarcini de lucru mai mari și mai multe oportunități pentru clienții centrelor de date.

În opinia mea personală, nu trebuie să uităm că Intel este lider în producția de cipuri FPGA și are un mediu Quartus excelent. Aceasta înseamnă că ne putem aștepta ca odată cu venirea Intel, Barefoot nu numai că își va extinde linia de produse, dar și Quartus și P4 Studio vor primi actualizări și completări serioase la linia Toffino și Toffino 2.

Membru oficial al comunității P4 - companie Grup de factori.

Sursa: www.habr.com

Adauga un comentariu