TCP/IPにともに広く普及したイーサネット。今回はイーサネット編の最終回として、フロー制御やVLAN、トラブルシューティング方法について解説。
スイッチング・ハブは、イーサネットのフレームを解析して、必要な宛先にのみ送信を行うように作られたハブであり、入力されたフレームをいったんメモリに蓄えてから中継処理を行っている。そのため、中継先のセグメントにキャリアがある場合はアイドル状態になるまで待つことができ、結果として、衝突を起こさずに中継を行うことができる。一般的にスイッチング・ハブが搭載するメモリ容量はフレームの最大サイズ以上で、複数のフレームを蓄えるバッファとしても利用している。そして1つのセグメントに対して複数のフレームが同時に送られてきても、それらはすべてバッファに貯められていて、送信先ポートが空き次第、順次送信処理が行われる。しかし、内蔵されているメモリ容量には限りがあるため(一般的には数Mbytes)、1つのセグメントに対して多くのフレームが同時に送られてきて、かつ送信処理が間に合わないと、蓄えるフレームの容量がメモリ容量を超えてしまい、蓄えきれないフレームを処理できない状態となる。このような場合は、(一般的には)後から来たフレームはバッファに入れられず、単に捨てられてしまうことになっている。つまり、スイッチング・ハブの処理能力を超えたフレームは消失してしまうので、通信が行えない状態となる。このようにネットワークのトラフィックがある1点に集中したため通信が行えない状態になることを「輻輳(congestion)」と呼ぶ。100Mbpsのイーサネットのネットワークから10Mbpsのイーサネットのネットワークにフレームを中継するような帯域幅が狭くなる場所や、1台のサーバに多数のクライアントから同時に通信を行うというような状況では輻輳が起こりやすい。
パケットの消失が起こった場合は、より上位のアプリケーションやプロトコルによって再送信処理を行う必要があるだろう。だが再送信処理が必要かどうかの判断や、再送信処理のためにタイムラグが生じ、システムの応答性が非常に悪くなったりするし、もし再送信をしないようなアプリケーションやプロトコルであれば、相手からの応答をずっと待ち続けてプログラムが停止してしまうかもしれない。
輻輳を避けるためには、空きメモリ容量が少なくなったときに、送信側のステーションに対して送信の停止を要求し、その後空きメモリ容量に余裕が生まれた時点で送信の再開を要求すればよい。このようにデータの流れる量を制御することを一般的に「フロー制御(flow control)」と呼ぶが、特に輻輳状態にならないように制御する場合は「輻輳制御(congestion control)」と呼ばれる。
■バックプレッシャ輻輳制御
半二重通信方式のイーサネット・システムでは、フロー制御の方法が規格としては決められていない。そのため各スイッチング・ハブ・ベンダでは独自に開発したフロー制御メカニズムを製品に搭載している。その1つとして「バックプレッシャ(Back Pressure)輻輳制御」と呼ばれる方法があり、広く採用されている。これはCSMA/CDのメカニズムを応用したものであり、送信側に対して衝突信号を送出して、セグメント上のステーションの送信を待機させるという方法である。スイッチング・ハブの空きメモリ容量が少なくなった状態でさらにフレームが送られてきた場合、スイッチング・ハブはそのセグメントに対して、(データを受け取る代わりに)衝突信号を送出し、故意に衝突状態を作り出す。半二重のイーサネットでは、送信中に衝突信号を検出した場合は、他のステーションからの送信とぶつかっていることを意味している。
衝突信号を検出した送信側のステーションでは、送信を中断して送信のバックオフ(送信が失敗した場合の再試行フェーズ)に入り、送信待機状態となる。この間に、スイッチング・ハブはメモリ中にあるフレームを送出して、空きメモリ容量を増やすようにする。
■PAUSEフレームを使ったフロー制御
全二重の場合はCSMA/CDを使用しないため、バックプレッシャ輻輳制御を行うことができない(送信中に受信も可能なため)。そこでフロー制御のために、IEEE 802.3xのオプションとしてMAC制御プロトコルが規定されている。
MAC制御プロトコルは、ステーション間での送受信処理をリアルタイムで制御するためのもので、イーサネット・フレーム中の「長さ/タイプ」フィールドに0x8808が設定されたMAC制御フレームが使われる。フレームの「データ」フィールドは46オクテットに固定されていて、最初の2オクテットに操作コードを設定し、そのコードによってさまざまな制御を行うことができるようになっている。「長さ/タイプ」フィールドには0x8808が設定されているが、MAC制御プロトコルをサポートしていないステーションは、このMAC制御フレームを単に無視すればよい。
MAC制御プロトコルでフロー制御を行うためには「PAUSEコマンド」を使用する。PAUSEコマンドはMAC制御フレームの宛先アドレスに「01:80:C2:00:00:01」、操作コードに「0x0001」、制御コードに続く2オクテットに送信の「中断時間(0〜65,535)」を指定したPAUSEフレームを使用する。PAUSEフレームを受け取ったステーションは、そのデータ・フィールドに指定されている「中断時間×512ビット時間」の間(512bitはフレームの最小サイズ)、送信を中断することでフロー制御を実現する。
スイッチング・ハブ側では、バッファの空き容量が残り少なくなったときにPAUSEフレームを送信する(そして空きが十分できたときに、中断時間を0にしたPAUSEフレームを送信する)。送信ステーション側では、指定された中断時間の間だけ、もしくは中断時間が0と指定されるまで、送信を中断する。
宛先アドレスに指定する「01:80:C2:00:00:01」というアドレスは、PAUSEフレーム用に予約されている特別なマルチキャスト・アドレスである。マルチキャスト・アドレスを使用するのは、PAUSEフレームを送るときに、相手(PAUSEさせたいステーション)のMACアドレスを特定しなくてもかまわないようにするためである。またスイッチング・ハブは、宛先がマルチキャスト・アドレスであるフレームは他のすべてのセグメントに中継することになっているが、PAUSEフレームを受け取った場合はそのスイッチング・ハブに対する指示であるため、他のセグメントにPAUSEフレームを中継しない。
一般的なマルチキャスト・アドレスではなく、PAUSEフレーム用に予約されたマルチキャスト・アドレスを使用するのは、スイッチング・ハブがデータ・フィールドまで受信しなくても、宛先アドレスだけを調べただけで中継する必要がないことを理解できるようにするためである。スイッチング・ハブの中継処理を高速化する手段として、フレームの先頭にある宛先アドレス部だけを受信した時点で転送を開始する「カット・スルー」という方式があるが(これとは逆に、フレームをすべて取り込んでから転送を開始するのは「ストア&フォワード」方式という)、この特別な宛先アドレスを使えば、PAUSEフレームを中継せずに処理することができる。
【2007/01/15】PAUSEフレームのアドレスを「01:80:C3:00:00:01」としておりましたが、正しくは「01:80:C2:00:00:01」でした。お詫びして訂正させていただきます。
Copyright© Digital Advantage Corp. All Rights Reserved.