P4 é uma linguagem de programação projetada para programar regras de roteamento de pacotes. Ao contrário de uma linguagem de uso geral, como C ou Python, P4 é uma linguagem específica de domínio com várias construções otimizadas para roteamento de rede.
O P4 é um idioma de código aberto licenciado e suportado por uma organização sem fins lucrativos chamada P4 Language Consortium. Também é suportado pela Open Networking Foundation (ONF) e Linux Foundation (LF), as duas maiores organizações guarda-chuva em projetos de rede de código aberto.
O idioma foi originalmente cunhado em 2013 e descrito em 2014 em um documento SIGCOMM CCR intitulado “Independente de protocolo, programação de processador de roteamento de pacotes”.
Desde a sua criação, o P4 cresceu exponencialmente e evoluiu, tornando-se rapidamente o padrão para descrever a transmissão de pacotes por dispositivos de rede, incluindo adaptadores, comutadores e roteadores de rede.
“A SDN transformou o setor de redes e a P4 leva a SDN para o próximo nível, fornecendo programabilidade no campo do roteamento”, disse Guru Parulkar, diretor executivo da Open Networking Foundation.
A linguagem P4 foi criada originalmente por um grupo de engenheiros e pesquisadores do Google, Intel, Microsoft Research, Barefoot, Princeton e Stanford. O objetivo era simples: criar uma linguagem fácil de usar que um desenvolvedor de software possa aprender em um dia e usá-la para descrever com precisão como os pacotes são enviados pela rede.
Desde o início, o P4 foi projetado para ser independente da meta (ou seja, um programa escrito em P4 poderia ser compilado inalterado para vários propósitos, como ASIC, FPGA, CPU, NPU e GPU).
Além disso, o idioma é independente de protocolo (ou seja, o programa P4 pode descrever protocolos padrão existentes ou pode ser usado para indicar novos modos de endereçamento personalizados).
Na indústria, o P4 é usado para programar dispositivos. Talvez no futuro, os padrões Internet-RFC e IEEE também incluam a especificação P4.
P4 pode ser usado para dispositivos programáveis e de função fixa. Por exemplo, ele é usado para registrar com precisão o comportamento do pipeline do switch nas APIs da Interface de Abstração do Switch (SAI) usadas pelo OS SONiC do switch de código aberto. O P4 também é usado no projeto ONF Stratum para descrever o comportamento de comutação em uma variedade de dispositivos fixos e programáveis.
A descrição do comportamento dos comutadores e dos adaptadores de rede pela primeira vez permite criar um modelo executável preciso de toda a rede antes da implantação. Os grandes provedores de nuvem podem testar e depurar completamente a rede usando software, o que reduz significativamente o tempo e o custo de testar as interações do laboratório sem exigir equipamentos caros.
Usando o P4, os fornecedores de equipamentos de rede podem confiar no comportamento de roteamento básico e comum em todos os produtos, o que permite a reutilização da infraestrutura de teste, simplifica o desenvolvimento de software de gerenciamento e, finalmente, garante a interoperabilidade.
Obviamente, o P4 pode ser usado para escrever programas que descrevem métodos de roteamento completamente novos. Por exemplo, o P4 é amplamente usado para telemetria e medições em data centers, redes corporativas e provedores de serviços.
A comunidade de pesquisa também se intensificou. Vários grupos acadêmicos líderes em pesquisa de tecnologia de rede publicaram novos aplicativos interessantes baseados em programas P4, incluindo balanceamento de carga, protocolos consistentes e cache de valores-chave. Um novo paradigma de programação está sendo criado, as inovações estão passando do hardware para o software, o que permite que muitas idéias inesperadas, novas e brilhantes apareçam.
A comunidade de desenvolvimento fez contribuições significativas para o desenvolvimento de código, incluindo compiladores, pipelines, modelos comportamentais, APIs, ambientes de teste, aplicativos e muito mais. Existem desenvolvedores dedicados em empresas como Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx e ZTE; de universidades, incluindo BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass e USI; e projetos de código aberto, incluindo CORD, FD.io, OpenDaylight, ONOS, OvS, SAI e Stratum, destacam o fato de o P4 ser um projeto comunitário independente.
Geração típica do controlador P4:
Perspectivas de aplicação
Como o idioma é destinado aos aplicativos de roteamento, a lista de requisitos e opções de design é diferente em comparação às linguagens de programação de uso geral. As principais características do idioma são:
- Independência da implementação do objetivo;
- Independência do (s) protocolo (s) utilizado (s);
- Reconfigurabilidade de campo.
Independência da implementação de destinoOs programas P4 são projetados para serem independentes da implementação, o que significa que podem ser compilados para muitos tipos diferentes de máquinas executivas, como processadores de uso geral, FPGAs, sistemas on-chip, processadores de rede e ASICs. Esses vários tipos de máquinas são conhecidos como destinos P4 e é necessário um compilador para que cada destino converta o código-fonte P4 no modelo de chave de destino. O compilador pode ser incorporado no dispositivo de destino, software externo ou mesmo um serviço em nuvem. Como muitos dos objetivos originais dos programas P4 foram usados para a troca simples de pacotes, é possível ouvir o termo "switch P4", mesmo que o uso do "target P4" seja mais correto.
Independência do (s) protocolo (s) usado (s)P4 é independente de protocolo. Isso significa que o idioma não possui suporte interno para protocolos comuns, como IP, Ethernet, TCP, VxLAN ou MPLS. Em vez disso, o programador P4 descreve os formatos de cabeçalho e os nomes dos campos dos protocolos necessários no programa, que por sua vez são interpretados e processados pelo programa compilado e pelo dispositivo de destino.
Reconfigurabilidade de campoA independência do protocolo e o modelo de linguagem abstrata permitem a reconfigurabilidade - os destinos P4 devem poder alterar o processamento de pacotes após a implantação do sistema. Tradicionalmente, esse recurso é associado ao roteamento através de processadores de uso geral ou de rede, em vez de circuitos integrados com funções fixas.
Embora não exista uma linguagem que possa impedir a otimização de um determinado conjunto de protocolos, essas otimizações são invisíveis para o autor da linguagem e podem, em última instância, reduzir a flexibilidade do sistema e do objetivo e sua reconfigurabilidade.
Essas características do idioma foram originalmente estabelecidas por seus criadores, com uma orientação para seu amplo uso na infraestrutura de rede.
O idioma já é usado em muitas empresas:
1) datacenters em escala superior;A empresa chinesa Tencent é a maior empresa de investimentos do mundo e uma das maiores empresas de capital de risco. As subsidiárias da Tencent, na China e em outros países do mundo, são especializadas em várias áreas de negócios de alta tecnologia, incluindo vários serviços de Internet, desenvolvimentos no campo da inteligência artificial e entretenimento eletrônico.
P4 e roteamento programável são tecnologias avançadas usadas na arquitetura de rede da empresa.
Como um dos criadores, o Google se orgulha de observar a rápida introdução do P4 no setor de redes e, em particular, no campo do design arquitetônico de data centers.
2) empresas comerciais;A Goldman Sachs, aproveitando o trabalho com a comunidade de código aberto e desenvolvendo padrões e soluções comuns, já está trazendo inovação para a infraestrutura de rede e fornecendo as melhores soluções para os clientes.
3) produção;Todo o setor de rede se beneficiará de um idioma como o P4, que define exclusivamente o comportamento de desvio de chamadas. Considere também na Cisco a transferência de suas linhas de produtos para usar esse idioma.
A Juniper Networks incluiu o tempo de execução P4 e P4 em vários produtos e fornece acesso programático ao processador incorporado Juniper e seu código de programa.
A Ruijie Networks apoia ativamente o P4 e os benefícios que ele traz para as redes. Com o P4, uma empresa pode criar e fornecer as melhores soluções da categoria para uma ampla gama de clientes.
4) provedores de telecomunicações;A AT&T foi um dos primeiros apoiadores do P4, um dos primeiros a usar o P4 para determinar o comportamento que queria ver nas redes e a usar dispositivos de encaminhamento programáveis do P4 em sua rede.
A Deutsche Telekom usa o idioma para prototipar as principais funções da rede como parte do Access 4.0.
5) indústria de semicondutores;A linguagem tornou possível implementar um novo paradigma para transferir recursos de software para o plano de roteamento de rede pela Barefoot.
A Xilinx foi um dos fundadores da P4.org e participou ativamente do desenvolvimento da linguagem P4 e a implementou em plataformas programáveis baseadas em FPGA para equipamentos SmartNIC e NFV, lançando um dos primeiros compiladores P4
16 como parte do projeto SDNet.
6) Software.A VMware acredita que o P4 cria uma tremenda energia, inovação e uma comunidade que leva à transformação significativa e necessária na rede. A VMware foi originalmente parte desse movimento do setor, pois uma nova onda de inovação é impulsionada por abordagens de software que expandem os recursos da infraestrutura e os implementam nos produtos mais recentes.
Portanto, P4 é uma linguagem de programação independente de objetivo e independente de protocolo usada pela indústria e pela comunidade científica para determinar exclusivamente o comportamento do roteamento de pacotes como um programa que, por sua vez, pode ser compilado para vários propósitos. Os objetivos de hoje incluem comutadores de hardware e software, comutadores de hipervisor, NPUs, GPUs, FPGAs, SmartNICs e ASICs.
Os principais recursos do idioma expandem significativamente o escopo de seu aplicativo e fornecem sua rápida implementação na arquitetura de rede.
Por onde começar
P4 é um projeto de código aberto; todas as informações atuais estão no site
P4.orgLink para o repositório
https://github.com/p4lang , onde você pode obter o código fonte dos exemplos e materiais de treinamento.
Plug-in para Eclipse com suporte para P4, mas podemos recomendar o
P4 Studio da Barefoot.
Vamos analisar as principais abstrações do kernel:
Definição de cabeçalhos - com sua ajuda, os cabeçalhos do protocolo são definidos.
A definição de conjuntos de cabeçalhos:
- descrição dos formatos dos pacotes e dos nomes dos campos de cabeçalho
- campos permitidos fixos e variáveis
Por exemplo
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;
}
Analisadores são sua tarefa de analisar cabeçalhos.
O exemplo de analisador a seguir determinará a transição do estado final de uma máquina de um estado inicial para um dos dois finais:
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;
}
}…
}
Tabelas - contêm o estado da máquina que associa as chaves do usuário às ações.
Ações - Uma descrição de como o pacote deve ser manipulado.
As tabelas contêm estados (definidos no nível gerencial) para encaminhamento de pacotes, descrevem a unidade de ação de correspondência
A correspondência de pacotes é feita por:
- Correspondência exata
- Correspondência mais longa com um prefixo (LPM)
- Correspondência tripla (mascaramento)
table ipv4_lpm{
reads {
ipv4.dstAddr: lpm;
} actions {
forward();
}
}
Todas as ações possíveis devem ser definidas nas tabelas com antecedência.
Ações consistem em código e dados. Os dados chegam no nível de gerenciamento (por exemplo, endereços IP / números de porta). Determinadas primitivas sem loop podem ser especificadas diretamente em ação, mas o número de comandos deve ser previsível. Portanto, as ações não podem conter loops ou instruções condicionais.
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 - ações para criar uma chave de pesquisa, pesquisar em uma tabela, executar ações.
Um exemplo típico de módulo é mostrado na figura:
Controle de fluxo - indica a ordem dos aplicativos dos módulos Match-Action. Este é um programa imperativo que define a lógica de alto nível e a sequência de ação e correspondência. O fluxo de controle vincula todos os objetos, configurando o nível de controle.
Objetos externos são
objetos específicos com uma arquitetura e APIs claramente definidas. Por exemplo, cálculo de soma de verificação, 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
}
Metadados é a estrutura de dados associada a cada pacote.
Existem 2 tipos de metadados:
Metadados personalizados (estrutura vazia para todos os pacotes)Você pode colocar tudo o que quiser aqui
Disponível em todo o pipeline
conveniente para seu próprio uso, por exemplo, para armazenar o hash de um pacote
Metadados internos - fornecidos pela arquiteturaPorta de entrada, porta de saída são definidas aqui
Registro de data e hora quando o pacote estava na fila, profundidade da fila
fila de multicast hash / multicast
Prioridade do pacote, Importância do pacote
Especificação da porta de saída (por exemplo, fila de saída)
Compilador P4
O compilador P4 (P4C) gera:
- Tempo de execução do plano de dados
- API para controle de estado da máquina no plano de dados
Um exemplo de uma opção de software em P4
Os códigos-fonte podem ser baixados do repositório.
p4lang / p4c-bm: cria uma configuração JSON para bmv2
p4lang / bmv2: um comutador de software que entende as configurações JSON da versão bmv2
A figura mostra o diagrama de compilação do projeto:
Manipulações com tabelas, registros de leitura, 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>
O código fonte contém o programa simple_switch_CLI para uso conveniente da API da chave de software.
Você pode baixar este e outros exemplos no repositório.
PS No início do verão, a Intel assinou um acordo para adquirir a Barefoot Networks, com o objetivo de atender rapidamente às necessidades dos usuários da Hyperscale Cloud. De acordo com Navin Shenoy (vice-presidente executivo e gerente geral do Data Center Group da Intel Corporation) - isso permitirá à Intel fornecer maiores cargas de trabalho e mais oportunidades para os clientes do data center.
Na minha opinião pessoal, não esqueça que a Intel é líder na produção de chips FPGA e possui um excelente ambiente Quartus. Assim, você pode esperar que, com o advento da Intel, o Barefoot não apenas expanda sua linha de produtos, mas o Quartus e o P4 Studio também recebam atualizações e adições sérias à linha Toffino e Toffino 2.
O membro oficial da comunidade P4 é o
Factor Group .