Фактор груп corporate blog
Open source
Programming
Network technologies
FPGA
17 July 2019

Язык программирования P4


P4 — это язык программирования, предназначенный для программирования правил маршрутизации пакетов. В отличие от языка общего назначения, такого как C или Python, P4 — это предметно-ориентированный язык с рядом конструкций, оптимизированных для сетевой маршрутизации.

P4 — это язык с открытым исходным кодом, лицензируемый и поддерживаемый некоммерческой организацией, которая называется P4 Language Consortium. Он также поддерживается Open Networking Foundation (ONF) и Linux Foundation (LF) — двумя крупнейшими зонтичными организациями в проектах с открытым исходным кодом в области сетевых технологий.
Язык был первоначально придуман в 2013 году и описан в 2014 в документе SIGCOMM CCR под названием «Независимое от протоколов, программирование процессора маршрутизации пакетов».

С момента своего создания P4 экспоненциально растет и развивается, быстро становясь стандартом описания передачи пакетов сетевыми устройствами, включая сетевые адаптеры, коммутаторы и маршрутизаторы.

«SDN преобразовал сетевую индустрию, а P4 выводит SDN на новый уровень, обеспечивая программируемость в области маршутизации», — сказал Гуру Парулкар, исполнительный директор Open Networking Foundation.

Язык P4 был первоначально создан группой инженеров и исследователей из Google, Intel, Microsoft Research, Barefoot, Princeton и Stanford. Цель была проста: создать простой в использовании язык, который разработчик программного обеспечения сможет выучить за день, и использовать для точного описания того, как пакеты пересылаются в сети.

С самого начала P4 разрабатывался как независимый от цели (т.е. программа, написанная на P4, могла быть скомпилирована без изменений для выполнения на различных целях, таких как ASIC, FPGA, CPU, NPU и GPU).

Также язык протокольно независимый (т.е. программа P4 может описывать существующие стандартные протоколы или использоваться для указания новых настраиваемых режимов адресации).

В промышленности P4 применяется для программирования устройств. Возможно в будущем Internet-RFC и стандарты IEEE также будут включать в себя спецификацию P4.

P4 может использоваться как для программируемых, так и для устройств с фиксированной функцией. Например, он используется для точной записи поведения конвейера коммутатора в API-интерфейсах интерфейса абстракции коммутатора (SAI), используемых ОС коммутатора с открытым исходным кодом SONiC. P4 также используется в проекте ONF Stratum для описания поведения коммутации через множество стационарных и программируемых устройств.

Описание поведения коммутатора и сетевых адаптеров впервые позволяет создать точную исполняемую модель всей сети перед развертыванием. Крупные облачные провайдеры могут полностью тестировать и отлаживать сеть с помощью программного обеспечения, что значительно сокращает время и затраты на тестирование взаимодействия в лаборатории, не требуя дорогостоящего оборудования.

Используя P4, поставщики сетевого оборудования могут рассчитывать на общее базовое поведение маршрутизации во всех продуктах, что позволяет повторно использовать инфраструктуру тестирования, упрощает разработку программного обеспечения для управления и, в конечном итоге, гарантирует совместимость.

Конечно, P4 можно использовать для написания программ, описывающих совершенно новые способы маршрутизации. Например, P4 широко используется для телеметрии и измерений в дата-центрах, сетях предприятий и поставщиков услуг.

Исследовательское сообщество также активизировалось. Несколько ведущих академических исследовательских групп по сетевым технологиям опубликовали интересные новые приложения на основе программ P4, включая балансировку нагрузки, согласованные протоколы и кэширование значения ключа. Создается новая парадигма программирования, инновации перемещаются из аппаратного обеспечения в программное обеспечение, что позволяет появиться множеству неожиданных, новых и гениальных идей.

Сообщество разработчиков внесло значительный вклад в разработку кода, включая компиляторы, конвейерные программы, поведенческие модели, API-интерфейсы, тестовые среды, приложения и многое другое. Преданные разработчики есть в таких компаниях, как Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx и ZTE; из университетов, включая BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass, and USI; и проекты с открытым исходным кодом, в том числе CORD, FD.io, OpenDaylight, ONOS, OvS, SAI и Stratum, подчеркивают тот факт, что P4 является независимым общественным проектом.

Типичная генерация контроллеров для языка P4:



Перспективы применения



Поскольку язык предназначен для приложений маршрутизации, список требований и вариантов дизайна отличен в сравнении с языками программирования общего назначения. Основными чертами языка являются:

  1. Независимость от целевой реализации;
  2. Независимость от используемого протокола(-ов);
  3. Реконфигурируемость полей.

Независимость от целевой реализации

Программы P4 разрабатываются так, чтобы они не зависели от реализации, то есть они могут быть скомпилированы для множества различных типов исполнительных машин, таких как процессоры общего назначения, FPGA, системы на кристалле, сетевые процессоры и ASIC. Эти различные типы машин известны как цели P4, и под каждую цель необходим компилятор для преобразования исходного кода P4 в модель целевого коммутатора. Компилятор может быть встроен в целевое устройство, внешнее программное обеспечение или даже облачный сервис. Поскольку многие из первоначальных целей для программ P4 использовались для простой коммутации пакетов, очень часто можно услышать термин «коммутатор P4», даже если употребление «цель P4» более верно.

Независимость от используемого протокола(-ов)

P4 независим от протоколов. Это означает, что язык не имеет встроенной поддержки распространенных протоколов, таких как IP, Ethernet, TCP, VxLAN или MPLS. Вместо этого программист P4 описывает форматы заголовков и имена полей требуемых протоколов в программе, которые в свою очередь интерпретируются и обрабатываются скомпилированной программой и целевым устройством.

Реконфигурируемость полей

Независимость от протокола и модель абстрактного языка допускают реконфигурируемость — цели P4 должны иметь возможность изменять обработку пакетов после развертывания системы. Эта возможность традиционно связана с маршрутизацией посредством процессоров общего назначения или сетевых процессоров, а не интегральных схем с фиксированными функциями.

Хотя в языке нет, что могло бы помешать оптимизировать работу определенного набора протоколов, эти оптимизации невидимы для автора языка и могут, в конечном итоге, снизить гибкость системы и цели и их реконфигурируемость.

Данные характеристики языка изначально закладывались его создателями с ориентацией на повсеместное использование его в сетевой инфраструктуре.

Уже сейчас язык используется во многих компаниях:

1) Гипермасштабные центры обработки данных;

Китайская компания Tencent является крупнейшей инвестиционной компанией в мире и одной из крупнейших венчурных компаний. Дочерние компании Tencent, как в самом Китае, так и в других странах мира, специализируются на различных областях высокотехнологичного бизнеса, в том числе различных интернет-сервисах, разработках в области искусственного интеллекта и электронных развлечений.

P4 и программируемая маршрутизация являются передовыми технологиями, которые используются в архитектуре сети компании.

Будучи одним из создателей, Google с гордостью отмечает быстрое внедрение P4 в сетевой индустрии и, в частности, в сфере архитектурного проектирования ЦОД.

2) Коммерческие компании;

Goldman Sachs используя преимущества работы с сообществом открытого исходного кода и разработки общих стандартов и решений уже сейчас привносит инновации в сетевую инфраструктуру и предоставляет лучшие решения для клиентов.

3) Производство;

Вся сетевая индустрия выиграет от такого языка, как P4, который однозначно определяет поведение переадресации. Также считают и в Cisco, перенося свои продуктовые линейки на использование этого языка.

Juniper Networks включило P4 и P4 Runtime в ряд продуктов, и обеспечивает программный доступ к встроенному процессору Juniper и его программному коду.

Ruijie Networks является активным сторонником P4 и преимуществ, которые она приносит сетям. С помощью P4 компания может создавать и поставлять лучшие в своем классе решения для широкого круга клиентов.

4) Телекоммуникационные провайдеры;

AT&T была одной из первых сторонников P4, одна из первых использовавшая P4 для определения поведения, которое хотело видеть в сетях, и использующая устройства программируемой переадресации P4 в своей сети.

В Deutsche Telekom язык используется для создания прототипов ключевых сетевых функций в рамках программы Access 4.0.

5) Полупроводниковая промышленность;

Язык позволил реализовать новую парадигму передачи возможностей программного обеспечения в плоскость маршрутизации сети компанией Barefoot.

Xilinx был одним из основателей P4.org и принимал активное участие в разработке языка P4 и внедрили его в программируемые платформы на основе FPGA для оборудования SmartNIC и NFV, выпустив один из первых компиляторов P416 в качестве части дизайна SDNet.

6) Программное обеспечение.

В компании VMware считают что P4 создает огромную энергию, инновации и сообщество, которое ведет к значимым и необходимым преобразованиям в сети. VMware изначально была частью этого отраслевого движения, поскольку новая волна инноваций вызвана программными подходами, расширяющими возможности инфраструктуры и реализует его в новейших продуктах.

Таким образом, P4 — это не зависящий от цели и не зависящий от протокола язык программирования, который используется промышленностью и научным сообществом для однозначного определения поведения маршрутизации пакетов как программы, которая, в свою очередь, может быть скомпилирована для нескольких целей. Сегодня цели включают аппаратные и программные коммутаторы, гипервизорные коммутаторы, NPU, графические процессоры, FPGA, SmartNIC и ASIC.

Главные черты языка значительно расширяют сферы его применения и обеспечивают его быструю имплементацию в архитектуры сетей.

С чего начать


P4 — это открытый проект, вся актуальная информация находится на сайте P4.org

Ссылка на репозиторий https://github.com/p4lang, где вы можете получить исходные коды примеров и обучающие материалы.

Плагин для Eclipse с поддержкой P4, но можем порекомендовать P4 Studio от компании Barefoot.



Разберем основные абстракции ядра:

Определение заголовков — с их помощью определяются заголовки протокола.

В определении заголовков задается:

  • описание форматов пакетов и имена полей заголовков
  • фиксированные и переменные разрешенные поля

Например

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


Парсеры — их задача разбирать заголовки.

Следующий пример парсера определит переход конечного состояния машины из одного начального состояния в одно из двух конечных:



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


Таблицы — содержат состояния машины связывающее пользовательские ключи с действиями. Действия — описание того, как следует манипулировать пакетом.

Таблицы содержат состояния (определенное на управленческом уровне) для пересылки пакетов, описывают единицу действия Match-Action

Сопоставление пакетов производится по:

  • Точному соответствию
  • Самому длинному Match с префиксом (LPM)
  • Тройному сопоставлению (маскированию)

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


Все возможные действия должны быть определены в таблицах заранее.

Действия состоят из кода и данных. Данные поступают управленческого уровня (например, IP-адреса / номера портов). Определенные, безцикловые примитивы могут быть заданы непосредственно в действии, но количество команд должно быть предсказуемым. Поэтому действия не могут содержать никаких циклов или условные операторов.

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


Модули Match-Action — действия по созданию ключа поиска, поиска в таблице, выполнения действий.

Типичный пример модуля приведен на рисунке:



Поток управления — указывает порядок применения модулей Match-Action. Это императивная программа, определяющая логику высокого уровня и последовательность Match-Action. Поток управления связывает все объекты, задавая уровень управления.

Внешние объекты — это специфичные объекты с четко прописанной архитектурой и интерфейсами API. Например вычисление контрольной суммы, регистры, счетчики, счетчики и т.д.

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
}

Метаданные — структуры данных, связанные с каждым пакетом.

Существует 2 вида метаданных:

  Пользовательские метаданные (пустая структура для всех пакетов)
    Вы можете положить здесь все, что вы хотите
    Доступно на всем протяжении pipeline
    удобно для использования в своих целях, например, для хранения хэша пакета

  Внутренние метаданные — обеспечивается архитектурой
    Входной порт, выходной порт определяются здесь
    Метка времени, когда пакет был поставлен в очередь, глубина очереди
    мультикаст хэш/ мультикаст очередь
    Приоритет пакета, важность пакета
    Спецификация выходного порта (например, очередь вывода)

Компилятор P4


Р4 компилятор (P4C) генерирует:

  1. Data plane runtime
  2. API для управления состоянием машины в data plane


Пример программного свитча на языке P4


Исходные коды можно скачать с репозитория.

p4lang/p4c-bm: создает конфигурацию JSON для bmv2
p4lang/bmv2: программный коммутатор, который понимает конфигурации JSON версии bmv2

На рисунке приведена схема компиляции проекта:



Манипуляции с таблицами, регистрами чтения, счетчика:

  • 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>

В исходных кодах приведена программа simple_switch_CLI для удобного использования API программного свитча.

Этот и другие примеры вы можете скачать в репозитории.



P.S. В начале лета компания Intel подписала соглашение о приобретении Barefoot Networks, с тем прицелом, чтобы быстро удовлетворять потребности пользователей Hyperscale Cloud. Как заявил Navin Shenoy(executive vice president and general manager of the Data Center Group at Intel Corporation) — это  позволит Intel предоставлять бОльшие рабочие нагрузки и больше возможностей для клиентов ЦОДов.

По моему личному мнению не стоит забывать, что компания Intel — лидер по производству чипов FPGA и у нее есть отличная среда Quartus. А значит можно ожидать, что с приходом в Intel, у компании Barefoot не только пополнится производственная линейка, но и Quartus, и P4 Studio ждут серьезные обновления и пополнение линейкой Toffino и Toffino 2.

Официальный участник сообщества P4 — компания Фактор груп.

+14
10.9k 43
Comments 8
Top of the day