多くのオペレーティングシステムには、インターネット接続を検出するための機能がある。Windowsでも、コントロールパネルなどでインターネット接続があるかどうかを表示できる(写真01)。
Windowsのインターネット接続検出機能は、NCSI(Network Connection Status Indicator)と呼ばれる。タスクバーのネットワークアイコンで、インターネット接続がないことを「地球儀と禁止標識(丸に斜線)」のアイコン(写真02)で表示するのは、この機能を利用している。
インターネット接続の有無を検出することは、意外に面倒だ。まず、ネットワークデバイスが正常に動作しており、適切なIPアドレスが割り当てられ、一番手前にあるゲートウェイ(ルーター)に接続できる必要がある。そのほか、DNSで名前解決ができるかどうか、インターネット内で確実に動作しているサーバーに接続できるかどうかを調べなければならない。
Windowsでは、何をもってインターネット接続があるのかを判断しているのかというと、Windows 11はHTTPで、特定のWebサイトからテキストファイルが正しく入手できるかを調べている。過去には、専用のDNSサーバーを使ってアドレス解決ができるかどうかを調べることもあったが、現在では、HTTPのみでインターネット接続の有無を判定している。
具体的には、http://www.msftconnecttest.com/connecttest.txt (IPv4の場合)をアクセスして、テキストファイルを取得する。その中身が“Microsoft Connect Test”であるかどうかをテストしている。NCSIでは、このHTTPによるインターネット接続の検出をアクティブ・プローブと呼ぶ。NCSIは、ネットワーク接続を管理する「ネットワークリストマネージャー(netlistmgr)」サービス内で動作している。
アクティブプローブが成功したあと、通過パケットを定期的に検査して、インターネット接続が継続しているかどうかをチェックする(これをパッシブ・プローブと呼ぶ)。また、ネットワークリストマネージャーは、API(たとえばINetworkListManager::GetConnectivity)でも、インターネット接続の状態を提供する。
こうしたインターネット接続のチェックは、ネットワーク・インターフェースやTCP/IPスタック、プロキシー、LANやルーター、ファイアウォール、インターネット接続プロバイダ、DNSといったネットワークの下回りや通信経路にすべて問題がない場合のみに成功する。それぞれのコンポーネントでも個別のチェックはある。このインターネット接続の検出はネットワークの総合試験でもある。
Androidや他のOSでもHTTPを使うところは同じ。ただし、何をもって正しくアクセスできたのか、という判定は異なるようだ。たとえば、AndroidやChromebookでは、http://connectivitycheck.gstatic.com/generate_204 を、アクセスしてレスポンスが204 No Contentとなるかどうかを判定している。これについては、Network Portal Detectionに記述がある。
HTTPによるインターネット接続の検出は、公衆無線LANサービスなどで使われる「キャプティブ・ポータル」の検出にも使われる。キャプティブ・ポータルとは、インターネット接続前にユーザー登録や利用許諾条件の確認などに使われるものだ。この場合、HTTPでインターネット接続チェックを行うと、正しくHTTPは動作するものの、期待していた結果が得られない。NCSIの場合では、HTTPは成功しても正しい文字列を得ることができない。
ただし、キャプティブポータルの実装にはいくつかの方式がある。HTTPの302 Redirectが返される場合もあれば、511 Network Authentication Requiredのときもある。あるいはICMP リダイレクト(レイヤー3、IPレベルでのリダイレクト)を使う、DNSサーバーへのリクエストを横取りして、キャプティブポータルのHTTPサーバーアドレスを返す、といった方式がある。
Windowsの場合、正しい文字列が得られない場合には、キャプティブ・ポータルが動作していると判断し、Webブラウザを起動する。
なお、NCSIのHTTPサーバーは、かつてはAzureでホストしていたが、現在ではAkami Technologies社のCDN(Content Delivery Network)に移行している。世界中でWindowsが起動するときにアクセスするので、コマンドでちょっとぐらいアクセスしても大丈夫だろう(そうでなければ、却って問題)。いちいち、ネットワーク接続フライアウトやコントロールパネルを開かなくても、コマンドラインからcurl.exeやInvoke-WebRequestなどを使って、簡単にインターネット接続をテストできる。
curl.exe http://www.msftconnecttest.com/connecttest.txt
Invoke-WebRequest "http://ipv6.msftconnecttest.com/connecttest.txt"
として、“Microsoft Connect Test”が返れば、インターネット接続は問題ない。
今回のタイトルネタは、NCSIからの連想で米国TVドラマ「NCIS ~ネイビー犯罪捜査班」である。2003年から続く軍隊物と犯罪捜査物を合わせたドラマ。1995年から続いた「犯罪捜査官ネイビーファイル(JAG)」のスピンオフとして始まったが、こちらの方が長寿番組となった。