Wi-Fi・Bluetooth・DNS

Wi-Fiのサインインページ、Bluetoothオーディオの音飛び、ネットワークごとに最速のDNS。

Bluetoothオーディオ:AirPodsの音が乱れる理由

AirPodsなどのBluetoothヘッドフォンやスピーカーで再生している間、Kilobatは5秒ごとに、Mac側で音の乱れや途切れを起こしうるものを確認します。Bluetoothは2.4 GHz帯を飛び回り、Wi-Fiと無線を共有しているため、確認するのは次の項目です:MacのWi-Fiが2.4 GHz帯か、そのチャンネルが近所のネットワークで混雑していないか(過去30分以内のWi-Fiスキャンから判断。スキャン自体が音飛びを起こすことがあるため、聴いている間はスキャンしません)、AirDropのリンク(AWDL)が使用中か、それをAirDrop、ユニバーサルコントロール、Sidecarのどれが使っているか、Wi-Fiで2.5 MB/s以上の通信があるか(最も通信量の多いアプリも表示)、ヘッドフォンのBluetooth信号が−72 dBm以下か、ほかのBluetoothデバイスが4台以上接続されているか。macOSの音声出力はCore Audioから読み取るため許可は不要で、ヘッドセットのマイクもオンになっているかを記録します。その場合macOSは音質の低いハンズフリーモードを使うため、途切れやすくなります。信号とほかのデバイスの確認にはBluetoothの許可が必要で、「Bluetoothを確認」を押したときにだけ求められます。

妨げになっているものがあると、「ヘルス」に変えるべき点が効果の高い順に1行で表示されます:ルーターの5 GHzネットワークに接続する(macOSが範囲内のネットワークを覚えていればボタン付き。2.4 GHzと同じ名前の場合も含みます)、ルーターをチャンネル1、6、11のうち最も空いているものに設定する、AirDropを一時停止する(ボタン付き。macOSがパスワードを求め、音が5分間止まるか1時間たつとAirDropは元に戻ります)、大きなダウンロードを一時停止する、近づくかMacをバッグから出す。通話中は、Mac本体のマイクを使うことも提案します。こうするとヘッドフォンは高音質のままです。Kilobatは音そのものを聞くことはできません。Bluetoothオーディオが途切れても、macOSはほかのアプリに知らせないため、アドバイスは状況から判断したもので、そのことも明記されます。その行か「ヘルス」の「周辺」パネルで音が乱れているを押すと、Kilobatに伝えられます。そのとき妨げになっていたものを記録し、何もなかった場合は、距離かヘッドフォン自体の接続が原因である可能性が高いと伝えます。通知は1回の再生につき1度だけで、2つ以上の原因が20秒間重なったときに限り、最大でも4時間に1回です。「設定」›「モニタリング」でオフにできます。ここまではすべて無料です。Proでは、Wi-Fiが2.4 GHz帯だったときやAirDropがスキャン中だったときにBluetoothヘッドフォンで聞いた通話について、成績表にその旨の1行が加わります。ターミナルではkilobat bluetooth audioで同じ確認ができ(アプリが動いていれば信号と最も通信量の多いアプリも加わります)、エージェントはget_bluetooth_audioで読み取れます。

「ヘルス」›「ローカルリンク」には、リンク速度の横にMacとルーターが選択したチャンネル、帯域、チャンネル幅、Wi-Fi規格(Wi-Fi 4、5、6、6E、7と802.11の名称)、WPA2 PersonalやWPA3 Personalなどのセキュリティ、Macの送信出力を表示します。古い規格や5 GHzでの20 MHzチャンネルは、信号の強さに関係なくリンク速度を制限します。

オープンネットワーク(Wi-Fi自体にパスワードも暗号化もない状態。HTTPSを使うサイトやアプリは暗号化されたまま)と、古くWi-Fiを遅くするWEPや初期のWPAでは、セキュリティが赤く表示され、その意味を説明します。Enhanced Openはパスワードなしで暗号化します。レーダーの近くのネットワークには、それぞれが提供する最も強いセキュリティを表示します。ターミナルではkilobat wifi statusが同じ情報を表示し、CoreWLANが提供する場合は--jsonにwidthMHz、standard、phyMode、security、securityLevel(強い、良好、弱い、オープン)、securityNote、transmitPowerDBm、countryCodeを追加します(MCP:get_wifi)。kilobat scan --jsonとscan_wifiは各ネットワークのsecurityとsecurityLevelを追加します。

Wi-Fiのサインインページ

ホテル、カフェ、空港、コワーキングスペースのWi-Fiは、独自のページでサインインするまですべての接続を止め、1時間や1日たつと再びログアウトさせることがよくあります。KilobatはmacOSやAndroidと同じ方法でそのページを確認します。captive.apple.comへのシンプルなhttpリクエストで、ここは「Success」と応答します。失敗した場合はGoogleのconnectivitycheck.gstatic.com/generate_204を使います。リダイレクトやほかのページが返ってきたら、サインインページが割り込んでいるということです。Kilobatは、ネットワークがリダイレクト、meta refresh、スクリプトのどれで送ってきても、そのページのアドレスを記録します。チェックするのは、ネットワークに接続したとき、インターネットの確認に失敗したとき、サインインページが表示されている間で、それ以外は5〜15分ごとです。短い間隔で繰り返すことはありません。この2つのアドレス以外には、どこにも何も送りません。

Kilobatは3つのケースを区別します。インターネットがまったくない場合、ネットワークがサインインを求めている場合、ネットワークからログアウトされた場合(サインインしていたのに、同じサインインページが再び表示された場合)です。メニューバーのポップオーバーには、そのための行が1つ表示されます。「このWi-Fiはサインインが必要です」とサインインページを開く、または「Wi-Fiのサインインページでログアウトされました」と再度サインインです。「この場所」カードで場所に名前を付けていれば、その名前が使われ、たとえば「The Long TableのWi-Fiからログアウトされました」となります。ヘッダーは引き続き「ログインが必要」と表示し、Wi-Fiメニューには「ログアウト済み · 再度サインイン」と表示されます。Kilobatが勝手にブラウザを開くことはなく、ネットワーク接続時にmacOSが表示するサインインウインドウにも手を出しません。そのウインドウが表示されないときや、後で必要になったときのための機能です。

サインインページが割り込んでいる間、ヘルスはその1つの原因だけを示します。「Wi-Fiのサインインページでログアウトされました」と「再度サインイン」、または「ネットワークへのログインが必要」と「ログインページを開く」です。DNS、pingのロス、プロバイダのせいにすることはなくなります。イベントログには通信障害ではなくWi-Fiのサインインとして記録されるため、プロバイダ向けのレポートで通信障害として数えられることも、「接続できません」アラートが出ることもありません。フリーズした通話は、Wi-Fiのサインインページでログアウトされた後にフリーズしたと示されます。インターネットへのカクつきテストは、何も応答がなかったとは言わず、サインインページが接続を止めていると示します。「接続できない理由は?」とkilobat whyは、DNSやTLSのエラーを報告する代わりに、Wi-Fiのサインインページが割り込んでいると示します。

Kilobatは、ネットワークごとにサインインがどのくらい続くかも学習します。サインインが始まったとき、チェック結果がサインインページからSuccessに変わったとき、サインインページが再び表示されたときを記録します。通常の時間は、最初から最後まで途切れずに確認できたセッション(2回以上)の中央値です。サインインページ自体が「1 hour of free Wi-Fi」のように時間を1つだけ明示している場合は、1回のセッションで足ります(英語のページのみ)。スリープ、ネットワークからの離脱、再接続で途切れたセッションは数えず、各セッションは最後に成功したチェックで終わるとみなすので、推定は短めになります。履歴はネットワークごとに「この場所」の名前とともにこのMacの~/Library/Application Support/Kilobat/captive-portals.jsonに保存され、どこにも送られません。

Kilobat Proでは、その行が「サインイン済み · 残り約40分」となり、サインインが通常切れる約5分前に「Café Wi-Fiから、あと5分でログアウトされます」(名前を付けた場所なら「The Long TableのWi-Fiから、あと5分でログアウトされます」)という通知が「サインインページを開く」とともに届きます。それでも途中でログアウトされた場合は、「Café Wi-Fiからログアウトされました」がインターネットが切れたわけではないことを知らせ、「再度サインイン」を提示します。警告はサインインごとに1回、この種の通知は20分に1回までです。ネットワークに接続したときはmacOSが独自のウインドウを表示するため、通知しません。オフにするには「設定」›「モニタリング」›「Wi-Fiのサインインが切れる前に警告」を使います。

サインインページの検出、その行、「サインインページを開く」、ヘルスでのログアウトの原因表示は無料です。ヘルスの検出結果の完全な一覧は引き続きProの機能です。サインイン時間は全員の分が記録され、残り時間と警告はKilobat Proの機能です。ターミナルでは、kilobat portalが今すぐチェックし、状態(open、portal、offline)、クエリの値を伏せたサインインページのアドレス、このネットワークのステータス、通常のサインイン時間、各ネットワークの履歴(名前、「この場所」の名前、サインインページのホスト、確認したセッション、通常の時間、最後に確認した日時)を表示します。kilobat portal openはサインインページをブラウザで開きます。エージェントはget_captive_portalで同じJSONを読み取ります。サインインページがまったく表示されない場合は、ホテルのWi-Fiログインページを参照してください。

ここでキャストやプリントはできますか?

ネットワークへの接続から数秒後、および「ヘルス」でもう一度チェックをクリックしたとき、Kilobatはキャストやプリント先を探します。ChromecastとChromecast内蔵テレビ(_googlecast._tcp)、Apple TV、AirPlay対応テレビとスピーカー(_airplay._tcp、_raop._tcp)、プリンタ(_ipp._tcp、_ipps._tcp、_printer._tcp)をBonjourで3秒間検索し、このMac自身のAirPlay Receiverは除外します。応答があると、「ヘルス」の「キャストとプリント」パネルとWi-Fiメニューに「キャストとプリントを利用できる見込み:リビングのテレビ、HP LaserJetを検出」のように表示します。

何も見つからない場合、Kilobatは他のデバイスが応答するかを確認します。Mac周辺の/24内の各プライベートアドレスに空のパケットを1つ、近隣キャッシュ、最大6台の近隣へのpingを各1回、連係の記録を使用します。アドレスにルーターのハードウェアアドレスが応答する場合(プロキシARP)、ネットワークがデバイス間通信を制限している可能性を示します。プロキシARPは通常のルーティングにも使われるため、これは考えられる原因であり、キャストやプリントがブロックされている証拠ではありません。応答のない探索、大きなサブネット、サインインページだけでは分離を断定できません。それ以外は「キャスト先のデバイスが見つかりません」と表示し、応答したものと不確実な点を示します。ホテルやカフェのWi-Fiではサインイン行の横にも判定を表示します。--quickは新たにBonjourを検索してキャッシュを読み取りますが、他のデバイスへの探索やpingは行いません。Bonjourと他のデバイスへのプローブはローカルネットワーク内に留まります。アプリが応答できない場合、単独のCLIは通常のインターネット到達性とサインインページもチェックしてデバイス設定用Wi-Fiを認識します。macOSは初回にローカルネットワークへのアクセスを要求します。

MacがプリンタのWi-Fi Direct(DIRECT-xx-HP …、HP-Setup…、Brotherの…_BRxxxx、Canonの…series)、SonyやCanonのカメラ、GoPro(GPと8桁の数字)、Insta360やRicoh Theta(….OSC)、DJI TelloやSpark、Shelly、Tasmota、Kasa、Tapo、WiZの設定用ネットワークなど、インターネットにつながらないデバイス専用Wi-Fiに接続すると、Kilobatは「プリンタ専用のWi-Fiに接続しています。このネットワークはインターネットに接続しない設計です」のように表示します。ポップオーバーのタイトルは「デバイスのWi-Fi」になり、「接続できません」アラートは表示せず、イベントログには障害ではなく「デバイスのWi-Fi」と記録します。戻るでmacOSに保存されたパスワードを使って前のWi-Fiに再接続します。名前はメーカーのマニュアルに基づきます。一致する名前でもインターネットに到達するネットワークは通常のWi-Fiとして扱います。

MacがAirPlayを使用中(音声出力がAirPlay受信機、またはmacOSのAirPlay送信側がローカルネットワークでストリーミング中)、またはChromiumブラウザの十分なローカル通信からキャストの可能性が示される場合、「ヘルス」はMac側でカクつきの原因になりうる項目を表示します。Macが2.4 GHzを使用中、信号が弱い(−70 dBm以下)、AirDropのスキャン中(AirPlay自体がAirDropのリンクを使用している場合を除く)、別のアプリが2.5 MB/sで転送中または1.25 MB/sでアップロード中の場合です。ボタンで保存済みの5 GHzネットワークに接続したり、キャスト終了または1時間後までAirDropを一時停止したり、Kilobat Proでは通話モードと同様に同期・ダウンロードアプリを一時停止したりできます。Kilobatはフレーム落ちやテレビ自身の信号を確認できず、その旨を表示します。ターミナルではkilobat local check [--quick] [--json]、エージェントはMCPツールcheck_local_networkを使用します。

遠いメッシュノードに接続したまま

Macは信号が約-75 dBmまで下がり、別のアクセスポイントが12 dB以上強くなるまで切り替えません。そのためメッシュシステムでは、部屋のノードを使わず、階下で接続したノードに留まることがあります。「2階のWi-Fiが遅い」典型例です。Kilobatはこれを検出して「ヘルス」に「リビングのノードに-78 dBmで接続中。オフィスのノードは-52 dBmです」と表示します。診断結果の横またはWi-Fiメニューの「再接続」でMacを移動できます。保存済みのパスワードで近いノードに直接接続し、失敗した場合はWi-FiをオフにしてからオンにしてmacOSに最も強いノードを選ばせます。Wi-Fiは数秒間切断されるため、通話中は先に確認します。その後「オフィスのノードに-52 dBmで接続中」のように接続先を表示します。

通知するのは、現在の信号が-65 dBmより弱く、同じネットワークの別のノードがMac対応の帯域で15 dB以上強く、信号とチャンネル幅から推定したリンク速度が1.5倍以上と見込まれる場合だけです。最後の条件により、強い2.4 GHz電波が良好な5 GHz接続の改善にならない場合など、帯域誘導による不要な通知を防ぎます。自分の信号が安定した状態で少なくとも3回の測定にわたり2分間続く必要があるため、家の中の移動や進行中のローミングは対象になりません。Kilobatは通常のバックグラウンドチェックで電波を読み取り、信号が弱い間のみ最大2分に1回ネットワークをスキャンし、通話中はスキャンしません。電波はアドレスによってノードにまとめられ、「ヘルス」›「Wi-Fiノード」でオフィスなどの名前を付けると診断結果に使用されます。通話レポートはそこでフリーズした場合に遠いノードを表示します(Pro)。「設定」›「監視」›「Macが遠いWi-Fiノードに接続し続けているときに通知」をオンにすると、5分後に通知し、最大6時間に1回に制限します。2週間で3回起きると、メッシュシステムのステアリングやローミング設定の確認、またはノードの重複範囲を減らす配置を提案します。

macOSは位置情報へのアクセスを許可されたアプリにのみアクセスポイントのアドレスを表示するため、これが必要です。位置情報はMac内に留まります。Wi-Fi設定の「詳細」で要求されない限り、接続やWi-Fiのオン・オフに管理者パスワードは不要です。ターミナルではkilobat wifi nodesでノードを一覧表示し、kilobat wifi nodes name <id> Officeで名前を付け、kilobat wifi reconnectでMacを移動します(CLI 0.31)。エージェントはget_wifi_nodesを読み取り、reconnect_wifiを呼び出す前に確認します。

ネットワークごとに最速のDNS

自宅で最速のDNSが、カフェでも最速とは限りません。Kilobatはネットワークごとに目立たず調べ、Kilobat Proなら接続時にそのDNSに切り替えます。結果は「ヘルス」›「DNS」に、「ここで最速:Quad9(12 ms、ネットワークのDNSは48 ms)」または「ここではネットワークのDNSが最速です」のように、最新の測定のすべてのリゾルバとともに表示されます。

比較する対象。ルーターやプロバイダが配布するネットワーク自体のDNSを、Cloudflare(1.1.1.1)、Quad9(9.9.9.9)、Google(8.8.8.8)、そして「設定」›「ネットワーク」›「試すリゾルバ」でIPアドレスを指定して追加したリゾルバと比べます。そこで外したリゾルバを、Kilobatが測定したり選んだりすることはありません。各リゾルバには、保存する内容の説明が1行付いています。たとえばGoogleはIPアドレスを最大48時間保存します。速いリゾルバだからといって、プライバシーが守られるわけではありません。

運営元と所在地。各リゾルバには運営元自身のページに基づく運営元と適用される法律の国を表示します。Cloudflare · 米国、Quad9 · スイス、Google · 米国、追加したアドレスではAdGuard · キプロス、OpenDNS(Cisco)· 米国、DNS4EU · チェコです。ネットワーク自身のDNSは「プロバイダのDNS」、Kilobatが知らないアドレスは「運営元不明」と表示し、アドレスから推測しません。

それぞれの安定性。「ヘルス」›「DNS」の最新の実行結果の下に、このネットワークにおける各リゾルバの過去14日間を1日1マスで表示します。名前解決に応答した割合を示し、一部が失敗した日や応答が遅かった日(200 ms超)に印を付けます。同じ静かな測定から得るため、追加の通信はありません。

測定のしかた。ネットワークごとに1日最大3回、4時間以上の間隔を空け、Mac自体の通信が少ないときに、Kilobatは各リゾルバに人気サイト10件を直接2回ずつ問い合わせます。1回目の応答は最近開いていないサイトが待つ時間、2回目はリゾルバ自体の往復時間です。また、存在しえない名前も問い合わせて、それでも応答するリゾルバ(NXDOMAINの書き換え。通常は広告表示のため)を見つけ、CDNから配信される3つのサイトも問い合わせたうえで、各リゾルバが返したアドレスへのTCP接続を、ネットワークのDNSが返したアドレスへの接続と比べて計測します。明らかに遠いCDNノードに誘導するリゾルバには、余分な接続時間の3倍のペナルティを科します。すべての接続が、ハンドシェイク、TLS、最初のリクエストでその時間を支払うためです。名前解決が速くてもブラウジングが遅くなるなら、勝ちにはなりません。1回の測定は、リゾルバごとに約24件の小さなクエリと数回の接続で、数KBです。従量制ネットワークやテザリング中、VPN経由、Wi-Fiのサインインページの手前、低電力モードでは測定しません。今すぐテストで、すぐに1回実行できます。

選ぶタイミング。少なくとも3つの異なる日の最新の測定のそれぞれで、リゾルバの中央値がネットワークのDNSより20 ms以上速く、90パーセンタイルも低かった場合だけです。それまではネットワークのDNSのままです。一度選ばれると、少しでも速いあいだは使い続け、3日間速くなかった場合、または名前解決が失敗した場合はすぐに、ネットワークのDNSに戻ります。20 msで切り替え、0で戻すので、行ったり来たりすることはありません。

切り替え。「ヘルス」›「DNS」でこのネットワークで最速のDNSを使用をオンにするか、「設定」›「ネットワーク」ですべてのネットワークに対してオンにします。Kilobatは蓋を閉じたままMacを動作させるのと同じヘルパーを通じてネットワークサービスのDNSを設定するため、毎回パスワードは不要です。ヘルパーは「ログイン項目」で一度許可します。VPN接続中、構成プロファイルやアプリの暗号化DNSが名前解決を決めている間、Wi-Fiのサインインページが待機中の場合は切り替えません。サインインページにはネットワーク自身のDNSが必要だからです。自分で設定したDNSサーバには触れません。Kilobatが元に戻すのは自身の変更だけで、VPN接続時、ネットワークを離れたとき、Kilobatの終了時、ネットワーク自体は応答しているのに名前解決が2回連続して失敗したときに戻します(そのリゾルバはそのネットワークで1日待機)。「ヘルス」›「DNS」または「設定」›「ネットワーク」›「フォールバックDNS」の失敗した場合に使用でフォールバックを選ぶと、リゾルバが失敗したとき、直ちに、その時点で応答する場合だけ切り替えます。フォールバックも失敗するとネットワーク自身のDNSに戻るため、Macが動作するDNSを失ったままになることはありません。各切り替えは履歴に記録され、Wi-Fiメニューに「DNS:Cloudflare(ここで最速)」と元に戻すが表示されます。これでネットワークのDNSに戻し、そのネットワークの自動切り替えをオフにします。

測定と結果の表示は無料で、自動切り替えはKilobat Proの機能です。ターミナルではkilobat dns fastestでこのネットワークの結果を表示し(すべてのネットワークは--all、スクリプトは--json)、kilobat dns auto on|off [--network <name>]で切り替えをオンまたはオフ、kilobat dns exclude|include <resolver>でリゾルバを除外または追加、kilobat dns fallback <resolver>|offでフォールバックを設定します。出力には各リゾルバの運営元と所在地、過去14日間の応答した名前解決を表示します。エージェントはget_fastest_dnsで読み取り、set_fastest_dnsとset_dns_fallbackは先に確認します。