無線LANのアクセス方式の基本(★)

[無線LAN(Wi-Fi, IEEE802.11)の開発依頼は、フィールドデザインまでお気軽にお問い合わせください。]

無線通信も有線通信もそうですが、複数の機器が同時に送って、混信しないために、誰がデータを送信できて、送信中は他の人がデータを送らないような取り決めをする必要があります。

無線LANでは、その取り決めには下記の2つがあります。

  • DCF(Distributed Coordination Function)
  • PCF(Point Coordination Function)

PCFの方は、実際に使っているのを見たことがないので、詳しい説明は省略しますが、アクセスポイントが誰が送信できるかをスケジューリングしてくれるものと覚えておけば問題ないです。
DCFは、CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)というアルゴリズムで、早い者勝ちのアクセス方法です。

以下の様なルールがあります。
wlan_csma

通常のデータ送信の場合は、下記のようになります。

  1. まず、誰もデータを送ってないことを確認します。誰かがデータを送っている場合は、それが終わるまで待機します。
  2. そして、他の人のデータの送信が終わったら、DIFS(DCF Inter Frame Space)と呼ばれる一定時間を待機します。例えば、IEEE802.11gの場合は、DIFSは28usです。なぜ、このIFSの一定時間を待つ必要があるのでしょうか?1つは、組込み機器など処理性能が遅く、すぐにフレーム送信できないものに対して、準備する期間を待ってあげるためです。もう1つは、このIFSの時間を短くしたり、長くしたり制御することで、送信の優先順位を決めるメカニズムをいれられるということです。後述の確認フレーム(Ack)などがそうです。
  3. さらに、ランダムバックオフ期間というランダムな時間を待機します。このことで、すべての人が公平にアクセスできるようになります。ここで、頭のいいメーカは、自分のフレームを優先的に送れるように、ランダムバックオフを常に短めに設定するということも考えます。しかし、世の中はそんなに甘くなく、普通はロゴ認証試験などでそういうのを排除する試験が組み込まれています。
  4. そして、再度、誰もデータを送ってないことを確認します。誰かが送り始めていたら、また、最初(1)からやりなおします。誰も送ってないようなら、自分のフレームの送信を開始します。
  5. 自分のフレームを送り始めると、他の人も同時に送ってるということもあります。その場合は、送信をやめます。また、最初(1)からやりなおします。

自分宛てのフレームに対する確認フレーム(Ack)を送る時だけは、下記のような方法で送ります。

  1. 自分宛てのフレームが受信し終わるまで待機します。
  2. フレームが正しく受信された場合は、SIFS(Short Inter Frame Space)と呼ばれる一定時間を待機します。このSIFSは、DIFSより短い時間で、IEEE802.11gの場合、10usです。ポイントは、SIFSはDIFSより短く、ランダムバックオフの時間もないため、他のフレームよりAckは優先して送れるところです。このSIFSの時間が設けられているのは、フレームが正しいかを計算する処理時間のためです。
  3. そして、誰もデータを送ってないことを確認します。誰かがデータを送り始めていたら、そのデータが送り終わるのをまって、2からやりなおします。誰も送ってないようなら、確認フレーム(Ack)の送信を開始します。

いくつか、ポイントがあります。

  • 上記のように、自分のフレームを送るのに、ランダムでバックオフ時間を決めますが、それでは運がいい人だけ、毎回送れてしまいます。そのため、前回に送信できなかった機器のバックオフの時間は、新たにランダムで設定するのでなく、前回の残りのバックオフ時間をそのまま利用します。これなら、何回かやっていれば、必ず送信できるようになります。
  • 上記のCSMA/CA方式は無線LANだけに適用されるということです。つまり、Bluetoothや電子レンジなど同じ周波数帯を利用する機器は、お構いなしに電波を送ってきます。そのため、そういう機器が近くにいると、通信速度が1/10くらいになってしまいます!
  • 上記のケースで、無線LAN機器が多数いる場合は、いくらランダムにしても、かなりの確率で衝突が発生して、いつまでたっても誰も送れない状態になってしまいます。そのため、フレームの衝突を検知した場合は、ランダムバックオフの時間を2倍にして、再度トライすることで、この問題を回避してます。