それではイーサネットのCSMA/CD方式における送信処理の詳細について見てみよう。大まかに述べると、送信前にキャリアがないことを確認してから送信を開始し、衝突を検出した場合はランダムな時間だけ待ってから再送信を行うわけであるが、どのステーションにも平等に送信の機会を与え、再送信による衝突などが少なくなるように、さまざまな工夫が行われている。
1.フレーム・データの準備
上位層からのデータをイーサネット・フレームに加工する。フレームのデータ・フィールドのサイズは最大で1500オクテット*1までという制限があるため、それより大きいサイズのデータを送信する場合は、上位層(IP層)側でデータを分割し、複数のフレームに分けて送信しなければならない。規定より大きなデータを送ろうとするとエラーとなり、フレームは実際には送信されない。
*1 オクテット――1オクテットは8bit。イーサネットの規格書を始め、通信関係では8bitであることを正確に表すために、byteではなくオクテットという単位をよく使う(システムによっては1byteが6bitや9bitの場合もあるから)。このイーサネットの解説でも、規格書に合わせて、オクテットという用語を使用する。
2.アイドル状態の確認
ネットワーク媒体上を信号が流れていないか確認する。ネットワーク媒体上に流れている信号を「キャリア(Carrier)」と呼ぶため、この処理を「Carrier Sense」という。信号が流れていない状態を「アイドル」と呼ぶ。
3.フレーム・データの送信の開始
ネットワーク媒体がアイドル状態であり、アイドル状態がIFG(Interframe Gap:フレーム間隔時間)の間継続していたら、送信を開始することができる。IFGは96bit時間(96bit分の信号を送信するのにかかる時間)と決められており、10Mbit/sイーサネットでは9.6μs(100万分の9.6秒)、100Mbit/sイーサネットでは960ns(10億分の960秒)と非常に短い時間である。各ステーションのインターフェイスは、IFGの間に送受信回路をリセットして、次の送受信動作に備える。
ネットワーク媒体のアイドル状態がIFGの時間だけ続いた後は(最後の送信からIFG時間以上経過すれば)、ネットワーク上のどのステーションも送信を開始することができる。つまりすべてのステーションは送信の権利を平等に与えられるのである。これを「Multiple Access」と呼ぶ。
フレームのサイズ(プリアンブル部は除く。プリアンブルはフレームの先頭を表すデータ。フレームの内部構造については次回解説予定)は1518オクテット(VLANタグ・ヘッダを含む場合は1522オクテット)という制限があるため、1つのフレームがネットワーク媒体を占有する時間は非常に短い。例えば10Mbit/sのイーサネットで1518オクテットのフレームを送出するのにかかる時間は1518×8bit÷(10Mbit/s)=1.2144ms(1000分の1.2144秒)である。
1つのステーションが複数のフレームを送信する場合も、フレームを送るたびにアイドル状態をIFGの間待つ。これは他のステーションに送信の機会を与えるためであり、その結果1つのステーションがずっとネットワーク媒体を占有し続ける事がなくなる。
4.コリジョンの検出
ステーションは送信中もネットワーク媒体を監視している。送信中に衝突を検出したら、送信を停止し(プリアンブル部分を送信中ならば、プリアンブルだけは送信してから)、衝突が発生したことを他のステーションに確実に伝えるために、最低でも32bitのJAM信号を送信する。JAM信号のビット・パターンは規定されていないが、送信したフレームのCRC値に一致してはならない(これにより、衝突が起こったフレームが確実に破棄されるようになる)。このメカニズムを「Collision Detection」と呼ぶ。
「Collision Detection」が機能する条件として、フレームの送信中に衝突を検出できる必要があるため、フレームの最小サイズとコリジョン・ドメインの最大長が規定されている(「コリジョン・ドメイン」はコリジョン情報が伝播する範囲。10BASE5ならば1つのセグメント、もしくはリピータで接続されたセグメントのグループ。詳細は次回解説するが、とりあえずここでは1本の同軸ケーブルで構成された1つのセグメントだけを考えておいてほしい)。この理由は、2つのステーション間での衝突の伝わり方について考えてみると分かるだろう。コリジョン・ドメイン内に2つのステーションAとBがあり、その間を信号が伝わるのにかかる時間を d とする。時刻 t0 にステーションAが最小サイズのフレーム(64オクテット)を送信し、ステーションAの先頭bitの信号がBに到達する直前に、ステーションBもフレームの送信を開始した場合を考える。この場合、Aからの信号とBからの信号は、Bの位置からほんのわずかA側に寄った地点で衝突することになる。
ステーションBには時刻 t0+d にステーションAの先頭bitの信号が到達し、ステーションBは衝突を検出することができる。しかし、この時点ではステーションAにはステーションBの信号が到達していないため、ステーションAはまだ衝突を検出できない。さらに進んで時刻 t0+2d(信号AがBまで行ってから、元へ戻ってくる時刻)の直前になれば、ステーションBの先頭bitの信号が到達するので、ステーションAは衝突を検出することができる。
ところで、もしステーションBの最初の信号が届く前に、ステーションAのフレームの送信が完了してしまうと、Aは送信が正しく完了したとみなしてしまうため(Aから見ると、衝突が発生していないので、送信は正常に行えたように見える)、ステーションAは衝突を検出することはできない。実際にはAとBの間のどこかで信号が衝突しているので、Aのデータを受け取ることはできなくなっているはずだ。正しくは、Aは衝突を検出して、再送処理を開始しなければならない。
このような事態を避けるためには、常に次のような条件を満たすようになっていればよい。2dの最大値、つまりコリジョン ドメイン内の最も離れた2つのステーション間を信号が往復する時間は、最小サイズのフレームを送出するのにかかる時間よりも短くなければならない、ということだ。
最小サイズのフレームを送信するのにかかる時間(プリアンブルを除く)を「スロット・タイム(slot time)」と呼ぶ。コリジョン・ドメインの最大長は、信号がスロット・タイム以内に往復できる長さ未満に制限される(信号の送信中に衝突信号が戻ってこなければならないということ)。フレームの最小サイズはプリアンブルを除いて64オクテット(512bit)と決められているので(不足する場合は、適当なダミー・データで埋める)、スロット・タイムは512bit時間(512bit分のデータを送出するのにかかる時間)となる。
10Mbit/sイーサネットでは、スロット・タイムは512bit÷10Mbit/sなので51.2μs(100万分の51.2秒)である。10BASE5ではスロット・タイム以内に信号が往復できる距離は約2800mであったため、コリジョン・ドメインの最大長は2500mに制限されている。また、信号は伝送距離に応じて減衰してしまうため、ネットワーク媒体にはその特性による制限もある。
送信者が送信を開始してからスロット・タイムの間は、送信者がネットワーク媒体を占有できるかどうかを検査するための時間という意味を持っている。スロット・タイムは信号がネットワーク全体を往復できる時間であるため、その間に他のステーションは信号を検出し送信待機状態になる。もし送信を開始しているステーションがほかにあれば、混信した信号がスロット・タイム以内に届く。逆にいえば、スロット・タイムの間に衝突が起こらなければ、フレームの送信中に衝突は起こらなかったということになる(ステーションの衝突検出機能が故障していたり、設計ルールを無視してネットワークが構築されていたりすると、いつでも衝突が起こる可能性がある)。
5.再送処理
衝突が発生した場合、JAM信号を送信したステーションは待ち時間をランダムに選択し、その待ち時間の後で再送信を行う。つまり衝突は、データが損失する(送信に失敗する)ということではなく、ステーションがその時点でネットワーク媒体のアクセス権の取得に失敗したということを表しているだけに過ぎない。
衝突によるこの再送処理を「バックオフ(backoff)」と呼ぶ。衝突を起こしたすべてのステーションが待ち時間をランダムに選ぶため、再送信で衝突が起こる確率は低くなる。もし再送信でも衝突が発生した場合は、バックオフを繰り返す。
最初のバックオフの待ち時間は非常に短い時間を選択するため、衝突による遅延も非常に短い。しかし、ネットワークのトラフィック量が多いとき、つまり多くのステーションが大量のフレームを送信しているような状況(ネットワークが混雑している状況)では衝突の発生率が高いため、再送信を行っても再度衝突する可能性が高い。短い待ち時間で再送信を繰り返し続けると、ネットワークのトラフィック量は下がらず、場合によってはトラフィック量をさらに増やしてしまうことにもなりかねない。そこで、「truncated binary exponential backoff」と呼ばれる方式を利用する。これはバックオフのたびに選択する待ち時間を伸ばし、再送信のタイミングを分散させる方式で、次のアルゴリズムによってバックオフの待ち時間を決定する。
あるフレームを送信しようとして衝突した回数を n とする。もし、n が 10 以上ならば10とする。0 以上で 2 の n 乗未満の範囲から、ランダムに整数値を選択する。選択した整数値とスロット・タイムの積が待ち時間となる。
トラフィックが異常に高い場合や、ネットワークに障害が発生している場合は、送信が不可能な状況であるため、バックオフを繰り返しても意味がない。そのため16回目のバックオフでフレームを廃棄し、エラーを上位層に通知する。
衝突した回数 | 選択範囲 | 10Mbit/sの場合の待ち時間(ms) | |
---|---|---|---|
1 | 0 〜 1 | 0 〜 0.0512 | |
2 | 0 〜 3 | 0 〜 0.154 | |
3 | 0 〜 7 | 0 〜 0.358 | |
4 | 0 〜 15 | 0 〜 0.768 | |
5 | 0 〜 31 | 0 〜 1.59 | |
6 | 0 〜 63 | 0 〜 3.23 | |
7 | 0 〜 127 | 0 〜 6.50 | |
8 | 0 〜 255 | 0 〜 13.1 | |
9 | 0 〜 511 | 0 〜 26.2 | |
10 | 0 〜 1023 | 0 〜 52.4 | |
11 | 0 〜 1023 | 0 〜 52.4 | |
12 | 0 〜 1023 | 0 〜 52.4 | |
13 | 0 〜 1023 | 0 〜 52.4 | |
14 | 0 〜 1023 | 0 〜 52.4 | |
15 | 0 〜 1023 | 0 〜 52.4 | |
16 | ― | 破棄 | |
truncated binary exponential backoff n 回目のバックオフの待ち時間 t は、「0 ≦ t < 2のk乗×スロット時間 [ k は n と 10 の小さい方の値]」となる。 |
Copyright© Digital Advantage Corp. All Rights Reserved.