イーサネットにおけるフロー制御は、ネットワークの輻輳によるパケット損失を防ぐために、データリンク層がフレーム送信を一時的に停止する機能を指す。
方式は大きく2種類あり、半二重通信で用いる「バックプレッシャ制御」と、全二重通信で用いる「PAUSEフレーム」がある[1]。
バックプレッシャ (Back Pressure)は、半二重通信で広く用いるフロー制御で、CSMA/CDを応用して対向機器の送信待機を発生させるもの[1]。この語は元々、ポンプなどの出口に逆方向の圧力をかけて全体の流量を緩和する背圧制御を意味する。
スイッチは受信フレームをバッファメモリに格納し、そのデータ量を監視する。バッファメモリの容量が少なくなると、送信側にジャム信号を送る。フレームの送信元端末は衝突 (コリジョン)が発生したと認識し、CSMA/CDに従ってランダムな時間待ってから再送する。
PAUSEフレーム(ポーズフレーム)は、全二重通信で用いるフロー制御で、対向機器に動作の一時停止を要求するもの。1997年にIEEE 802.3xとして標準化された[2]。
スイッチはバッファメモリの容量が少なくなると、受信側はデータの送信を抑制するためにPAUSEフレームと呼ばれるデータを送信元に送る。送信側は、その内容に基づいて一定時間データ送信を停止する。
PAUSEフレームのデータはイーサネットフレームの書式を踏襲しており、その内容は以下の通り[3]。
01-80-C2-00-00-01
or 対向のMACアドレス0x8808
(フロー制御)0x0001
(一時停止コマンド)[4]宛先アドレス 01-80-C2-00-00-01
は特殊なマルチキャストアドレス[5]で、この場合は対向機器のMACアドレスを知らなくても使える。また、対向機器がスイッチならこの宛先のフレームを転送せず、スイッチ内でのみ処理されることを意図したものであると解釈する[6]。
PAUSEフレームは、非対称な動作設定も可能であり、送信(停止要求)のみまたは受信(停止要求に応じる)のみを行うことができる[7]。
一般にフロー制御は、多ポートスイッチ内部の輻輳が発生したときに使う。内部の輻輳は、送信元の接続ポートより宛先の接続ポートの速度が遅い場合や、複数の送信元から同じ宛先へ送るときの合計データ量が宛先の接続ポートの速度を超える場合などで発生する。いずれの場合も最終的にはスイッチ内部のバッファがすべて消費され、古いフレームから破棄されてしまう。フロー制御を用いると、自身の転送処理が完了してバッファに余裕ができるまで送信元機器を待機させることができる。
停止要求に応じている間は、特に旧式のスイッチにおいてバッファ内の以降の全データが待機状態となり、輻輳に関係のないポートを宛先とするフレームであっても遅延してしまうことがあった。これを、待ち行列の先頭が後方に影響を与える状態に例えて「ヘッドオブライン(HOL)ブロッキング」と呼ぶ。HOLブロッキングに対応するために、多くのスイッチではバッファ処理に出力キューを仮想的に設けており、停止要求のあったポート以外へのフレームは待機せずに送信できるようになっている[8]。
2004年5月に IEEE P802.3arとして策定プロジェクトが発足し、送信レートを約1%の精度で対向に要求する輻輳管理機能を検討したが、最終的に2008年に取り下げとなった[9]。
PFC (Priority-based Flow Control)は、データの優先度に応じたフロー制御で、PAUSEフレームの方式を拡張したもの。2010年にIEEE 802.1Qbbで標準化された[10]。この標準化は、シスコ・システムズが独自拡張した仕様を元にしている[11]。
PFCでは、CoS (Class of Service)で与えられる8段階の優先度ごとに個別にフロー制御できる。これにより、指定した優先度のトラフィックのみにPAUSEフレームを発行できるようになった。輻輳時にVoIPを優先させて通常データやファイル転送を遅延させるなどの制御が可能となり、CEEネットワーク環境などで広く用いられる。
PFCのPAUSEフレームの書式は、ヘッダ部分は従来のものと同一であるが、データ部分が以下のように異なる[12]。
0x0101
(PFC)