フロー制御

フロー制御（フローせいぎょ、）は、コンピュータネットワークにおいて、2つのノード間で高速な送信側が低速な受信側をオーバーラン・オーバーフローさせてしまうことを防ぐようデータ転送のレートを管理するプロセスである。これは、ネットワークが混雑して輻輳が発生するのを制御する輻輳制御とは異なる。フロー制御機構は、受信ノードが送信ノードに対して何らかのフィードバックを返すかどうかで分類できる。

フロー制御は、送信側のコンピュータが受信側のコンピュータが受信して処理できるよりも高速に情報を送信する可能性がある場合に重要である。これは例えば受信側コンピュータが高負荷状態だった場合や性能が相対的に低い場合に発生する。

転送フロー制御 
転送フロー制御は、データ端末装置 (DTE) とデータ回線終端装置 (DCE) を経由した交換網との間で起きる場合と、2つのDTEの間で起きる場合がある。転送レートはネットワークの要求で制御される場合と、DTEの要求で行われる場合がある。転送フロー制御は、データの双方向の流れの一方だけで起きることもあるため、それぞれの方向で転送レートが異なるという事態も発生しうる。転送フロー制御は、単に送信の停止/再開を指示する場合と、スライディングウィンドウを使う場合がある。

フロー制御はデータ通信インタフェースの制御線を使って行う場合（RS-232を参照）と、制御文字をフロー制御用に予約しておいて使う場合（例えば、ASCII制御文字のXON/XOFF）がある。RS-232の制御線としては、RTS（送信リクエスト）/CTS（送信可）、DSR（データセットレディ）/DTR（データ端末レディ）があり、これらを使ったフロー制御を「ハードウェアフロー制御」と呼ぶ。これに対して XON/XOFF を使ったフロー制御を「ソフトウェアフロー制御」と呼ぶ。かつてモデムを「データセット」と呼んでいたため、制御線の名称にその名残りがある。

ハードウェアフロー制御は一般に、DTE（マスター）がRTSなどの信号線をアサートすることで働き、その信号が相手側（DCE、スレーブ）に届くと、相手はデータ入力線を監視し始める。データ受け入れ準備が整うとスレーブは対応する信号線（この場合はCTS）をアサートする。その信号がマスターに届くと、マスターはデータ送信を開始する。そしてマスターはスレーブのデータ出力線を監視し始める。どちらかがデータを停止する必要が出てくると、それぞれ対応する制御線のアサートをやめる。PCとモデムやそれに類するリンクでは、DTR/DSR が常にアサートされており（例えば、インターネットへのダイヤルアップ接続など）、RTS/CTSはデータのブロック毎にアサートされている。

開ループフロー制御 
開ループ (open-loop) フロー制御機構では、受信側と送信側の間に全くフィードバックのやり取りがない点が特徴である。この単純な制御手段は広く使われている。リソース割り当てには事前予約型と hop-to-hop 型がある。開ループフロー制御はネットワークリソースの利用を最大化できないという問題をはらんでいる。リソース割り当てはコネクションの設定時にCAC（Connection Admission Control、接続許可制御）で行い、その後リソースの状況が変わっても更新する手段がない。リソースを無駄に割り当てすぎることも多い。開ループフロー制御はATMのCBR、VBR、UBR（未指定ビットレート）サービスで使われている。

閉ループフロー制御 
閉ループ (closed loop) フロー制御機構は、送信者に対してネットワーク側が混雑状況を通知できる点が特徴である。この情報を受けて、送信者はネットワークの状態に合うように動作を変化させる。閉ループフロー制御はATMのABR（使用可能ビットレート）で使われている。上で説明した転送フロー制御も閉ループフロー制御の一種である。

関連項目 
 輻輳制御
 スライディングウィンドウ
 通信トラヒック工学
 ハンドシェイク
 Bufferbloat
開ループ制御
閉ループ制御

外部リンク 
 RS232 flow control and handshaking
 イーサネットのフロー制御 アットマーク・アイティ

コンピュータネットワーク
通信プロトコル
データ転送