| パラダイム | コンパイル型、ドメイン固有、命令型 |
|---|---|
| 開発者 | オープンネットワーキング財団 |
| 初登場 | 2013年 |
| 安定リリース | バージョン 1.2.5 [1]
/ 2024年10月 |
| ライセンス | Apacheスタイル |
| ファイル名拡張子 | .p4 |
| Webサイト | p4.org |
P4 は、ルーターやスイッチなどのネットワーク デバイスのパケット転送プレーンを制御するためのプログラミング言語です。CやPythonなどの汎用言語とは異なり、P4 はネットワーク データ転送に最適化された多数の構成要素を持つドメイン固有言語です。P4 はオープン ソースの許容ライセンスコードとして配布され、 Open Networking Foundationが主催する非営利団体である P4 プロジェクト (旧称 P4 Language Consortium) によって管理されています。
歴史
P4は、もともと2014年のSIGCOMM CCR論文「プロトコルに依存しないパケットプロセッサのプログラミング」[2]で説明されました。頭韻を踏んだ名前は「P4」に短縮されています。最初のP4ワークショップは2015年6月にスタンフォード大学で開催されました。[3] P4の更新された仕様であるP4-16は、2016年から2017年にかけてリリースされ、[4] P4の元の仕様であるP4-14に取って代わりました。
デザイン
この言語はパケット転送アプリケーションに特化しているため、要件や設計上の選択肢のリストは、それらのユースケースに特有のものになります。この言語は、いくつかの目標を達成するように設計されています。
ターゲットの独立性
P4 プログラムは実装に依存しないように設計されています。つまり、汎用 CPU、FPGA、システムオンチップ、ネットワーク プロセッサ、ASIC など、さまざまな種類の実行マシンに対してコンパイルできます。これらのさまざまな種類のマシンはP4 ターゲットと呼ばれ、各ターゲットは、P4 ソース コードをターゲット スイッチ モデルにマップするコンパイラとともに提供する必要があります。コンパイラは、ターゲット デバイス、外部で実行されるソフトウェア、またはクラウド サービスに埋め込まれている場合があります。P4 プログラムの初期ターゲットの多くは単純なパケット スイッチングに使用されていたため、「P4 スイッチ」という用語がよく使用されますが、正式には「P4 ターゲット」の方が正確です。
プロトコルの独立性
P4 はプロトコルに依存しないように設計されています。この言語は、IP、イーサネット、TCP、VxLAN、MPLSなどの一般的なプロトコルさえもネイティブにサポートしていません。代わりに、P4 プログラマーはプログラム内で必要なプロトコルのヘッダー形式とフィールド名を記述し、コンパイルされたプログラムとターゲット デバイスによって解釈され、処理されます。
再構成可能性
プロトコルの独立性と抽象言語モデルにより再構成が可能になります。P4 ターゲットは、展開後にパケットの処理方法を (おそらく複数回) 変更できる必要があります。この機能は、従来、固定機能のASICではなく、汎用 CPUまたはネットワーク プロセッサ上に構築された転送プレーンに関連付けられています。言語内では、特定のターゲットが特定のプロトコル セットを中心に最適化することを妨げるものは何もありませんが、これらの最適化は言語の作成者には見えず、最終的にはシステムの柔軟性と再構成可能性の目標を低下させる可能性があります。
コンポーネント
P4 プログラムには通常、次のコンポーネントが含まれます。
解析ロジック
P4は、TCP/IPプロトコルスイートで使用される一般的なヘッダーやアプリケーション固有のヘッダーの解析を含むがこれに限定されない、 カスタムパケットヘッダー解析ロジック[4]の指定を可能にします。
ヘッダー
ヘッダー定義はパケット形式を記述し、パケット内のフィールドに名前を付けます。この言語では、ヘッダー名と任意の長さのフィールドをカスタマイズできますが、多くのヘッダー定義では、広く知られているプロトコル名とフィールド幅が使用されています。たとえば、802.3 Ethernet ヘッダー定義は「Ethernet」と呼ばれ、48 ビットの「dest」フィールド、それに続く 48 ビットの「src」フィールド、さらに 16 ビットの「type」フィールドで構成されます。ヘッダー定義内の名前は、後で P4 プログラムでこれらのフィールドを参照するために使用されます。
パーサー
P4 パーサーは、入力バイト ストリームを走査し、プログラムされた解析グラフに基づいてヘッダーを抽出する有限状態マシンです。簡単な例としては、イーサネットの送信元と宛先、およびタイプ フィールドを抽出し、タイプ フィールドの値 (一般的な値は ipv4、ipv6、または MPLS など) に基づいてさらに抽出を実行するパーサーが挙げられます。
ステートフル処理
P4では、プログラマーがレジスタ、カウンター、メーターの形で状態を維持できます。[4]
一般的なマッチアクションテーブル
P4プログラムの主なコンポーネントは、ユーザー定義のマッチアクションテーブルのセットです。P4はすべてのマッチアクションテーブルを汎用として扱い、ユーザーがコントロールプレーンを介してマッチアクションルールを追加できるようにします。[4]
マッチアクション処理
P4 の基礎となるのは、マッチアクション パイプラインの概念です。概念的には、ネットワーク パケットまたはフレームの転送は、一連のテーブル検索と対応するヘッダー操作に分解できます。P4 では、これらの操作はアクションと呼ばれ、学習した転送状態の検索結果に基づいて、ある場所から別の場所にバイト フィールドをコピーするなどの操作から構成されます。P4 は、パケット転送デバイスのデータ プレーンのみを対象としています。制御プレーンや、制御プレーンとデータ プレーン間で状態を通信するための正確なプロトコルは指定していません。代わりに、P4 はテーブルの概念を使用して転送プレーンの状態を表します。制御プレーンとさまざまな P4 テーブル間のインターフェイスを提供して、制御プレーンがプログラム内の状態を挿入/変更できるようにする必要があります。このインターフェイスは、一般にプログラム APIと呼ばれます。
テーブル
P4 テーブルには、パケットを転送するために使用される状態が含まれています。テーブルは、ルックアップ キーと、対応するアクション セットとそのパラメータで構成されます。簡単な例としては、宛先 MAC アドレス セットをルックアップ キーとして保存し、対応するアクションでデバイスの出力ポートを設定したり、カウンターを増分したりすることが考えられます。テーブルとそれに関連付けられたアクションは、ほとんどの場合、完全なパケット転送ロジックを実現するために順番に連結されますが、抽象的には、すべてのルックアップ キー情報と完全な出力アクション セットを含む単一のテーブルを構築することも可能です。
アクション
P4 のアクションは、パケット フィールドとメタデータの操作を記述します。P4 のコンテキストでは、メタデータは、フレームが到着した入力インターフェイスなど、パーサーから直接取得されないパケットに関する情報です。アクションの例の英語の説明は、「IPv4 TTLフィールドを 1 減らす」または「出力ポート テーブルから送信パケット ヘッダーに MAC アドレスをコピーする」などです。[5] P4 は、すべてのターゲットが提供する必要がある標準メタデータと、特定のターゲットの作成者が提供するターゲット固有のメタデータの両方を定義します。
制御フロー
P4 の制御フローはテーブルの相対的な順序を決定し、if/then/else 構造に基づいてテーブルの 条件付き実行を可能にします。
参考文献
- ^ 「P416 言語仕様」。2024年11月13日閲覧。
- ^ P. Bosshart、D. Daly、G. Gibb、M. Izzard、N. McKeown、J. Rexford、C. Schlesinger、D. Talayco、A. Vahdat、G. Varghese、D. Walker (2014 年 7 月)。「P4: プロトコルに依存しないパケット プロセッサのプログラミング」。Computer Communication Review。2015年4 月 7 日閲覧。
- ^ 「第1回P4ワークショップ」P4公式サイト。2015年6月4日。 2019年8月1日閲覧。
- ^ abcd 「仕様」. P4公式サイト. 2022年6月7日閲覧。
- ^ 「P4メーリングリスト」。2015年7月。 2015年7月15日閲覧。
外部リンク
- 公式サイト
