[IT] UPnP ネットワーキング/
SSDPとGENAについて
私の自宅環境で普段外部接続は Let’s Note 内臓 WiMAX アンテナからなんだけど、自宅サーバセグメントとのお話が必要なときは、WiMAX オフにして WiFi 経由にします。その際に、Windows ネットワーク クライアントとして使用可能なリソースを探索するためにクライアント側から「ProviderMicrosoft.Networking.SSDP」が発行されます。
ふと懐かしく久々に SSDP と GENA を思い出したので最近はどのように実装されているのかをメモとして公開します。
—
MSDN で探すと、ディスバリ コンスタント機能のカテゴリ定義されている内容がありました。
→ http://msdn.microsoft.com/en-us/library/aa363910(VS.85).aspx
→ http://msdn.microsoft.com/en-us/library/aa363906(v=VS.85).aspx
英語で読むと、何となく UPnP 通信メカニズムを覚えていたので更に MSDN (今度は日本語)を探してみました。
■ユニバーサル プラグ アンド プレイ (UPnP) クライアント サポート
—
うろ覚えですが、10年前にJWNTUG (じゃんたぐ / Japan Windows NT Users Group) というグループメンバだったときに、まだ ADFS が実装されていない技術背景があり、認証連携を大型組織内で実現するには、winlogon.exe のGINA(ぎなー)を横取りするような特権命令で実装しなければならないという、熱いトークをメンバで交わしたことがあります。なんて言いますか、GINAにラッパーを被せるといいますか・・・。その頃にとても紛らわしいにたような単語がありました。それが、GENA(げなー)です。
UPnP は、Windows Me あたりから Upnp.dll が標準提供されだしデバイスサービス情報をネットワーク(ブロードキャストが飛ぶ範囲内でマルチキャストするので)探索できるようになりました。それまでは、涙ぐましい努力を強いられてきました。
UPnP は、Simple Service Discovery Protocol (SSDP)をセグメント内に通知することで見つけてもらう事が出来るようになったのは画期的だったと思います。SSDP はデバイス情報を XML へ記述してネットワークへ流すので、XML仕様にさえ合っていれば適当なデバイス名称を通知することも出来ました。現在はデバイス状態変数を取得するには(適当というには適切ではなく、いい加減のほう) XML文章の 書き出しなので、SOAP で応答することも当然の派生になりました。
またデバイスの何らかのイベント状態を通知するには GENA も通知プロトコルとして使用されています。応答通知を GENA にした場合はそのまま GENA で返します。
ソケットで見た場合には、ssdpsrv.dll が、UPnPデバイス管理アプリの ssdpapi.dll と双方向でお話しをして、管理アプリからは upnp.dll を通じて片方向で msxml.dll (XMLパーサー)と wininet.dll インタフェイスへ返ってきて、再び ssdpsrv.dll と双方向でお話しをするという、デバイス検出、デバイス状態管理を行うという一連の構成となっています。
DDK (デバドラ開発キット)を使って、ドライバー開発を強いられていた時代は苦労の割にあまり報われなかった領域が、Upnp.dll 標準提供により途端に注目されだしたのは痛快だったなと懐かしく思い出します。
ちなみに、SSDPから検出実績があるデバイスを再度検出する際には HEX 8桁 – HEX 4桁 – HEX 4桁 – HEX 4桁 – HEX12桁の UUIDを付与して呼び出します。
uuid:hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
↓
つまり、\ProviderMicrosoft.Networking.SSDP//uuid:hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh という呼び出し方法です。
最初にダブル・エンマークを付与していることからも Windows ネットワークプロトコル上のものですね。
昔 Windows プロトコルはセキュリティ懸念の温床だと酷い言われ方を散々されましたが、コンシューマ側にとってみると、便利なプロトコルをスタックできる素敵なプロトコル原点だったかも知れません。
世の中が便利になっていくためには、ユーザにその存在を意識させずに透過的に安全かつ安定して使えるようになってこそ、意義があるように思います。
そんなことをボンヤリ思いながら・・・。
以上