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 específico de dominio con una serie de construcciones optimizadas para el enrutamiento de la red.
P4 es un lenguaje de código abierto con licencia y con el apoyo de una organización sin fines de lucro llamada P4 Language Consortium. También cuenta con el apoyo de Open Networking Foundation (ONF) y Linux Foundation (LF), las dos organizaciones paraguas más grandes en proyectos de redes de código abierto.
El lenguaje se acuñó originalmente en 2013 y se describió en 2014 en un documento SIGCOMM CCR titulado "Protocolo independiente, programación del procesador de enrutamiento de paquetes".
Desde su inicio, P4 ha crecido exponencialmente y ha evolucionado, convirtiéndose rápidamente en el estándar para describir la transmisión de paquetes por dispositivos de red, incluidos adaptadores de red, conmutadores y enrutadores.
"SDN ha transformado la industria de la red, y P4 lleva a SDN al siguiente nivel, proporcionando programabilidad en el campo del enrutamiento", dijo Guru Parulkar, director ejecutivo de la Open Networking Foundation.
El lenguaje P4 fue creado originalmente 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 pueda aprender en un día, y usarlo para describir con precisión cómo se envían los paquetes a través de la red.
Desde el principio, P4 fue diseñado para ser independiente del objetivo (es decir, un programa escrito en P4 podría compilarse sin cambios para diversos fines, como ASIC, FPGA, CPU, NPU y GPU).
Además, el lenguaje es independiente del protocolo (es decir, el programa P4 puede describir los protocolos estándar existentes o puede usarse para indicar nuevos modos de direccionamiento personalizados).
En la industria, P4 se usa para dispositivos de programación. Quizás en el futuro, los estándares de Internet-RFC e IEEE también incluyan la especificación P4.
P4 se puede usar para dispositivos programables y de función fija. Por ejemplo, se utiliza para registrar con precisión el comportamiento de la tubería del conmutador en las API de la interfaz de abstracción del conmutador (SAI) utilizadas por el SO de conmutador SONiC de código abierto. P4 también se usa en el proyecto ONF Stratum para describir el comportamiento de conmutación en una variedad de dispositivos fijos y programables.
Describir el comportamiento del conmutador y los adaptadores de red por primera vez le permite crear un modelo ejecutable preciso de toda la red antes de la implementación. Los grandes proveedores de la nube pueden probar y depurar completamente la red utilizando software, lo que reduce significativamente el tiempo y el costo de probar las interacciones de laboratorio sin requerir equipos costosos.
Al usar P4, los proveedores de equipos de red pueden confiar en el comportamiento de enrutamiento básico común en todos los productos, lo que permite la reutilización de la infraestructura de prueba, simplifica el desarrollo del software de administración y, en última instancia, garantiza la interoperabilidad.
Por supuesto, P4 puede usarse para escribir programas que describan métodos de enrutamiento completamente nuevos. Por ejemplo, P4 se usa ampliamente para telemetría y mediciones en centros de datos, redes empresariales y proveedores de servicios.
La comunidad de investigación también se ha intensificado. Varios grupos de investigación de tecnología de redes académicas líderes han publicado nuevas aplicaciones interesantes basadas en programas P4, que incluyen equilibrio de carga, protocolos consistentes y almacenamiento en caché de valores clave. Se está creando un nuevo paradigma de programación, las innovaciones se están moviendo del hardware al software, lo que permite que aparezcan muchas ideas inesperadas, nuevas y brillantes.
La comunidad de desarrollo ha realizado importantes contribuciones al desarrollo de código, incluidos compiladores, canalizaciones, modelos de comportamiento, API, entornos de prueba, aplicaciones y más. Hay desarrolladores dedicados en compañías como Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx y ZTE; de universidades, incluyendo 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, resaltan el hecho de que P4 es un proyecto comunitario independiente.
Generación típica de controlador P4:
Perspectivas de aplicación
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:
- Independencia de la implementación del objetivo;
- Independencia de los protocolos utilizados;
- Reconfigurabilidad de campo.
Independencia de la implementación objetivoLos programas P4 están diseñados para ser independientes de la implementación, lo que significa que pueden compilarse para muchos tipos diferentes de máquinas ejecutivas, como procesadores de propósito general, FPGA, sistemas en chip, procesadores de red y ASIC. Estos diversos tipos de máquinas se conocen como objetivos P4, y se requiere un compilador para cada objetivo para convertir el código fuente P4 al modelo de interruptor de destino. El compilador puede integrarse en el dispositivo de destino, software externo o incluso un servicio en la nube. Dado que muchos de los objetivos originales de los programas P4 se utilizaron para el cambio simple de paquetes, a menudo se puede escuchar el término "cambio P4", incluso si el uso de "P4 objetivo" es más correcto.
Independencia de los protocolos utilizadosP4 es independiente del protocolo. Esto significa que el lenguaje no tiene soporte incorporado para protocolos comunes como IP, Ethernet, TCP, VxLAN o MPLS. En cambio, el programador P4 describe los formatos de encabezado y los nombres de campo de los protocolos requeridos en el programa, que a su vez son interpretados y procesados por el programa compilado y el dispositivo de destino.
Reconfigurabilidad de campoLa independencia del protocolo y el modelo de lenguaje abstracto permiten la reconfigurabilidad: los objetivos P4 deberían poder cambiar el procesamiento de los paquetes después de implementar el sistema. Esta característica se ha asociado tradicionalmente al enrutamiento a través de procesadores de propósito general o procesadores de red, en lugar de circuitos integrados con funciones fijas.
Aunque no existe un lenguaje que pueda evitar la optimización de un determinado conjunto de protocolos, estas optimizaciones son invisibles para el autor del lenguaje y pueden, en última instancia, reducir la flexibilidad del sistema y el propósito y su reconfigurabilidad.
Estas características del lenguaje fueron establecidas originalmente por sus creadores con una orientación a su uso generalizado en la infraestructura de red.
El lenguaje ya se usa en muchas empresas:
1) centros de datos de hiperescala;La compañía china Tencent es la compañía de inversión más grande del mundo y una de las compañías de capital de riesgo más grandes. Las filiales de Tencent, tanto en China como en otros países del mundo, se especializan en diversas áreas de negocios de alta tecnología, incluidos diversos servicios de Internet, desarrollos en el campo de la inteligencia artificial y el 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 en notar la rápida introducción de P4 en la industria de redes y, en particular, en el campo del diseño arquitectónico de centros de datos.
2) empresas comerciales;Goldman Sachs, aprovechando el trabajo con la comunidad de código abierto y desarrollando estándares y soluciones comunes, ya está aportando innovación a la infraestructura de red y brindando las mejores soluciones para los clientes.
3) producción;Toda la industria de la red se beneficiará de un lenguaje como P4, que define de manera única el comportamiento de desvío de llamadas. También considere en Cisco transferir sus líneas de productos para usar este lenguaje.
Juniper Networks ha incluido el tiempo de ejecución P4 y P4 en varios productos, y proporciona acceso programático al procesador integrado de Juniper y su código de programa.
Ruijie Networks es un defensor activo de P4 y los beneficios que aporta a las redes. Con P4, una empresa puede crear y ofrecer las mejores soluciones para una amplia gama de clientes.
4) proveedores de telecomunicaciones;AT&T fue uno de los primeros partidarios de P4, uno de los primeros en usar P4 para determinar el comportamiento que quería ver en las redes y en usar dispositivos de reenvío programables P4 en su red.
Deutsche Telekom utiliza el lenguaje para crear prototipos de funciones clave de red como parte de Access 4.0.
5) industria de semiconductores;El lenguaje hizo posible implementar un nuevo paradigma para transferir capacidades de software al plano de enrutamiento de red de Barefoot.
Xilinx fue uno de los fundadores de P4.org y participó activamente en el desarrollo del lenguaje P4 y lo implementó en plataformas programables basadas en FPGA para equipos SmartNIC y NFV, lanzando uno de los primeros compiladores P4
16 como parte del diseño SDNet.
6) Software.VMware cree que P4 crea una gran energía, innovación y una comunidad que conduce a una transformación significativa y necesaria en la red. VMware fue originalmente parte de este movimiento de la industria, ya que una nueva ola de innovación es impulsada por enfoques de software que amplían las capacidades de la infraestructura y la implementan en los últimos productos.
Por lo tanto, P4 es un lenguaje de programación independiente del objetivo y del protocolo utilizado por la industria y la comunidad científica para determinar de manera única el comportamiento del enrutamiento de paquetes como un programa, que, a su vez, puede compilarse para varios propósitos. Los objetivos de hoy incluyen conmutadores de hardware y software, conmutadores de hipervisor, NPU, GPU, FPGA, SmartNIC y ASIC.
Las características principales del lenguaje amplían significativamente el alcance de su aplicación y proporcionan su rápida implementación en la arquitectura de red.
Por donde empezar
P4 es un proyecto de código abierto; toda la información actual está en el
sitio web de
P4.orgEnlace al repositorio
https://github.com/p4lang , donde puede obtener el código fuente de los ejemplos y materiales de capacitación.
Complemento para Eclipse con soporte P4, pero podemos recomendar
P4 Studio de Barefoot.
Analicemos las principales abstracciones del núcleo:
Definición de encabezados : con su ayuda, se definen los encabezados del protocolo.
La definición de conjuntos de encabezados:
- Descripción de formatos de paquete y nombres de campo de encabezado
- campos permitidos fijos y variables
Por ejemplo
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;
}
Los analizadores son su tarea de analizar encabezados.
El siguiente ejemplo de analizador determinará la transición del estado final de una máquina de un estado inicial a uno de los dos finales:
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;
}
}…
}
Tablas : contienen el estado de la máquina que asocia claves de usuario con acciones.
Acciones : una descripción de cómo se debe manipular el paquete.
Las tablas contienen estados (definidos a nivel gerencial) para reenviar paquetes, describen la unidad de acción de coincidencia
La correspondencia de paquetes se realiza mediante:
- Partido exacto
- Partido más largo con un prefijo (LPM)
- Triple coincidencia (enmascaramiento)
table ipv4_lpm{
reads {
ipv4.dstAddr: lpm;
} actions {
forward();
}
}
Todas las acciones posibles deben definirse en las tablas de antemano.
Las acciones consisten en código y datos. Los datos llegan al nivel de gestión (por ejemplo, direcciones IP / números de puerto). Ciertas primitivas sin bucle se pueden especificar directamente en acción, pero el número de comandos debe ser predecible. Por lo tanto, las acciones no pueden contener ningún bucle o declaración condicional.
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;
}
Módulos Match-Action : acciones para crear una clave de búsqueda, buscar en una tabla, realizar acciones.
Un ejemplo de módulo típico se muestra en la figura:
Flujo de control : indica el orden de aplicación de los módulos Match-Action. Este es un programa imperativo que define la lógica de alto nivel y la secuencia Match-Action. El flujo de control vincula todos los objetos, configurando el nivel de control.
Los objetos externos son
objetos específicos con una arquitectura y API claramente definidas. Por ejemplo, cálculo de suma de control, registros, contadores, contadores, 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
}
Los metadatos son la estructura de datos asociada con cada paquete.
Hay 2 tipos de metadatos:
Metadatos personalizados (estructura vacía para todos los paquetes)Puedes poner todo lo que quieras aquí
Disponible en toda la tubería
conveniente para su propio uso, por ejemplo, para almacenar el hash de un paquete
Metadatos internos: proporcionados por la arquitecturaEl puerto de entrada, el puerto de salida se definen aquí
Marca de tiempo cuando el paquete estaba en cola, profundidad de la cola
hash de multidifusión / cola de multidifusión
Prioridad del paquete, importancia del paquete
Especificación del puerto de salida (por ejemplo, cola de salida)
Compilador P4
El compilador P4 (P4C) genera:
- Tiempo de ejecución del plano de datos
- API para control de estado de máquina en plano de datos
Un ejemplo de cambio de software en P4
Los códigos fuente se pueden descargar desde el repositorio.
p4lang / p4c-bm: crea una configuración JSON para bmv2
p4lang / bmv2: un conmutador de software que comprende las configuraciones JSON de la versión bmv2
La figura muestra el diagrama de compilación del proyecto:
Manipulaciones con tablas, registros de lectura, contador:
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>
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>
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>
El código fuente contiene el programa simple_switch_CLI para un uso conveniente de la API de cambio de software.
Puede descargar este y otros ejemplos en el repositorio.
PD: a principios del verano, Intel firmó un acuerdo para adquirir Barefoot Networks, con el objetivo de satisfacer rápidamente las necesidades de los usuarios de Hyperscale Cloud. Según Navin Shenoy (vicepresidente ejecutivo y gerente general del Grupo de centros de datos de Intel Corporation), esto permitirá a Intel proporcionar mayores cargas de trabajo y más oportunidades para los clientes de centros de datos.
En mi opinión personal, no olvide que Intel es líder en la producción de chips FPGA y tiene un excelente entorno Quartus. Por lo tanto, puede esperar que con la llegada de Intel, Barefoot no solo expanda su línea de productos, sino que Quartus y P4 Studio también reciban actualizaciones serias y adiciones a la línea Toffino y Toffino 2.
El miembro oficial de la comunidad P4 es
Factor Group .