Ubuntu Weekly Recipe

第371回無線LANの電波環境を視覚化・改善しよう

今月発売されたSoftware Design 2015年5月号のUbuntu Monthly Reportでは、あわしろいくやさんが「Ubuntu 14.04で使用できるUSB無線LANアダプター7選」を書いてくれています。そこで今回はより快適な無線LAN環境を構築する上では避けては通れない電波環境の調査(サイトサーベイ)の方法について説明します。

この世はすべて波だらけ

無線LANは無線通信で構築したローカルエリアネットワークです。使用する無線通信はBluetoothや赤外線などいろいろな種類が存在しますが、そのうちWi-FiロゴのついたIEEE 802.11規格対応の機器を使用する無線通信が一般的でしょう。今回の記事も、IEEE 802.11に限定して説明します。

IEEE 802.11は主に2.4GHz帯と5GHz帯の電波を利用した通信方式であり、使用する周波数や通信方式、それに伴うデータレートの違いなどによっていくつかの種類に分かれています。802.11acや802.11nなど数字の後ろにある文字がこの種類に該当します。

2.4GHz帯は2.400GHzから2.500GHzまでを、5GHz帯はおおよそ5.1GHzから5.8GHzあたりまでを利用します。と言っても1つのクライアントがこの周波数帯を常に使用するわけではなく、周波数帯を一定間隔で「チャンネル」に細分化し、アクセスポイントごとに使用するチャンネルを決めます。これにより異なるアクセスポイントが近い場所にあったとしても、干渉することなく通信ができるのです。

チャンネル幅は、802.11bが22MHz、802.11a/g/n/acは20MHzとなっています。さらに802.11n/acは、チャンネルボンディングという仕組みで複数のチャンネルを同時に使用することで40MHzや80MHzといったより広帯域な(=より高速な)チャンネルを利用できます。

チャンネル番号は5MHzずつずらして割り当てられています。それに対してチャンネル幅は20MHz/22MHzなので、4チャンネルないし5チャンネルずらさないと干渉してしまいます。たとえば2.4GHzにおいて20MHz幅だとch1(中心周波数2.412GHz)は2.402GHzから2.422GHzを使用します。これと干渉しないチャンネルとなると、20MHz(=5MHz×4ch)ずれた2.422GHzから2.442GHzを使用するch5ないしそれ以上離れたチャンネルである必要があるということです[1]⁠。

2.4GHz帯は802.11bの場合14チャンネル、802.11g/nの場合13チャンネル存在しますので、5チャンネルずつ離すとなると、現実的に同時に利用できるのは最大3チャンネルということになります。

5GHz帯の場合、元から利用可能なチャンネルが4チャンネルずつ離れたチャンネルに限定されています(たとえばch36、40、44と言った具合⁠⁠。また利用できる周波数帯が広いため、最新の機器であれば19チャンネル利用できます。

電波が干渉する要因

802.11で利用している電波は、距離や障害物、他の電磁波との干渉によって減衰します。減衰すると、相対的にノイズの割合は大きくなり、充分に性能を発揮できなくなったり、最悪の場合は通信が途絶します。

電波は周波数が高くなると直進性が上がり、水分による吸収率が上がる性質を持っています。直進性があがると言うことは障害物を避けずにまっすぐ進む(回折しづらくなる)と言うことであり、障害物の向こう側に電波が届きにくくなるということです。水分による吸収率が上がると言うことは、空気中の水分によって減衰しやすくなるため、距離が遠くなるほど信号強度は落ちて行きます。このため、障害物の多い室内では、5GHzよりも2.4GHzの方が電波は届きやすくなります。

ところが2.4GHz帯はISMバンドと呼ばれる国際的に無線通信以外にも利用して良い帯域の一部です。このため各種高周波装置によって干渉を受ける可能性があります。たとえば2.4GHzを使う802.11b/g/nは電子レンジと干渉することはよく知られています。5GHz帯にしても気象レーダーとの干渉防止のために、自動的なチャンネル変更機能などが義務付けられています。

Wi-Fiルーターも普及した結果、Wi-Fiルーター同士の干渉も無視できなくなっています。2.4GHzは同時に3チャンネルしか使用できないという話をしました。2.4GHzであれば屋内でも数十メートルぐらいは充分に通信可能な信号強度で電波が到達するため、この区間内部に4つ以上のWi-Fiルーターがあると干渉を起こしてしまうということになります。

802.11n/acなどは複数のチャンネルを同時に利用することでデータレートを上げられる仕組みが存在しますが、複数のWi-Fiルーターが存在する結果、使用できるチャンネルが限られているために、充分な性能を発揮できないと言うことも起こりえます。

このように複数の要因が複雑に絡み合っているため、個々の無線LAN環境の改善には現地における電波環境の調査が必須なのです。本格的に実施するにはそれなりの機材が必要ですが、今回はごく普通の無線LANアダプターとUbuntuでインストールできるソフトウェアを利用して、簡易的に調べてみることにしましょう。

無線LANの接続状況を確認する

まずは現在の無線LANクライアントがどのような状態になっているか確認してみましょう。汎用的に使えるツールはiwパッケージで提供されているiwコマンドです[2]⁠。ipコマンドに似たインターフェースで、情報表示だけでなく設定変更やリンクアップなども行えます。

このコマンドには3種類のオブジェクトで操作方法が変わります。まず「iw dev」はネットワークインターフェースに関する操作を行います。これはipコマンドに802.11関連の情報が追加されたものと言うイメージです。次に「iw phy」は指定したハードウェアの情報、サポートしている機能などを表示します。最後に「iw reg」は電波法のような規制に関する操作を行います。

今回は既に無線LANに接続しているwlan0インターフェースの情報を表示してみます。

$ iw dev
phy#0
        Interface wlan0
                ifindex 3
                wdev 0x1
                addr 64:80:99:xx:xx:xx
                type managed
                channel 100 (5500 MHz), width: 40 MHz, center1: 5510 MHz

まず「iw dev」を引数なしで実行して対象のインターフェース名を取得しています。ここでも若干接続情報が出ていますが、詳細はこのインターフェース名を用いて、linkサブコマンドで表示します。

$ iw dev wlan0 link
Connected to a4:12:42:xx:xx:xx (on wlan0)
        SSID: aterm-xxxxxx-a
        freq: 5500
        RX: 77090059 bytes (270174 packets)
        TX: 6422159 bytes (34948 packets)
        signal: -49 dBm
        tx bitrate: 300.0 MBit/s MCS 15 40MHz short GI

        bss flags:      short-slot-time
        dtim period:    1
        beacon int:     100

「Connected to」は接続先のBSSIDであり、アクセスポイントのMACアドレスです。SSIDは無線LANではお馴染みのアクセスポイントの識別名ですね。freqは周波数です。5500MHzということなので、⁠iw dev」にもあるように5GHz帯のch100であることがわかります。RX/TXはそれぞれ受信バイト、送信バイトの統計情報です。

signalは受信信号強度と呼ばれるRSSI(Received Signal Strength Indicator)の値です。値は1mWの出力を0dBとしたときの対数比です。よって、数字が大きいほうが信号強度が強い=ちゃんと受信できていると言うことになります。たとえばネットワークインジケーターのアンテナアイコンは、4本の線を使って5段階の強度を表示しています。4本すべての線が点灯している(強度が強い)時が-52dBm以上、3本の時が-64dBm以上、2本なら-76dBm以上、1本なら-88dBm以上、0本なら-88dBm未満をそれぞれ意味します。上記の-49dBmは、すごい良いわけでもないが、そこまで悪くもないと言う状態です。

Wi-Fi機器は信号強度から使用可能なデータレートを決めるため、非常に重要な値となります[3]⁠。その結果が「tx bitrate」です。MCSは802.11nにおけるModulation and Coding Schemeのインデックス値です。40MHzがチャンネル幅で前述の通り2チャンネル使用していると言うことになります。⁠short GI」Guard Intervalに802.11標準の800ナノ秒ではなく、より短い400ナノ秒を使っていることを意味します。短くするとエラー率は上がりますが、データレートが向上するというメリットがあります。800ナノ秒の場合はここは何も表示されません。MCSインデックス値、チャンネル幅、Guard Intervalから現在のデータレートの理論値は300MBit/sとなっている、ということをtx bitrateでは示しているのです。

「bss flags」はBSS(Basic Service Set)つまりはそのアクセスポイント配下のネットワークにおける各種設定を記述しています。short-slot-timeは、配下に802.11bのクライアントがいないことを前提に短いSlot Timeを使っていると言うことです。他にもshort-preambleやCTS-protectionなど、主に802.11gの設定が表示されることがあります。

「dtime period」「beacon int」はアクセスポイントがマルチキャスト/ブロードキャストフレームを送信する間隔とビーコンを送信する間隔を表示しています。上記の例では、beacon intが100なので、100ミリ秒ごとにビーコンが送られてくることになります。DTIM(Delivery Traffic Indication Map⁠⁠ periodはビーコン何回ごとに、マルチキャスト/ブロードキャストフレームを送るかを指定するための値で、1だと「毎回送る(beacon intが100なので100ミリ秒ごとに送る⁠⁠」ことになります。これが2だとビーコン2回ごとになるので、200ミリ秒ごとに送られることになります。

iwコマンドはさらにクライアント(アクセスポイント/APに対して、ステーション/STAなどと呼ばれます)の統計情報を表示できます[4]⁠。

$ iw wlan0 station dump
Station a4:12:42:xx:xx:xx (on wlan0)
        inactive time:  684 ms
        rx bytes:       81631581
        rx packets:     287139
        tx bytes:       6950340
        tx packets:     37830
        tx retries:     387
        tx failed:      0
        signal:         -47 dBm
        signal avg:     -46 dBm
        tx bitrate:     150.0 MBit/s MCS 7 40MHz short GI
        rx bitrate:     216.0 MBit/s MCS 13 40MHz
        authorized:     yes
        authenticated:  yes
        preamble:       long
        WMM/WME:        yes
        MFP:            no
        TDLS peer:      no

ここでのポイントは「tx retries」⁠tx failed」です。それぞれ再送信した回数と、再送信したものの結果的に失敗になった回数を表示しています。接続が不安定な場合は、ここの値を見ると良いでしょう。デバイスによってはさらに、⁠expected throughput」というフィールドが現れる場合もあります。

無線LANデバイスのサポート状況を確認する

iw devはステーションとしてアクセスポイントとの接続を確立した状態を表示していました。それとは別に使用しているデバイスそのもの状態を確認したい場合、⁠iw phy」コマンドを利用できます。

$ iw phy
Wiphy phy0
        ...
        Supported Ciphers:
                * WEP40 (00-0f-ac:1)
                * WEP104 (00-0f-ac:5)
                * TKIP (00-0f-ac:2)
                * CCMP (00-0f-ac:4)
        Supported interface modes:
                 * IBSS
                 * managed
                 * AP
                 * AP/VLAN
                 * monitor
        Band 1:
                ...
                HT TX/RX MCS rate indexes supported: 0-15
                Bitrates (non-HT):
                        ...
                        * 54.0 Mbps
                Frequencies:
                        * 2412 MHz [1] (15.0 dBm)
                        ...
        Band 2:
                ...
                Frequencies:
                        ...
                        * 5260 MHz [52] (15.0 dBm) (no IR, radar detection)
                          DFS state: usable (for 10406 sec)
                          DFS CAC time: 60000 ms
                        ...
                        * 5500 MHz [100] (15.0 dBm) (no IR, radar detection)
                          DFS state: usable (for 10406 sec)
                          DFS CAC time: 60000 ms
                        ...
        Supported commands:
                ...

とても長いので、主だった所だけを抜き出しています。

「Supported Ciphers」は対応しているセキュリティプロトコルです。WEP40/WEP104がそれぞれ40ビット/104ビット鍵長のWEPで、TKIPがWPAのころに策定された暗号化プロトコル、CCMPが暗号化アルゴリズムとしてAESを利用しているWPA2標準のプロトコルです。

「Supported interface modes」はインターフェースのモードです。IBSSはアドホック接続で使われるモード、managedは通常の無線LANクライアントとして利用する場合のモード、APはmasterモードとも呼ばれるアクセスポイントとして利用するモードです。AP/VLANはVLANを使うモードで、monitorはネットワークトラフィックを監視するモードになります。対応モードにAPが入っていることからもわかるように、一般的なWi-Fi対応機器であれば無線LANの子機としてだけでなく、アクセスポイントとして使うことも可能です。実際、スマートフォンのWi-Fiテザリングは普段クライアントとして使っているデバイスをAPモードに切り替えることで実現しています。

「Band 1」「Band 2」は対応周波数帯域のセットです。⁠Frequencies」を見るとわかるように、上記の例ではBand 1が2.4GHz帯、Band 2が5GHz帯です。それぞれの周波数帯ごとに、個別の設定が表示されています。

「HT TX/RX MCS rate indexes supproted」は前述のMCSでサポートしているインデックスを列挙しています。⁠Bitrates」「Frequencies」も同じです。Bitratesはあくまで理論値であり、受信信号強度との組み合わせによって実効速度は変わるということに注意しなくてはなりません。FrequenciesのDFS stateはDFS(Dynamic Frequency Selection)によってこの周波数帯が利用可能である(気象レーダーによって利用されていない)かどうかを表示します。⁠usable (for 10406 sec)」と言うことはつまり、10406秒間利用可能状態が続いているということです[5]⁠。

デバイスがサポートしている周波数帯であっても、国によって利用できる周波数帯は異なります。たとえば世界中で使える2.4GHzのch12やch13はアメリカでは利用できませんし、802.11bで使用できるch14は日本のみ利用可能です。このあたりの情報はCRDAでデータベース管理されていて、現在の設定値もiwコマンドで確認できます。

$ iw reg get
country JP: DFS-UNSET
        (2402 - 2482 @ 40), (N/A, 20), (N/A)
        (2474 - 2494 @ 20), (N/A, 20), (N/A), NO-OFDM
        (4910 - 4990 @ 40), (N/A, 23), (N/A)
        (5030 - 5090 @ 40), (N/A, 23), (N/A)
        (5170 - 5250 @ 40), (N/A, 20), (N/A)
        (5250 - 5330 @ 40), (N/A, 20), (0 ms), DFS
        (5490 - 5710 @ 40), (N/A, 23), (0 ms), DFS

iwコマンドはアクセスポイントの情報表示にも使えます。うまくアクセスポイントに接続できない時、サポートしている暗号化プロトコルなどがマッチしているか確認してみてください。

$ sudo iw wlan0 scan

単純にアクセスポイントリストを表示したいだけであれば、NetworkManagerのnmcliコマンドでもかまいません[6]⁠。

$ nmcli dev wifi
*  SSID                モード  CHAN  レート     信号  BARS  セキュリティ
   aterm-xxxxxx-g      Infra   1     54 Mbit/s  80    ▂▄▆_  WPA1 WPA2
*  aterm-xxxxxx-a      Infra   100   54 Mbit/s  76    ▂▄▆_  WPA1 WPA2
   aterm-xxxxxx-gw     Infra   1     54 Mbit/s  19    ___  WEP
   aterm-xxxxxx-gw     Infra   10    54 Mbit/s  47    ▂▄__  WEP
   90XXXXXXXXXX        Infra   2     54 Mbit/s  45    ▂▄__  WPA1 WPA2
   apxxxxx             Infra   13    54 Mbit/s  82    ▂▄▆█  WPA2

心なしかグラフィカルなツールたち

ここまでのツールを使えば、簡易的なサイトサーベイが可能です。つまり「iw dev wlan0 link」で信号強度を見ながら、無線LANクライアントとなるノートPCを移動させて、部屋の中で強度の高い場所をマッピングすると言う原始的な方法です。

もちろんノートPC側ではなく、Wi-Fiルーターを動かすという手もあります。特に指向性の高い5GHz帯の場合、ルーターの向きを変えるだけで結果が変わる場合もありますし、反射素材が近くにあるかないかでも変わってきます。

2.4GHzと5GHzは信号強度の高いほうを選べば良い結果が得られるでしょう。ただし時間帯や人の通りによっても結果が変わりうるということには注意が必要です。

アクセスポイント側の設定で使用するチャンネルを、信号強度の高いものに変えるという手もなくはないのですが、今どきのアクセスポイントであれば自動設定に任せておいたほうが無難です。少なくとも5GHz帯の一部はDFSによって自動的にチャンネルが変わる可能性があるので、チャンネルを固定することはあまり意味がありません。

信号強度が低いアクセスポイントに接続する場合、MCSインデックス値を意図的に下げて、より低いデータレートにすることで品質を保つという方法があります。これは「iw dev wlan0 set bitrates」で実現できます。

とは言えこの方法では、ちょっとわかりにくいのも事実です。そこでより人間にやさしく視覚化してくれるGUIっぽいツールをいくつか挙げておきましょう[7]⁠。

信号強度のリアルタイムグラフを表示する「wavemon」

「wavemon」はiwコマンドで表示していた信号強度などのデータを、よりわかりやすく整形したり、リアルタイムグラフとして表示してくれる、ターミナルアプリです。第23回でも紹介されています。

$ sudo apt-get install wavemon
図1 現在値や統計情報などをまとめて表示してくれる
図1 現在値や統計情報などをまとめて表示してくれる

起動方法は端末内部で「wavemon」コマンドを実行するだけです。使い方もとても単純で、ヘルプを見ればわかるように「パニックに陥らない」ことだけ。ファンクションキーを使うことで表示モードを切り替えて利用します。

図2 信号強度のリアルタイムグラフ。デバイスが対応していればノイズ強度やSNRも表示できる
図2 信号強度のリアルタイムグラフ。デバイスが対応していればノイズ強度やSNRも表示できる
図3 とても親切なヘルプ画面
図3 とても親切なヘルプ画面

ほとんどの機能は一般ユーザーの権限で問題ありませんが、F3のscanモードを利用する場合だけ、管理者権限で起動する必要があります。

図4 scanモードの画面
図4 scanモードの画面

scanモードでは、画面下部に5GHz帯と2.4GHz帯の比率や、重複しているチャンネルトップ3も表示するので、周波数帯の選定に役立つことでしょう。

複数のチャンネルの信号強度やノード数を表示できる「horst」

horstは複数のチャンネルの信号強度やノード数などを同時に表示できるツールです。

$ sudo apt-get install horst

horstはチャンネルを変更しながら未接続のアクセスポイントからのパケットなども受信するために、インターフェースをモニターモードにする必要があります。

$ sudo iw wlan0 interface add mon0 type monitor
$ sudo horst -i mon0

上記でうまく動かない時は、一度ネットワークを切断し、wlan0そのものをモニターモードにしてください。

$ sudo ip link set wlan0 down
$ sudo iw wlan0 set type monitor
$ sudo ip link set wlan0 up

画面下部に機能一覧が表示されています。モードを変更するには、下線が引いてあるアルファベットのキーを押してください。

図5 起動直後は受信したパケットログが表示される
図5 起動直後は受信したパケットログが表示される

「Spec」表示にすると、チャンネルごとの信号強度(緑⁠⁠、AP/STAのノード数(青⁠⁠、パケット量の割合(黄)が表示されます。14.04の場合、使用しているチャンネルはリアルタイムで表示していますし、それ以外のチャンネルについても信号強度とノード数は60秒ごとに更新されます。

図6 信号強度の一覧画面
図6 信号強度の一覧画面

作成したmon0は次のように削除します。

$ sudo iw mon0 del

wlan0をモニターモードにした場合は次のように戻します。

$ sudo ip link set wlan0 down
$ sudo iw wlan0 set type managed
$ sudo ip link set wlan0 up

高機能診断ツール「Kismet」

Kismetは無線ネットワークの検出やパケットキャプチャ、侵入検知などを行える高機能診断ツールで、各種診断ツールに組み込めるのが特徴の1つです。

$ sudo apt-get install kismet

インストール時に「setuid root」で実行するか問われます。通常は「はい」にしてください。こうしておけばkismetをsudoなしに実行できます。また、kismetグループには自分自身のユーザー名を追加しておいてください。一度ログアウトしてログインすれば、設定が反映されます。

$ kismet

Kismetは情報を収集するサーバーとそれを表示するクライアントに分かれています。上記のようにサーバーを指定せずにクライアントとして起動した場合は、サーバーを立ち上げるかどうか問われますのでYesを選んでください。その後、サーバーのコンソールが表示されるので、TABキーでナビゲートしながら「Close Console Window」を選択します。

さらに情報取得のインターフェースを追加するかどうか問われますので、⁠Intf」にwlan0と入力して「add」を選択します。すべて無事セットアップできると次のような画面が表示されるはずです。

図7 Kismetの基本画面
図7 Kismetの基本画面

インターフェースについては設定ファイルに書いておく他に「-c wlan0」などとコマンドで指定することも可能です。

左上のメニューは「~」を入力してから、下線のキーやカーソルキーでナビゲートできます。試しに「Windows」「Channel Details」を表示してみましょう。

図8 Channel Details画面
図8 Channel Details画面

上からチャンネルごとの信号強度、パケット/秒、バイト/秒の値です。horstに比べるとシンプルではありますが、概要を知るには充分でしょう。

「iperf3」で実効速度を調べる

電波環境が悪い時の典型的な症状は「なんかよくわからないけど無線LANが遅くなる時があるし、たまに切れる」です。この「遅くなる」を定量化しておけば、電波環境の改善前後でどれくらい速度に影響が出ているかわかりますし、効果がわかれば気持ち的にもすっきりします。そこで最後に、iperf3を使った測定方法も説明しておきましょう。

iperf3はネットワークのスループットを調べるためのツールです。2つの拠点にクライアントとサーバーをそれぞれ起動して、この拠点間の通信を行うことで計測します。iperf3は同様の機能を持ったiperf2とは独立して新規に書き直されたツールで、データの送信側を逆方向に変更したり、JSON形式で出力できたりと、便利な機能がいろいろと追加されています。Ubuntu 14.04 LTSの場合、iperfパッケージでiperf2を、iperf3パッケージでバックポートリポジトリからiperf3をインストールできます。

iperf3はiperf2とは互換性がないことになっていますが、基本的な操作方法はそれほど変わりません。そこで今回はこのiperf3を使う方法を説明します。

無線LANのスループットを計測するにはマシンが2台必要です。できれば片方はアクセスポイントに有線で接続していたほうが好ましいですが、両方とも無線LANクライアントでも計測できないわけではありません[8]⁠。今回は有線で接続しているほうをserver、無線LANで接続しているほうをclientと表記します。2台ともiperf3が動くOSが動いているものとして、両方にiperf3をインストールしてください。

$ sudo apt-get install iperf3

serverの方は、iperf3をサーバーモードで起動します。

$ iperf3 -s

次にclientのほうで、serverのIPアドレス(192.168.0.20)に向けてデータを送信して計測します。

$ iperf3 -c 192.168.0.20
Connecting to host 192.168.0.20, port 5201
[  4] local 192.168.0.15 port 36970 connected to 192.168.0.20 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  1.60 MBytes  13.4 Mbits/sec    0   67.9 KBytes
[  4]   1.00-2.00   sec  2.35 MBytes  19.7 Mbits/sec    0   67.9 KBytes
[  4]   2.00-3.00   sec  2.21 MBytes  18.5 Mbits/sec    0   67.9 KBytes
[  4]   3.00-4.00   sec  2.34 MBytes  19.6 Mbits/sec    0   67.9 KBytes
[  4]   4.00-5.00   sec  2.36 MBytes  19.8 Mbits/sec    0   67.9 KBytes
[  4]   5.00-6.00   sec  2.29 MBytes  19.2 Mbits/sec    0   67.9 KBytes
[  4]   6.00-7.00   sec  2.04 MBytes  17.1 Mbits/sec    0   67.9 KBytes
[  4]   7.00-8.00   sec  2.14 MBytes  18.0 Mbits/sec    0   67.9 KBytes
[  4]   8.00-9.00   sec  2.39 MBytes  20.1 Mbits/sec    0   84.8 KBytes
[  4]   9.00-10.00  sec  2.67 MBytes  22.4 Mbits/sec    0    102 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  22.4 MBytes  18.8 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  22.2 MBytes  18.6 Mbits/sec                  receiver

iperf Done.

これだけです。TCPだけでなくUDPで計測したい場合は、-uオプションを付けてください。UDPの場合は-bオプションで帯域幅を指定できます。理論値に近い値を指定したときにどれくらいパケットロスが発生するかを確認すると良いでしょう。

おすすめ記事

記事・ニュース一覧