ネットワークはプログラムの時代に！！　Part① P4の概要と動向

こんにちは！
P4（Programming protocol independent packet processors。以下、P4）についてご存じでしょうか？

今回はP4言語について概要と動向をご紹介できればと思います！！

## 目次

* [P4とは？](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#p4とは)
* [なぜP4が出てきた？](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#なぜp4がでてきた)
* [P4はどこが管理している？](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#p4はどこが管理している)
* [データプレーンをP4で記述できるメリットは？](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#データプレーンをp4で記述できるメリットは)
* [企業の取組](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#各企業の取組状況)
* [P4における開発範囲](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#p4における開発範囲)
* [P4の処理順序](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#P4の処理順序)
* [関連技術](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#関連技術)
* [さいごに](https://qiita.com/taitai22_1/items/40ee7181f81038fb68e7#さいごに)

## P4とは？
P4はデータプレーン（パケット、各フィールドの中身を分解／確認して、任意の処理）を記述する高級（人間が分かりやすい）プログラミング言語です。
ターゲット（例：FPGA、ASIC、各ベンダの違い）非依存な言語を目指しており、企業やコミュニティでP4をサポートするツールやフレームワークが研究開発されています。
例：パケットの書き換え、フィルタリング（例：条件にマッチしたパケットを廃棄）

## なぜP4がでてきた？
ネットワークをソフトウェアで監視、制御していく技術であるSDN(Software Defined Network)が普及と、その中核であるコントロールプレーン（例：API、コマンド）の部分はプログラマブルでした。
しかし、ベンダが用意した機能しか制御することができず柔軟性に欠けているということで、データプレーンをプログラムできるP4が発表されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/dba4f779-66c5-495d-9681-37736be8cb08.png)
引用：[SDN（Software Defined Network）とは](https://www.infraexpert.com/study/sdn01.html)


## P4はどこが管理している？
OpenFlowで有名だった[ONF（Open Networking Foundation）](https://opennetworking.org/)が管理していましたが、
2023年12月からは[Linux Foundation](https://www.linuxfoundation.org/)のプロジェクトとして管理されています。

また、P4について情報を共有する[日本P4ユーザ会](https://p4users.org/)という日本のコミュニティがあります。
余談ですが、筆者も先日入会しました。。！！

## データプレーンをP4で記述できるメリットは？
データプレーンを記述できるメリットは下記があげられるかと思います。

* 新しい機能の開発／試験
    * ベンダの実装を待たずに、ユーザ自ら新しいプロトコルやテレメトリ等の実装ができます
* コスト削減
    * ソフトウェアスイッチ（例：OpenVSwitch）、ホワイトボックススイッチに構築することでコスト削減ができます
* CPUの負荷軽減
    * 特にサーバサイドかと思いますが、ネットワーク機能の一部（例：スイッチング、フィルタリング）をFPGAやSmartNICにオフロードすることで、CPUの負荷軽減、省電力化や処理の高速化が期待できます
* 工数の削減
    * 論理回路をプログラムするHDL（Hardware Description Language）ではなく、高級言語であるP4で処理を記述できるため、工数削減に寄与します。難易度においてもHDLと比較して比較的簡単に実装できます

## 企業の取組
P4関連で取り組まれている企業を2つ紹介します。

### ■株式会社iD
* ネットワークに関する研究開発、販売をされている企業です。
P4でプログラムできるホワイトボックススイッチを販売しています。

※ホワイトボックススイッチは、ハードとソフトを分離することで、
ベンダロックを解消し（例：ハード→A社、ソフト→B社）、柔軟性やコストカットを提供するハードウェアです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/83422bca-ec45-4c00-bd79-e97683331f09.png)

引用: [Company│株式会社iD](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/365b8fa7-8504-40c9-adb7-c5af4da037e1.png)

### ■Intel Corporation
世界大手のチップベンダーです。
* FPGA 向けインテル® P4 Suiteを提供しています。
P4 プログラムから RTL を生成するコンパイラーと
実行時に P4 が生成した RTL を制御するソフトウェア・アプリケーション・プログラミング・インターフェイス (API) が含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/dde113f9-e0df-4150-8e43-7a8280fc2724.png)
引用：[FPGA 向けインテル® P4 Suite](https://www.intel.co.jp/content/www/jp/ja/software/programmable/p4-suite-fpga/overview.html)

* TofinoSwitch ASIC 製品ライン（P4-Programmable Ethernet Switch ASIC）の新規開発中止とIPUのサーバサイドでのP4活用に注力することを発表しました（2023）。

上記以外に、2025/4にCisco Systems, Inc.がP4プロジェクトのプレミアムメンバーに加入する動きがあるため、
今後P4で実装できる場面が広がるのではと期待しています。

## P4における開発範囲
P4で開発する際はユーザとベンダの役割分担があります。
ユーザはハードベンダが提供する（例：ホワイトボックススイッチ、FPGA）P4のアーキテクチャモデル（例：BmV2のSimple-Switch）に沿ってプログラムを記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/7664e22a-1921-4085-af8c-ff63a8fd5e55.png)
引用：[P4~16~ 言語仕様（2023）](https://p4.org/p4-spec/docs/P4-16-v1.2.4.html#sec-p4-std-arch)

## P4の処理順序
パケットが送られてきた際の主な流れです。
1. Parser
届いたパケットをヘッダ（例：IPヘッダ、TCPヘッダ）毎に分解します。
1. Match-action pipeline
処理を記述します。ここで定義したテーブル（処理のまとまり）と引数をコントロールプレーンから指定することで動作します。
1. Deparser
分解したヘッダーをパケットの形に再構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/11c8773a-d77c-4f69-a524-bf8237bd8a64.png)
引用：[P4~16~ 言語仕様（2023）](https://p4.org/p4-spec/docs/P4-16-v1.2.4.html#sec-p4-std-arch)

## 関連技術
### [DPDK](https://doc.dpdk.org/guides-16.04/index.html)（Data Plane Development Kit）
パケットを高速に処理する技術として、DPDKというものがあります。
カーネルを通さずに、直接NICにバイパスしてアプリケーションレベルで処理を記述できるので、
オーバヘッドを削減することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/d7a1470b-b326-4544-994e-f1a63f9ef711.png)

引用：[DPDKとは？ ～DPDK入門 第1回～](https://www.ntt-tx.co.jp/column/dpdk_blog/20180920/)

### [IPDK](https://ipdk.io/)（Infrastructure Programmer Development Kit）
P4によるデータプレーンの処理を記述する際の、ターゲット（CPU、IPU、DPU、またはスイッチなど）やベンダ依存をユーザが気にすることなく、開発することができるフレームワークです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468943/fdd95cc0-4c77-4e15-a2e9-7c8a4a3cbc0d.png)
引用：[ipdk](https://ipdk.io/)


## さいごに
いかがでしたでしょうか。
データプレーンを記述するP4言語を紹介しました。

実際にP4で記述できるハードは値段が高く簡単に試せないですが、
P4がどういったものかを知るのは調べると環境が用意されています。

次回はP4の環境を実際に構築して、処理を実装してみたいと思いますので、
ぜひチェックしてください！！