802.11 無線 MAC:CSMA/CA とバックオフの原理
Wi-Fiが「ぶつかってから直す」のではなく「ぶつかる前に避ける」仕組みが腑に落ちる。CSMA/CAのバックオフ、隠れ端末とRTS/CTS、ACKまで無線MACの原理を一気に押さえられる。
- 1.無線では送信中に自分の信号を聞き返せず衝突を検出できないため、CSMA/CDではなく事前回避のCSMA/CAを使う。媒体が空いてもすぐ送らずランダムバックオフを挟む。
- 2.DIFS/SIFSという待ち時間の差で優先順位を作り、ACK・RTS/CTSを通常フレームより先に送れるようにしている。ACKが返らなければ衝突とみなして再送する。
- 3.互いの電波が届かない隠れ端末問題はキャリアセンスでは防げず、RTS/CTSでNAV(仮想キャリアセンス)を全端末に設定して媒体を予約することで回避する。
なぜ無線では CSMA/CD が使えないのか
有線イーサネットの CSMA/CD は「送信しながら媒体を監視し、衝突したら即座に検知して再送する」方式でした(/network/ethernet-switching-internals/ 参照)。これが無線では成立しません。理由は2つあります。
第一に、送信中に自分の電波で受信回路が飽和するため、はるかに微弱な他局の信号を同時に聞き取れません。送信と受信の電力差は桁違いで、半二重で動かざるを得ない無線機では「送りながら衝突を聴く」物理が破綻します。第二に、後述する隠れ端末問題により、そもそも互いの送信を検知できない端末対が存在します。
そこで 802.11 は方針を転換し、衝突を検出するのではなく回避する CSMA/CA(Collision Avoidance)を採用しました。要は「ぶつかってから直す」のではなく「ぶつからないよう事前にずらす」設計です。
| 観点 | CSMA/CD(有線) | CSMA/CA(無線 802.11) |
|---|---|---|
| 衝突への対処 | 送信中に検出して再送 | 送信前に回避する |
| 送信中の媒体監視 | 可能(衝突検出に利用) | 不可能(半二重で聴けない) |
| 空き直後の動作 | 即送信 | ランダムバックオフを必ず挟む |
| 送達確認 | なし(上位層に委ねる) | MAC層でACKを返す |
| 代表的な落とし穴 | 最小フレーム長の制約 | 隠れ端末問題 |
キャリアセンスは物理と仮想の二重構え
CSMA/CA の「CS(キャリアセンス)」は2層で行われます。
- 物理キャリアセンス(CCA): アンテナで受信電力を測り、しきい値を超えていれば媒体は使用中と判断する。実際の電波を聴く方式です。
- 仮想キャリアセンス(NAV): 各フレームのヘッダにある Duration フィールド から「この通信があと何マイクロ秒続くか」を読み取り、その間は媒体使用中とみなすカウンタ(NAV: Network Allocation Vector)を設定する。電波を聴かずに「予約済み」と判断する仕組みです。
物理・仮想のどちらか一方でも「使用中」なら送信を控えます。NAV は後述の RTS/CTS と組み合わさって隠れ端末対策の核になります。
IFS:待ち時間の差で優先順位をつくる
802.11 の巧妙さは、フレーム間隔(IFS: Inter-Frame Space)の長さを変えることで送信の優先順位を作る点にあります。媒体が空いてから送信開始までに置く待ち時間を、用途ごとに変えるのです。
| IFS | 相対的な長さ | 用途 | 意味 |
|---|---|---|---|
| SIFS | 最短 | ACK・CTS・分割フレームの続き | 進行中のやり取りを最優先で割り込ませる |
| PIFS | 中 | PCFなどポーリング制御 | 通常データより先に媒体を取る |
| DIFS | 長 | 通常のデータ送信の開始 | 新規送信はここまで待つ |
| EIFS | 最長 | 誤り受信後の回復 | 壊れたフレームの後は長めに待つ |
肝は SIFS が DIFS より短いことです。あるデータフレームの受信を終えた受信側は、SIFS(短い待ち)だけ待って ACK を返します。一方、別の端末が新しいデータを送り始めるには DIFS(長い待ち)を待たねばなりません。SIFS のほうが先に切れるので、ACK は常に新規送信に割り込んで先に媒体を確保できます。待ち時間の長短だけで、ロック機構なしに優先制御を実現しているわけです。802.11e/WMM の QoS がアクセスカテゴリごとに待ち時間を変えて優先度を作るのも、この発想の延長です(/network/qos/ 参照)。
ランダムバックオフ:空いても即送信しない
DIFS が経過して媒体が空いていても、端末はすぐには送りません。ランダムバックオフを挟みます。これが CSMA/CA の心臓部です。
1. 送信したいフレームがある
2. 媒体がDIFSの間ずっと空くのを待つ
3. バックオフカウンタ = [0, CW] の一様乱数(スロット単位)
4. 媒体が空いている間、1スロットごとにカウンタを1減らす
5. 途中で媒体が使用中になったら → カウンタを凍結し、
再び空いてDIFS経過したら残り値から再開する
6. カウンタが0になった瞬間に送信開始
ポイントは2つあります。1つ目は [0, CW] の乱数にすること。複数端末が同時に DIFS 待ちを終えても、それぞれ別のバックオフ値を引くため、カウンタが先に0になった端末だけが送信でき、衝突確率が下がります。
2つ目は 凍結と再開です。バックオフ中に他局が送信を始めたらカウンタを止め、媒体が再び空いたら残り値から数え直します。これにより、長く待っていた(カウンタが小さくなっている)端末ほど次に送れる公平性が生まれます。
CW の指数的拡大(バイナリ指数バックオフ)
CW(Contention Window)は固定ではありません。送信が成功すれば最小値 CWmin に戻し、失敗するたびに CW = 2 * CW + 1 で約2倍に広げます(上限 CWmax で頭打ち)。
試行1: CW = CWmin (例: 15)
試行2: CW = 2*15+1 = 31
試行3: CW = 2*31+1 = 63
... 上限 CWmax(例: 1023)で頭打ち
混雑して衝突が続くほど乱数の幅が広がり、端末同士が同じスロットを選ぶ確率が下がります。有線 CSMA/CD の二進指数バックオフと数理は同じですが、無線では送信前に必ずこのバックオフを通す点が決定的に異なります。
無線では衝突を電気的に観測できません。そこで受信側は、フレームを正しく受け取ったら SIFS 後に ACK を返します。送信側は一定時間内に ACK が返らなければ「衝突したか、電波が届かなかった」と判断し、CW を広げて再送します。つまり ACK の不在が、CSMA/CD における衝突検出の役割を担っています。
ACK による信頼性確保
802.11 の MAC は、各ユニキャストフレームに対し1対1の即時 ACK を返す停止待ち(stop-and-wait)方式です。送信成功の判定は ACK の受信であり、ACK が来なければ再送します。これは TCP の確認応答とは別物で、L2 のホップ単位で動きます。無線リンクはビット誤り率が有線より格段に高いため、上位層に任せず MAC 層で素早く再送するほうが効率的なのです。
なお、ブロードキャスト/マルチキャストフレームには ACK がありません。受信者が複数いて ACK が衝突してしまうため、信頼性確保はベストエフォートになります。
隠れ端末問題と RTS/CTS
CSMA/CA でも防げない衝突があります。隠れ端末問題です。
A ───────── AP ───────── C
(AとCは互いの電波が届かない)
端末 A と C はどちらも AP(アクセスポイント)と通信できますが、A と C は互いの電波が届かない位置にいるとします。A が AP へ送信中でも、C のキャリアセンスには A の電波が映りません。C は「媒体は空いている」と誤判断して送信し、AP の位置で A と C のフレームが衝突します。物理キャリアセンスは送信元の電波しか聴けないため、この衝突は原理的に防げません。
解決策が RTS/CTS ハンドシェイクです。
| 手順 | 送るフレーム | 向き | 効果 |
|---|---|---|---|
| 1 | RTS(送信要求) | A → AP | 「これから送りたい、所要時間はN」と宣言 |
| 2 | CTS(送信可) | AP → 全方位 | 「許可。N の間みな黙れ」を全端末に放送 |
| 3 | DATA | A → AP | 実データを送信 |
| 4 | ACK | AP → A | 受信成功を通知 |
鍵は CTS が AP から全方位に送られることです。隠れ端末 C にも AP からの CTS は届きます。C は CTS の Duration フィールドを読んで NAV を設定し、その期間は物理的に電波を聴かずとも「媒体は予約済み」と判断して沈黙します。互いに見えない A と C を、両方から見える AP が仲介して時間調停するのが RTS/CTS の本質です。
RTS/CTS 自体にもオーバーヘッド(往復2フレーム+IFS)があります。短いフレームに毎回付ければ効率が落ちるため、実装では RTS しきい値を設け、それを超える長いフレームにだけ RTS/CTS を適用するのが一般的です。短いフレームは衝突しても再送コストが小さく、長いフレームほど衝突時の損失が大きいため、長いものだけ保護する設計です。
公開端末問題という副作用
RTS/CTS は逆向きの副作用も生みます。**公開端末問題(exposed terminal problem)**です。ある端末が CTS や RTS を傍受して NAV を立てたものの、実際にはその通信と干渉しない位置にいて、本来なら同時に送れたのに送信を見送ってしまうケースです。NAV による予約は安全側に倒すぶん、達成可能なスループットを下げる方向にも働きます。RTS/CTS は隠れ端末を救う一方で、必要のない端末まで黙らせ得る——この非対称性が無線 MAC のチューニングを難しくしています。
公称リンク速度が高くても、媒体が1つしかない共有空間では、DIFS・バックオフ・SIFS・ACK・(必要なら)RTS/CTS といった制御のための時間が実効スループットを押し下げます。とくに端末数が増えると衝突とバックオフが増え、帯域は出ているのに体感が遅い状況が生まれます。帯域と実効スループットが別物である理由は /network/bandwidth-latency/ も併せて読むと立体的に理解できます。
「無線でCSMA/CDが使えない理由は」→ 送信中に自分の電波で他局信号を聴けず衝突検出が不可能、加えて隠れ端末の存在。「CSMA/CAの核は」→ DIFS後のランダムバックオフで送信タイミングをずらす。「SIFSがDIFSより短い意味は」→ ACK/CTSを新規送信より優先させる。「隠れ端末の対策は」→ RTS/CTSとNAVによる仮想キャリアセンス。「衝突をどう知るか」→ ACKが返らないこと。この5点を因果で結べれば上級。
まとめ
無線 MAC は「衝突を検出できない」という物理的制約から出発し、検出ではなく回避へ舵を切りました。DIFS 待ちのあとに必ずランダムバックオフを挟んで送信タイミングを分散させ、失敗のたびに CW を指数的に広げて再衝突を抑えます。衝突の有無はACK の有無で間接的に知り、L2 ホップ単位で再送して無線の高い誤り率を吸収します。物理キャリアセンスでは救えない隠れ端末には、AP が放送する CTS と **NAV(仮想キャリアセンス)**で媒体を予約して対処します。これら一連の仕掛けは、共有された空間という1つの媒体を、見えない相手も含めて時間で公平に分け合うための設計として一貫して読み解けます。
ネットワーク Article
802.11 無線 MAC:CSMA/CA とバックオフの原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
Wi-Fi
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 5
導入後に効く点
DIFS/SIFSという待ち時間の差で優先順位を作り、ACK・RTS/CTSを通常フレームより先に送れるようにしている。ACKが返らなければ衝突とみなして再送する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「Wi-Fi / 802.11」に近いか確認する。
- 強みである「無線では送信中に自分の信号を聞き返せず衝突を検出できないため、CSMA/CDではなく事前回避のCSMA/CAを使う。媒体が空いてもすぐ送らずランダムバックオフを挟む。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。