Lenguaje de programación P4

Lenguaje de programación P4
P4 es un lenguaje de programación diseñado para programar reglas de enrutamiento de paquetes. A diferencia de un lenguaje de propósito general como C o Python, P4 es un lenguaje orientado a objetos con varias construcciones optimizadas para el enrutamiento de redes.

P4 es un lenguaje de código abierto, licenciado y mantenido por una organización no lucrativa llamada P4 Language Consortium. También cuenta con el apoyo de la Open Networking Foundation (ONF) y la Linux Foundation (LF), dos de las mayores organizaciones paraguas en proyectos de código abierto en tecnología de redes.
El lenguaje fue concebido inicialmente en 2013 y descrito en 2014 en un documento de SIGCOMM CCR titulado 'Programación de procesadores de enrutamiento de paquetes independiente del protocolo'.

Desde su creación, P4 ha crecido y evolucionado exponencialmente, convirtiéndose rápidamente en el estándar para describir la transmisión de paquetes en dispositivos de red, incluyendo adaptadores de red, conmutadores y enrutadores.

«SDN ha transformado la industria de redes, y P4 lleva SDN a un nuevo nivel al proporcionar programabilidad en el área de enrutamiento», dijo Guru Parulkar, director ejecutivo de la Open Networking Foundation.

El lenguaje P4 fue creado inicialmente por un grupo de ingenieros e investigadores de Google, Intel, Microsoft Research, Barefoot, Princeton y Stanford. El objetivo era simple: crear un lenguaje fácil de usar que un desarrollador de software pudiera aprender en un día y utilizar para describir con precisión cómo se reenvían los paquetes en la red.

Desde el principio, P4 fue desarrollado como independiente de la plataforma (es decir, un programa escrito en P4 podría ser compilado sin cambios para ejecutarse en diferentes plataformas, como ASIC, FPGA, CPU, NPU y GPU).

El lenguaje también es independiente de protocolos (es decir, un programa P4 puede describir protocolos estándar existentes o usarse para especificar nuevos modos de direccionamiento personalizados).

En la industria, P4 se utiliza para programar dispositivos. Es posible que en el futuro los estándares Internet-RFC y IEEE también incluyan la especificación P4.

P4 se puede utilizar tanto para dispositivos programables como para dispositivos de función fija. Por ejemplo, se utiliza para la grabación precisa del comportamiento de un conector de conmutación en las interfaces de programación de aplicaciones (API) de la interfaz de abstracción de conmutadores (SAI), utilizadas por sistemas operativos de conmutadores de código abierto como SONiC. P4 también se utiliza en el proyecto ONF Stratum para describir el comportamiento de conmutación a través de múltiples dispositivos fijos y programables.

La descripción del comportamiento de los conmutadores y adaptadores de red permite por primera vez crear un modelo ejecutable preciso de toda la red antes de la implementación. Los grandes proveedores de nube pueden probar y depurar completamente la red con software, lo que reduce considerablemente el tiempo y los costos de prueba de la interacción en el laboratorio, sin necesidad de costosos equipos.

Al utilizar P4, los proveedores de equipos de red pueden contar con un comportamiento básico de enrutamiento coherente en todos sus productos, lo que permite reutilizar la infraestructura de pruebas, simplifica el desarrollo de software de gestión y, en última instancia, garantiza la compatibilidad.

Por supuesto, P4 se puede utilizar para escribir programas que describan formas completamente nuevas de enrutamiento. Por ejemplo, P4 se utiliza ampliamente para telemetría y mediciones en centros de datos, redes empresariales y proveedores de servicios.

La comunidad investigadora también ha cobrado impulso. Varios grupos de investigación académica líderes en tecnologías de red han publicado nuevas aplicaciones interesantes basadas en programas de P4, incluyendo balanceo de carga, protocolos acordes y almacenamiento en caché de valores clave. Se está creando una nueva paridad de programación, las innovaciones se trasladan del hardware al software, lo que permite la aparición de muchas ideas inesperadas, nuevas y geniales.

La comunidad de desarrolladores ha realizado una contribución significativa al desarrollo de código, incluidos compiladores, programas en canal, modelos de comportamiento, interfaces API, entornos de pruebas, aplicaciones y mucho más. Desarrolladores dedicados se encuentran en empresas como Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx y ZTE; de universidades que incluyen BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass y USI; y proyectos de código abierto, incluidos CORD, FD.io, OpenDaylight, ONOS, OvS, SAI y Stratum, subrayando el hecho de que P4 es un proyecto comunitario independiente.

Generación típica de controladores para el lenguaje P4:

Lenguaje de programación P4

Perspectivas de aplicación

Lenguaje de programación P4
Dado que el lenguaje está destinado a aplicaciones de enrutamiento, la lista de requisitos y opciones de diseño es diferente en comparación con los lenguajes de programación de propósito general. Las características principales del lenguaje son:

  1. Independencia de la implementación objetivo;
  2. Independencia del protocolo(s) utilizado(s);
  3. Reconfigurabilidad de los campos.

Independencia de la implementación objetivo

Los programas P4 se desarrollan de manera que no dependen de la implementación, es decir, pueden ser compilados para muchos tipos diferentes de máquinas ejecutoras, como CPU de propósito general, FPGA, sistemas en chip, procesadores de red y ASIC. Estos diferentes tipos de máquinas se conocen como objetivos P4, y para cada objetivo se requiere un compilador para transformar el código fuente de P4 en un modelo de conmutador objetivo. El compilador puede estar integrado en el dispositivo objetivo, software externo o incluso un servicio en la nube. Dado que muchos de los objetivos iniciales para los programas P4 se utilizaron para la simple conmutación de paquetes, a menudo se escucha el término 'conmutador P4', incluso si el uso de 'objetivo P4' es más preciso.

Independencia del protocolo(s) utilizado(s)

P4 es independiente de los protocolos. Esto significa que el lenguaje no cuenta con soporte integrado para protocolos comunes como IP, Ethernet, TCP, VxLAN o MPLS. En cambio, el programador de P4 describe los formatos de encabezados y los nombres de los campos de los protocolos requeridos en el programa, que a su vez son interpretados y procesados por el programa compilado y el dispositivo objetivo.

Reconfigurabilidad de los campos

La independencia del protocolo y el modelo de lenguaje abstracto permiten la reconfigurabilidad: los objetivos de P4 deben poder cambiar el procesamiento de paquetes después del despliegue del sistema. Esta capacidad se asocia tradicionalmente con el enrutamiento a través de procesadores de propósito general o procesadores de red, y no con circuitos integrados de funciones fijas.

Aunque el lenguaje no tiene nada que impida optimizar el funcionamiento de un conjunto específico de protocolos, estas optimizaciones son invisibles para el autor del lenguaje y pueden, en última instancia, reducir la flexibilidad del sistema y sus objetivos de reconfigurabilidad.

Estas características del lenguaje fueron diseñadas por sus creadores con la mirada puesta en su uso generalizado en la infraestructura de red.

El lenguaje ya está siendo utilizado en muchas empresas:

1) Centros de datos hiperescalables;

La empresa china Tencent es la mayor empresa de inversión en el mundo y una de las mayores empresas de capital de riesgo. Las subsidiarias de Tencent, tanto en China como en otros países del mundo, se especializan en varias áreas de negocios de alta tecnología, incluidos diversos servicios de internet, desarrollos en inteligencia artificial y entretenimiento electrónico.

P4 y el enrutamiento programable son tecnologías avanzadas que se utilizan en la arquitectura de red de la empresa.

Como uno de los creadores, Google se enorgullece de la rápida adopción de P4 en la industria de redes y, en particular, en el ámbito del diseño arquitectónico de centros de datos.

2) Empresas comerciales;

Goldman Sachs, aprovechando los beneficios de trabajar con la comunidad de código abierto y desarrollar estándares y soluciones comunes, ya está trayendo innovación a la infraestructura de red y ofreciendo las mejores soluciones a sus clientes.

3) Manufactura;

Toda la industria de redes se beneficiará de un lenguaje como P4, que define de manera clara el comportamiento de la redirección. Cisco también comparte esta visión, trasladando sus líneas de productos para utilizar este lenguaje.

Juniper Networks ha incorporado P4 y P4 Runtime en una serie de productos, y proporciona acceso programático al procesador integrado de Juniper y su código.

Ruijie Networks es un defensor activo de P4 y de las ventajas que aporta a las redes. Con P4, la empresa puede crear y ofrecer soluciones de clase mundial para una amplia gama de clientes.

4) Proveedores de telecomunicaciones;

AT&T fue uno de los primeros defensores de P4, siendo uno de los primeros en usar P4 para definir el comportamiento que querían ver en las redes, utilizando dispositivos de reenvío programables P4 en su red.

En Deutsche Telekom, el lenguaje se utiliza para prototipar funciones clave de la red dentro del programa Access 4.0.

5) Industria de semiconductores;

El lenguaje permitió implementar un nuevo paradigma en la transmisión de capacidades de software en la capa de enrutamiento de la red por parte de Barefoot.

Xilinx fue uno de los fundadores de P4.org y participó activamente en el desarrollo del lenguaje P4, implementándolo en plataformas programables basadas en FPGA para equipos SmartNIC y NFV, lanzando uno de los primeros compiladores P416 como parte del diseño de SDNet.

6) Software.

En VMware creen que P4 genera una gran energía, innovación y comunidad, lo que lleva a transformaciones significativas y necesarias en la red. VMware fue parte de este movimiento industrial desde el principio, ya que una nueva ola de innovaciones es impulsada por enfoques basados en software que amplían las capacidades de la infraestructura y se implementan en productos de última generación.

Así, P4 es un lenguaje de programación independiente de propósito y protocolo que es utilizado por la industria y la comunidad científica para definir de manera inequívoca el comportamiento de enrutamiento de paquetes como un programa que, a su vez, puede ser compilado para múltiples propósitos. Hoy en día, los propósitos incluyen conmutadores de hardware y software, conmutadores hipervisores, NPU, GPU, FPGA, SmartNIC y ASIC.

Las características principales del lenguaje amplían significativamente sus aplicaciones y permiten su rápida implementación en arquitecturas de redes.

¿Por dónde empezar?

P4 es un proyecto abierto, toda la información actual se encuentra en el sitio P4.org

Enlace al repositorio https://github.com/p4lang, donde puedes obtener el código fuente de ejemplos y materiales de capacitación.

Plugin para Eclipse con soporte para P4, pero podemos recomendarte P4 Studio de Barefoot.

Lenguaje de programación P4

Analicemos las principales abstracciones del núcleo:

Definición de encabezados — con ellos se determinan los encabezados del protocolo.

En la definición de encabezados se establece:

  • la descripción de los formatos de paquete y los nombres de los campos de encabezado
  • campos permitidos fijos y variables

Por ejemplo,

encabezado Ethernet_h{
    bitdstAddr;
    bitsrcAddr;
    bitetherType;
}

encabezado IPv4_h{
    bit  versión;
    bit  ihl;
    bit  diffserv;
    bit  longitudTotal;
    bit  identificación;
    bit  banderas;
    bit  desplazamientoFrag;
    bit  ttl;
    bit  protocolo;
    bit  sumaDeVerificaciónHdr;
    bit  dirAddrOrig;
    bit  dirAddrDest;
    varbit  opciones;
}

Analizadores — su tarea es analizar los encabezados.

El siguiente ejemplo de analizador determinará la transición del estado final de la máquina desde un estado inicial a uno de dos finales:

Lenguaje de programación P4

analizador MiAnalizador(){
 estado inicio{transición analizar_ethernet;}
 estado analizar_ethernet{
    paquete.extraer(hdr.ethernet);
    transición seleccionar(hdr.ethernet.etherType){
        TIPO_IPV4: analizar_ipv4;
        por defecto: aceptar;
        }
    }…
}

Tablas — contienen los estados de la máquina que vinculan las claves de usuario con las acciones. Acciones — descripción de cómo se debe manipular el paquete.

Las tablas contienen estados (definidos en un nivel de gestión) para el reenvío de paquetes, describen la unidad de acción Match-Action.

La coincidencia de paquetes se realiza mediante:

  • Coincidencia exacta
  • La coincidencia más larga con prefijo (LPM)
  • Coincidencia triple (enmascaramiento)

tabla ipv4_lpm{
    lecturas{
        ipv4.dstAddr: lpm;
    } actions {
        redireccionar();
    }
}

Todas las acciones posibles deben definirse en las tablas previamente.

Las acciones consisten en código y datos. Los datos provienen del nivel de gestión (por ejemplo, direcciones IP/números de puerto). Los primitivos definidos, sin ciclos, pueden ser especificados directamente en la acción, pero el número de comandos debe ser predecible. Por lo tanto, las acciones no pueden contener ciclos ni operadores condicionales.

acción 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;
}

Módulos Match-Action — acciones para crear una clave de búsqueda, buscar en la tabla, ejecutar acciones.

Un ejemplo típico de módulo se muestra en la figura:

Lenguaje de programación P4

Flujo de control — indica el orden de aplicación de los módulos Match-Action. Es un programa imperativo que define la lógica de alto nivel y la secuencia Match-Action. El flujo de control conecta todos los objetos, estableciendo el nivel de control.

Objetos externos — son objetos específicos con una arquitectura y interfaces API claramente definidas. Por ejemplo, cálculo de suma de verificación, registros, contadores, etc.

extern registrar{
    registrar(bit tamaño);
    void leer(out T resultado, in bit índice);
    void escribir(in bit índice, in T valor);
}

extern Checksum16{
  Checksum16();    //constructor
  void clear();    //preparar unidad para el cálculo
  void update(in T data);    //agregar datos al checksum
  void remove(in T data);  //eliminar datos del checksum existente
  bitget(); //obtener el checksum de los datos añadidos desde la última limpieza
}

Metadatos — estructuras de datos asociadas a cada paquete.

Existen 2 tipos de metadatos:

  Metadatos personalizados (estructura vacía para todos los paquetes)
    Puedes poner aquí lo que quieras
    Disponible a lo largo de todo el pipeline
    conveniente para usar para tus propios fines, por ejemplo, para almacenar el hash del paquete

  Metadatos internos — proporcionados por la arquitectura
    El puerto de entrada y el puerto de salida se definen aquí
    Marca de tiempo cuando el paquete fue puesto en cola, profundidad de la cola
    multicast hash / multicast queue
    Prioridad del paquete, importancia del paquete
    Especificación del puerto de salida (por ejemplo, cola de salida)

Compilador P4

El compilador P4 (P4C) genera:

  1. Tiempo de ejecución del plano de datos
  2. API para gestionar el estado de la máquina en el plano de datos

Lenguaje de programación P4

Ejemplo de un conmutador programable en lenguaje P4

Los códigos fuente se pueden descargar del repositorio.

p4lang/p4c-bm: crea una configuración JSON para bmv2
p4lang/bmv2: conmutador programable que entiende configuraciones JSON de la versión bmv2

En la figura se muestra el esquema de compilación del proyecto:

Lenguaje de programación P4

Manipulaciones con tablas, registros de lectura, contadores:

  • conjunto_tabla_por_defecto <table name> <action name> <action parameters>
  • agregar_tabla <table name> <action name> <match fields> => &lt;action
    parameters> [priority]
  • eliminar_tabla <table name> <entry handle>


En los códigos fuente se incluye el programa simple_switch_CLI para un fácil uso de la API del conmutador programable.

Este y otros ejemplos se pueden descargar del repositorio.

Lenguaje de programación P4

P.D. A principios del verano, la empresa Intel firmó un acuerdo para adquirir Barefoot Networks, con el objetivo de satisfacer rápidamente las necesidades de los usuarios de Hyperscale Cloud. Como declaró Navin Shenoy (vicepresidente ejecutivo y gerente general del Grupo de Centros de Datos de Intel Corporation) — esto permitirá a Intel ofrecer mayores cargas de trabajo y más oportunidades para los clientes de centros de datos.

En mi opinión personal, no se debe olvidar que Intel es un líder en la producción de chips FPGA y tiene un excelente entorno Quartus. Por lo tanto, se puede esperar que, con la llegada a Intel, Barefoot no solo aumente su línea de producción, sino que también Quartus y P4 Studio recibirán importantes actualizaciones y una nueva línea de Toffino y Toffino 2.

Miembro oficial de la comunidad P4 — la empresa Factor Group.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster