Linguaggio di programmazione P4

Linguaggio di programmazione P4
P4 è un linguaggio di programmazione progettato per la programmazione delle regole di instradamento dei pacchetti. A differenza di un linguaggio di programmazione generale come C o Python, P4 è un linguaggio orientato all'argomento con una serie di costrutti ottimizzati per l'instradamento di rete.

P4 è un linguaggio open source, con licenza e supportato da un'organizzazione non profit chiamata P4 Language Consortium. È anche supportato da Open Networking Foundation (ONF) e Linux Foundation (LF), le due più grandi organizzazioni ombrello nei progetti open source nel campo delle tecnologie di rete.
Il linguaggio è stato originariamente concepito nel 2013 e descritto nel 2014 in un documento SIGCOMM CCR intitolato "Programmazione indipendente dai protocolli per l'istradamento dei pacchetti".

Dalla sua creazione, P4 è cresciuto ed evoluto in modo esponenziale, diventando rapidamente lo standard per la descrizione del trasferimento dei pacchetti da parte dei dispositivi di rete, inclusi adattatori di rete, switch e router.

"SDN ha trasformato l'industria della rete, e P4 porta SDN a un nuovo livello, offrendo programmabilità nel campo dell'instradamento," ha dichiarato Guru Parulkar, amministratore delegato di Open Networking Foundation.

Il linguaggio P4 è stato originariamente creato da un gruppo di ingegneri e ricercatori di Google, Intel, Microsoft Research, Barefoot, Princeton e Stanford. L'obiettivo era semplice: creare un linguaggio facile da usare che gli sviluppatori di software potessero imparare in un giorno e utilizzare per descrivere con precisione come i pacchetti vengono instradati nella rete.

Fin dall'inizio, P4 è stato sviluppato come indipendente dall'obiettivo (ossia, un programma scritto in P4 potrebbe essere compilato senza modifiche per essere eseguito su vari target, come ASIC, FPGA, CPU, NPU e GPU).

Il linguaggio è anche indipendente dal protocollo (ossia, un programma P4 può descrivere protocolli standard esistenti o essere utilizzato per specificare nuovi schemi di indirizzamento personalizzati).

Nel settore, P4 viene utilizzato per programmare dispositivi. È possibile che in futuro gli Internet-RFC e gli standard IEEE includano anche la specifica P4.

P4 può essere utilizzato sia per dispositivi programmabili che per dispositivi con funzione fissa. Ad esempio, viene utilizzato per registrare con precisione il comportamento del pipeline dello switch nelle interfacce API dell'interfaccia di astrazione dello switch (SAI), utilizzate dai sistemi operativi per switch open source come SONiC. P4 è anche utilizzato nel progetto ONF Stratum per descrivere il comportamento di commutazione attraverso una varietà di dispositivi fissi e programmabili.

La descrizione del comportamento degli switch e degli adattatori di rete consente per la prima volta di creare un modello eseguibile preciso dell'intera rete prima del deployment. I grandi fornitori di cloud possono testare e fare debugging dell'intera rete utilizzando software, riducendo significativamente i tempi e i costi di test delle interazioni in laboratorio, senza necessità di costose attrezzature.

Utilizzando P4, i fornitori di attrezzature di rete possono aspettarsi un comportamento di routing di base comune in tutti i prodotti, il che consente di riutilizzare l'infrastruttura di test, semplifica lo sviluppo del software di gestione e, infine, garantisce la compatibilità.

Naturalmente, P4 può essere utilizzato per scrivere programmi che descrivono modi del tutto nuovi di routing. Ad esempio, P4 è ampiamente utilizzato per la telemetria e le misurazioni nei data center, nelle reti aziendali e nei fornitori di servizi.

La comunità di ricerca si è attivata. Alcuni dei principali gruppi di ricerca accademica sulle tecnologie di rete hanno pubblicato interessanti nuove applicazioni basate sui programmi P4, inclusi bilanciamento del carico, protocolli concordati e caching di valore chiave. Si sta creando una nuova paridigama di programmazione, con innovazioni che si spostano dall'hardware al software, dando vita a molte idee inaspettate, nuove e geniali.

La community degli sviluppatori ha dato un contributo significativo nello sviluppo del codice, compresi compilatori, programmi a pipeline, modelli comportamentali, interfacce API, ambienti di test, applicazioni e molto altro. Sviluppatori devoti lavorano in aziende come Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx e ZTE; in università come BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass e USI; e progetti open source come CORD, FD.io, OpenDaylight, ONOS, OvS, SAI e Stratum, sottolineano il fatto che P4 è un progetto pubblico indipendente.

Generazione tipica di controller per il linguaggio P4:

Linguaggio di programmazione P4

Prospettive di applicazione

Linguaggio di programmazione P4
Poiché il linguaggio è progettato per applicazioni di routing, l'elenco dei requisiti e delle opzioni di design è diverso rispetto ai linguaggi di programmazione di uso generale. Le principali caratteristiche del linguaggio sono:

  1. Indipendenza dall'implementazione target;
  2. Indipendenza dai protocolli utilizzati;
  3. riconfigurabilità dei campi.

Indipendenza dall'implementazione target

I programmi P4 sono sviluppati in modo che non dipendano dall'implementazione, il che significa che possono essere compilati per diversi tipi di macchine di esecuzione, come processori di uso generale, FPGA, sistemi su chip, processori di rete e ASIC. Questi diversi tipi di macchine sono noti come obiettivi P4, e per ciascun obiettivo è necessario un compilatore per tradurre il codice sorgente P4 nel modello dell'interruttore target. Il compilatore può essere integrato nel dispositivo di destinazione, in un software esterno o persino in un servizio cloud. Poiché molti degli obiettivi iniziali per i programmi P4 sono stati utilizzati per una semplice commutazione dei pacchetti, è molto comune sentire il termine "interruttore P4", anche se l'uso di "obiettivo P4" è più accurato.

Indipendenza dai protocolli utilizzati

P4 è indipendente dai protocolli. Questo significa che il linguaggio non ha supporto integrato per protocolli comuni come IP, Ethernet, TCP, VxLAN o MPLS. Invece, il programmatore P4 descrive i formati degli header e i nomi dei campi dei protocolli richiesti nel programma, che a loro volta vengono interpretati e gestiti dal programma compilato e dal dispositivo target.

Riconfigurabilità dei campi

L'indipendenza dal protocollo e il modello di linguaggio astratto permettono la riconfigurabilità: gli obiettivi di P4 devono avere la possibilità di modificare l'elaborazione dei pacchetti dopo il dispiegamento del sistema. Questa capacità è tradizionalmente legata al routing tramite processori generali o processori di rete, e non circuiti integrati a funzioni fisse.

Sebbene nel linguaggio non ci sia nulla che ostacoli l'ottimizzazione del funzionamento di un insieme specifico di protocolli, queste ottimizzazioni sono invisibili all'autore del linguaggio e possono, infine, ridurre la flessibilità del sistema e degli obiettivi, così come la loro riconfigurabilità.

Queste caratteristiche del linguaggio sono state inizialmente concepite dai suoi creatori con l'intenzione di un uso diffuso nell'infrastruttura di rete.

Già adesso, il linguaggio è utilizzato in molte aziende:

1) Centri dati iperscalabili;

L'azienda cinese Tencent è la più grande compagnia di investimenti al mondo e una delle più grandi aziende di venture capital. Le sussidiarie di Tencent, sia in Cina che in altri paesi, si specializzano in vari settori dell'alta tecnologia, compresi diversi servizi internet, sviluppi nel campo dell'intelligenza artificiale e dell'intrattenimento elettronico.

P4 e il routing programmabile sono tecnologie all'avanguardia utilizzate nell'architettura di rete dell'azienda.

Essendo uno dei creatori, Google è orgogliosa di segnalare la rapida adozione di P4 nell'industria della rete e, in particolare, nel campo della progettazione architettonica dei data center.

2) Aziende commerciali;

Goldman Sachs, sfruttando i vantaggi di lavorare con la comunità open source e sviluppando standard e soluzioni comuni, sta già portando innovazione nell'infrastruttura di rete e fornendo le migliori soluzioni ai clienti.

3) Produzione;

L'intera industria della rete trarrà vantaggio da un linguaggio come P4, che definisce inequivocabilmente il comportamento del routing. Questa è anche la considerazione di Cisco, che sta trasferendo le proprie linee di prodotto all'uso di questo linguaggio.

Juniper Networks ha incluso P4 e P4 Runtime in una serie di prodotti, e fornisce accesso programmabile al processore integrato di Juniper e al suo codice sorgente.

Ruijie Networks è un attivo sostenitore di P4 e dei vantaggi che essa porta alle reti. Con P4, l'azienda è in grado di creare e fornire soluzioni di classe superiore per una vasta gamma di clienti.

4) Fornitori di telecomunicazioni;

AT&T è stata una delle prime sostenitrici di P4, la prima a utilizzare P4 per definire i comportamenti desiderati nelle reti e a impiegare dispositivi di instradamento programmabile P4 nella propria rete.

In Deutsche Telekom, il linguaggio è utilizzato per prototipare funzioni di rete chiave nell'ambito del programma Access 4.0.

5) Industria dei semiconduttori;

Il linguaggio ha permesso di realizzare una nuova paradigma per il trasferimento delle capacità del software nel piano di instradamento della rete da parte di Barefoot.

Xilinx è stata una delle fondatrici di P4.org e ha partecipato attivamente allo sviluppo del linguaggio P4, implementandolo su piattaforme programmabili basate su FPGA per l'hardware SmartNIC e NFV, rilasciando uno dei primi compilatori P416 come parte del design SDNet.

6) Software.

In VMware si ritiene che P4 crei una grande energia, innovazione e comunità, portando a trasformazioni significative e necessarie nelle reti. VMware è stata inizialmente parte di questo movimento dell'industria, poiché una nuova ondata di innovazioni è stata innescata da approcci software che ampliano le capacità dell'infrastruttura e la realizzano nei prodotti più recenti.

Pertanto, P4 è un linguaggio di programmazione indipendente dagli scopi e dai protocolli, utilizzato dall'industria e dalla comunità scientifica per definire in modo univoco il comportamento dell'instradamento dei pacchetti come programma, che può a sua volta essere compilato per più obiettivi. Oggi, gli obiettivi includono switch hardware e software, switch hypervisor, NPU, GPU, FPGA, SmartNIC e ASIC.

Le caratteristiche principali del linguaggio ampliano notevolmente i suoi ambiti di applicazione e garantiscono una sua rapida implementazione nelle architetture di rete.

Da dove cominciare

P4 è un progetto aperto; tutte le informazioni attuali sono disponibili sul sito P4.org

Link al repository https://github.com/p4lang, dove puoi trovare il codice sorgente degli esempi e materiali didattici.

Plugin per Eclipse con supporto P4, ma possiamo consigliare P4 Studio di Barefoot.

Linguaggio di programmazione P4

Esaminiamo le principali astrazioni del nucleo:

Definizione delle intestazioni — con il loro aiuto vengono definite le intestazioni del protocollo.

Nella definizione delle intestazioni è stabilito:

  • descrizione dei formati dei pacchetti e nomi dei campi delle intestazioni
  • campi consentiti fissi e variabili

Ad esempio

intestazione Ethernet_h{
    bitdstAddr;
    bitsrcAddr;
    bitetherType;
}

intestazione IPv4_h{
    bitversione;
    bitihl;
    bitdiffserv;
    bittotalLen;
    bitidentificazione;
    bitflag;
    bitfragOffset;
    bitttl;
    bitprotocollo;
    bithdrChecksum;
    bitsrcAddr;
    bitdstAddr;
    varbitopzioni;
}

Parser — il loro compito è analizzare le intestazioni.

Il seguente esempio di parser definirà la transizione dello stato finale della macchina da uno stato iniziale a uno dei due stati finali:

Linguaggio di programmazione P4

parser Il mioParser(){
 stato inizio{transizione analizza_ethernet;}
 stato analizza_ethernet{
    pacchetto.estrae(hdr.ethernet);
    transizione seleziona(hdr.ethernet.etherType){
        TIPO_IPV4: analizza_ipv4;
        default: accetta;
        }
    }…
}

Tabelle — contengono stati della macchina collegando chiavi utente a azioni. Azioni — descrizione di come manipolare il pacchetto.

Le tabelle contengono stati (definiti a livello di gestione) per l'inoltro dei pacchetti e descrivono l'unità di azione Match-Action

Il confronto dei pacchetti è effettuato secondo:

  • Corrispondenza esatta
  • La corrispondenza più lunga con prefisso (LPM)
  • Corrispondenza tripla (mascheramento)

table ipv4_lpm{
    legge{
        ipv4.dstAddr: lpm;
    } azioni {
        inoltra();
    }
}

Tutte le possibili azioni devono essere definite nelle tabelle in anticipo.

Le azioni consistono in codice e dati. I dati provengono dal livello di gestione (ad esempio, indirizzi IP / numeri di porte). Primitivi definiti e senza cicli possono essere specificati direttamente nell'azione, ma il numero di comandi deve essere prevedibile. Pertanto, le azioni non possono contenere cicli o operatori condizionali.

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

Moduli Match-Action — azioni per creare una chiave di ricerca, cercare nella tabella, eseguire azioni.

Un esempio tipico di modulo è mostrato nella figura:

Linguaggio di programmazione P4

Flusso di controllo — indica l'ordine di applicazione dei moduli Match-Action. È un programma imperativo che definisce la logica ad alto livello e la sequenza Match-Action. Il flusso di controllo collega tutti gli oggetti definendo il livello di gestione.

Oggetti esterni — sono oggetti specifici con architettura e interfacce API ben definite. Ad esempio, calcolo di checksum, registri, contatori, ecc.

esterno registrare{
    registrare(bit dimensione);
    void leggere(out T risultato, in bit indice);
    void scrivere(in bit indice, in T valore);
}

esterno Checksum16{
  Checksum16();    //costruttore
  void clear();    //preparare l'unità per i calcoli
  void update(in T data);    //aggiungere dati al checksum
  void remove(in T data);  //rimuovere dati dal checksum esistente
  bitget(); //ottenere il checksum per i dati aggiunti dall'ultimo clear
}

Metadati — strutture dati associate a ciascun pacchetto.

Esistono 2 tipi di metadati:

  Metadati utente (struttura vuota per tutti i pacchetti)
    Puoi mettere qui tutto ciò che desideri
    Disponibile lungo tutto il pipeline
    comodo per scopi propri, ad esempio, per memorizzare l'hash del pacchetto

  Metadati interni — forniti dall'architettura
    La porta di ingresso e la porta di uscita sono definite qui
    Timestamp di quando il pacchetto è stato messo in coda, profondità della coda
    multicast hash / multicast queue
    Priorità del pacchetto, importanza del pacchetto
    Specifiche della porta di uscita (ad esempio, coda di uscita)

Compilatore P4

Il compilatore P4 (P4C) genera:

  1. Runtime del data plane
  2. API per gestire lo stato della macchina nel data plane

Linguaggio di programmazione P4

Esempio di switch programmabile in linguaggio P4

I codici sorgente possono essere scaricati dal repository.

p4lang/p4c-bm: crea configurazione JSON per bmv2
p4lang/bmv2: switch software che comprende le configurazioni JSON della versione bmv2

Nella figura è mostrato il diagramma di compilazione del progetto:

Linguaggio di programmazione P4

Manipolazioni con le tabelle, i registri di lettura, i contatori:

  • imposta_tabella_predefinita <table name> <action name> <action parameters>
  • aggiungi tavolo <table name> <action name> <match fields> => &lt;azione
    parameters> [priority]
  • elimina_tabella <table name> <entry handle>


Nei codici sorgente è inclusa il programma simple_switch_CLI per un uso comodo dell'API dello switch programmabile.

Questo e altri esempi possono essere scaricati dal repository.

Linguaggio di programmazione P4

P.S. All'inizio dell'estate, Intel ha firmato un accordo per acquisire Barefoot Networks, con l'obiettivo di soddisfare rapidamente le esigenze degli utenti di Hyperscale Cloud. Come dichiarato da Navin Shenoy (vice presidente esecutivo e general manager del Data Center Group presso Intel Corporation) – questo permetterà a Intel di fornire carichi di lavoro maggiori e più opportunità per i clienti dei data center.

A mio parere, non bisogna dimenticare che Intel è leader nella produzione di chip FPGA e dispone di un ottimo ambiente Quartus. Ciò significa che, con l'arrivo in Intel, Barefoot non solo amplierà la sua linea di produzione, ma anche Quartus e P4 Studio aspettano aggiornamenti significativi e una nuova gamma di Toffino e Toffino 2.

Partecipante ufficiale della comunità P4 – azienda Fattore gruppo.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster