無線LANのアクセス制御と再送
同じ媒体を使う端末の待ちと再送が、転送量へ与える影響を計算します。
説明
Wi-Fiでは複数の端末が同じ無線媒体を共有します。送信速度の表示が高くても、待機、ACK、再送などが時間を使うため、そのままアプリケーションの速度にはなりません。
固定した時間条件で一件の送信に必要な時間を計算し、二端末のバックオフと隠れ端末の重なりを調べます。再送回数とRTS/CTSの追加時間を比べ、保護が有利になる条件を確認します。
1データと制御が使う時間
1500バイトを54Mbit/sで送るデータ部分の時間を求めます。
payload_bytes=届けたいデータ量1500; rate=データ部分のbit/s54_000_000; data_us=送信時間をµsへpayload_bytes*8/rate*1_000_000; roundデータ部分の時間(data_us,3)データ部分だけで約222.2µsです。この計算にはPHYの前置き、MACヘッダー、待機、ACKを含みません。54Mbit/sという表示からアプリケーションの1500バイトの送信周期を直接決められない理由です。
2共有媒体での待ちを加える
このモデルでは前置き等40µs、ACK等44µs、フレーム間隔等50µs、平均バックオフ67.5µsを追加します。方式固有の全規則を再現するものではありません。
overhead_us=制御と待機の合計40+44+50+67.5; cycle_us=一件あたりの時間data_us+overhead_us; (round所要時間と実効Mbit/s(cycle_us,3),round(payload_bytes*8/cycle_us,3))一件約423.7µs、実効データ比率として約28.3Mbit/sです。ここでは再送なしでも54Mbit/sより低くなります。実際の集約やACK方式、競合条件が違えば値も変わります。
3バックオフが小さい端末から送る
Aの残りスロットを3、Bを7、スロット幅9µsとします。他の送信がなく3スロット空いた時点を計算します。
slots=端末ごとの残り{"A":3,"B":7}; elapsed=空いたスロット数3; remaining=経過後の残り{k:v-elapsed for k,v in slots.items()}; (elapsed時間とカウンター*9,remaining)27µs後にAが0、Bは4です。Aが送信して媒体がbusyになる間、Bは残りを減らさず待ち、空いた後に所定の待機を経て再開します。同じ残り値を選んだ端末が重なる可能性はあるため、待機は衝突を完全に消すものではありません。
4互いが見えない端末の送信
AとBは互いの信号を検知できず、どちらもAPには届く配置です。送信時間区間をAが0〜300µs、Bが100〜400µsとして重なりを求めます。
a=Aの送信区間(0,300); b=Bの送信区間(100,400); overlap=APで重なる時間max(0,min(a[1],b[1])-max(a[0],b[0])); overlap重なりのµsAPでは200µs重なります。AとBがそれぞれ媒体が空いていると判断しても、受信側で競合するのが隠れ端末の問題です。このモデルは重なりだけを求め、捕捉効果などの無線受信現象は扱いません。
5再送に使った時間を数える
3件の成功に必要な送信試行回数が1・2・3だった記録を使います。各試行時間を同じcycle_usとする概算です。
attempts=成功までの試行回数[1,2,3]; total_us=全試行の媒体時間sum(attempts)*cycle_us; goodput=新しく届いたデータだけを数える3*payload_bytes*8/total_us; (sum再試行数と実効速度(attempts)-len(attempts),round(total_us,2),round(goodput,2))再試行は3回、合計約2542µs、約14.16Mbit/sです。再送したデータをアプリケーションの新しい転送量として二重に数えると、実効速度を過大評価します。
6保護の追加時間と再送削減を比較する
RTS/CTS等の保護で一件80µs増え、3件とも一度で成功した別条件を比較します。
protected_us=保護付きの三件3*(cycle_us+80); (round所要時間・実効速度・削減量(protected_us,2),round(3*payload_bytes*8/protected_us,2),round(total_us-protected_us,2))合計約1511µsで、再送の多かった条件より短くなります。RTS/CTSは相手のCTSを聞ける端末へ予約を知らせ、隠れ端末の競合を減らす場合がありますが、その交換自体も時間を使います。
7再送がない場合の通信時間
もともと三件とも一度で成功する条件と保護付きの場合を比較します。
unprotected_us=再送なしの三件3*cycle_us; (round保護の追加費用と速度(protected_us-unprotected_us,2),round(3*payload_bytes*8/unprotected_us,2))保護が240µsの追加費用になり、保護なしは約28.3Mbit/sです。保護は常に速くする設定ではなく、競合の削減が追加費用を上回る条件で役立ちます。
まとめ
PHY速度だけでなく、制御・待機・再送に使う共有時間を数えます。
隠れ端末への保護には追加費用があり、競合削減の効果と比較します。
操作履歴と解説を振り返れます。
Python 3
payload_bytes=1500; rate=54_000_000; data_us=payload_bytes*8/rate*1_000_000; round(data_us,3)222.222
overhead_us=40+44+50+67.5; cycle_us=data_us+overhead_us; (round(cycle_us,3),round(payload_bytes*8/cycle_us,3))(423.722, 28.32)
slots={"A":3,"B":7}; elapsed=3; remaining={k:v-elapsed for k,v in slots.items()}; (elapsed*9,remaining)(27, {'A': 0, 'B': 4})a=(0,300); b=(100,400); overlap=max(0,min(a[1],b[1])-max(a[0],b[0])); overlap200
attempts=[1,2,3]; total_us=sum(attempts)*cycle_us; goodput=3*payload_bytes*8/total_us; (sum(attempts)-len(attempts),round(total_us,2),round(goodput,2))(3, 2542.33, 14.16)
protected_us=3*(cycle_us+80); (round(protected_us,2),round(3*payload_bytes*8/protected_us,2),round(total_us-protected_us,2))(1511.17, 23.82, 1031.17)
unprotected_us=3*cycle_us; (round(protected_us-unprotected_us,2),round(3*payload_bytes*8/unprotected_us,2))(240.0, 28.32)
演習完了