2008/02/12

再度ActiveSync

懲りずに ActiveSync の話。

会社で ActiveSync が通らなかったのは、単純に Packet Filtering のせいでした。会社のPCには、最初から AntiVirus ソフトウェアがインストールされているのですが(しかも、管理者しか設定変更ができない)、いつの頃からか、そいつが Pakcet Filteringもするようになっていたのに気がつかなかった、という間抜けなオチでした。情けなさすぎる...。

iPAQ112(というか、Windows Mobile 5.0/6なのだと思いますが、一応、以後iPAQとしておきます)、[スタート]->[設定]->[接続]->[PCへのUSB接続]で選べる「高度なネットワーク機能を有効にする」をチェックすると、USBを物理層としたTCP/IPネットワークでActiveSyncコネクションを実行しようとします。これは、無線LANやBluetoothによる同期処理を同一のSchemeで実現しようとした、非常に全うな考え方に基づく結果なのだと思います(その割には、無線LANのActiveSyncは廃止されましたが...)。

この状態でPCとUSBケーブルで接続すると、例えばWindowsXPの場合、「デバイスマネージャ」の「ネットワーク アダプタ」に「Windows Mobile-based Device」という端点が作られます。


「ネットワーク接続」で見ると、これに呼応して「ローカル エリア接続 7」などが作られます(普通は2とかでしょうね...)。このプロパティを選んでみると、使用インターフェイスへ、先ほどの「Windows Mobile-based Device#6」などが使われていることを確認できます。


この端点のPacket Filtering を適切に設定してあげないと、「高度なネットワーク機能を有効にする」状態では、ActiveSync が上手く通りません。

「高度なネットワーク機能を有効にする」状態で、iPAQ側ActiveSyncプログラムの[メニュー]->[接続...]から「クレイドルにドッキングしたとき」の「次の接続方法ですべてのPCを同期する」を確認すると、そこで表示されるリストのデフォルトは「USB」になっていると思います。

一方「高度なネットワーク機能を有効にする」を無効にした上で、PCとUSBケーブルで接続すると、PCからは、USBデバイスとして認識されることになります。


iPAQ側のActiveSync手順も少し変わり、一瞬「接続中」というタイトルのモーダルダイアログなどが表示され「ユーザ認証」などの手続きを行う姿を見ることが出来ます。

この時iPAQ側ActiveSyncプログラムの[メニュー]->[接続...]から「クレイドルにドッキングしたとき」の「次の接続方法ですべてのPCを同期する」で表示されるリストのデフォルトは「`USB Default」です(分かりにくいなぁ...)。

ちなみに一旦「`USB Default」をリストに表示させると、以後、「高度なネットワーク機能を有効にする」状態でも、「クレイドルにドッキングしたとき」で「`USB Default」を選択することが可能になります。が、接続はTCP/IPを通じて行われますので、USB接続で、この設定が変更できる意味は、いまひとつ分かっていません...。

「高度なネットワーク機能を有効にする」を無効化した状態でも、IEを使ってActiveSyncのDTPT機能を経由して外部サイトへアクセスできました。もしTCP/IP on USBのActiveSyncが安定せず、ただUSBを使って同期をしたいだけであれば「高度なネットワーク機能を有効にする」は無効にしておく」というの、ひとまず分かりやすい方法なのかも知れませんね。ちなみに会社のPCに入っているAntiVirusソフトのPacket Filteringに負けた私は、この設定です...。

さて、TCP/IPを使って ActiveSyncを行うときに、PC側接続端点(「ローカル エリア接続 7」など)でPacket Filtering を解放しておくポートは、マイクロソフトのサイトを始め、各サイトでいろいろとまとめてくださっている通りです。
ちなみに前者には、「5679ポート」もTCPと書いてありますが、私がパケットを調べた限りでは、このポートの使用は確認できませんでした。恐らく後者の「UCPの5679ポート」が正しそうです。

ここで、幾つかポートをFilteringして遊んでみました。

まず、PC側端点のIPアドレスですが、ここは「IPアドレスを自動的に取得する」設定にしておく必要があります。私の環境では、PC側へ割り振られるアドレスは169.254.2.2で、iPAQ側が169.254.2.1でした。このアドレスは、IPv4の LinkLocal アドレスブロック内の値ですが、APIPAでアドレス決定が行われるのではなく、DHCPで明示的に割り振られています(ちなみにDHCPサーバはiPAQ側です。すげー仕様だ...)。PC側のインターフェイスへ169.254.2.3などのアドレスを明示的に設定して実験しましたが、iPAQとの接続は確立できませんでしたので、DHCP割り当てアドレス値とActiveSyncが連動しているか、単純な固定値なのかも知れません。2台以上のWindows Mobile端末をつなげてみたいところです。

さて、990/tcpをFilteringしている場合、PC側ActiveSyncでは、「接続中」というメッセージが表示され続け、暫く後「接続されていません」へと変化します。しかし「接続中」はもちろん、「接続されていません」が表示されたその後も、PC側からiPAQの5679/udpへ、1秒ごとにパケットが送出され続けています。また、iPAQ側は、それに対しICMP port unreachbleを丁寧に返し続けています。相当時間観察しましたが、このやり取りが終了することはありませんでした。もしUSB給電しない状態にしてあったら、iPAQ側の電池は尽きていたでしょうね...。

990/tcpのfilteringを解除すると、PC上のActiveSyncのメッセージは少し変化し「変更箇所を探しています」になります。が、実際には接続が確立できず、最終的には接続エラーです。この間、iPAQからPCの999/tcp、5678/tcp、5721/tcp、26675/tcpへSYNが飛びまくっていました。以後、これらのポートの filtering を順番に開けたり閉めたりして観察しましたが、結局すべてのポートを開けずには、接続を確立させることが出来ませんでした。

ここで面白いのは、990/tcp の filtering を解除しておくと、iPAQは 5679/udp のICMP port unreachbleを返さないことです。PCから iPAQ の 5679/udpへパケットが送出された瞬間、iPAQはPCの990/tcpと接続確立を行おうとします。これが確立できると、iPAQは、先ほどの udp パケットを無視してしまうようです。またPC側も、以後5679/udpへのパケット送出を行いません。これがマイクロソフト資料で、「5679(ハンドシェイクおよび Legacy Replication)」と書いてあるの所以なのかもしれません。

さて、無事に接続を確立できるようにポートのfilteringを適切に設定すると、PCとiPAQの間で実際のデータのやり取りが開始されることになります。

990/tcpでは40秒間隔でpacketのやり取りが行われます。この間PC上のActiveSyncのステータスは変化せず、特に同期が行われている感じは伝わってきません。実際、コネクションの確認だけ行っている
ように見えます。

26675/tcpでは240秒間隔で packet のやり取りが行われます。このやり取りが行われている間、PC上のActiveSyncは「同期中」の表示になります。データのやり取りが終わると、この表示は「接続完了」
となりますが、実際にはTCPのコネクションは張られたままです。このコネクションは、最後のACKが確認されてからのち、60秒後に切断されることになります。後、240秒後に再度TCPセッションの確立から開始されます。

上記で分かるように、ActiveSyncでは結構頻繁にやり取りをしているようですので、USBを接続しっぱなしにしておく場合には、USB給電を有効化するのがお薦めな様です。

さてさて、ここまでは、すべてActiveSyncの理想的な環境での接続の説明でしたが、実際には上記の調査中、幾つか不可解な現象に出会いました。

一つは、「iPAQ側のAstiveSyncが刺さる」というものです。iPAQの[設定]から[実行中のプログラム]タブを選ぶと、「実行中のプログラム一覧」には、ActiveSyncが表示され、ActiveSync が動作しているように見えます。しかし、iPAQはPCの990/tcpへ接続を張りに行こうとしません。結果、PCはiPAQの679/udpへパケットを投げ、iPAQはICMP port unreachable を返す、という990/tcpをfiltering したときと同じ挙動になってしまいます。大抵この場合、[実行中のプログラム]タブから ActiveSync を終了させようとすると「このプログラムはビジー状態にあるか、ユーザーからの応答を待っている」となっている場合がほとんどで、例えプログラムを殺しても安定せず、結局 iPAQ の再起動をすることになる、という感じでした。

もう一つは、更に不可解であり、且つ対処に困ってしまう問題で、「iPAQ側が勝手にUSB接続を瞬断する」というものでした。この場合、瞬間的にネットワークインターフェイスが途切れるようで、packet captureプログラム的には、interface lost という形で現れました。こうなるとPC側のActiveSync は「接続されていません」状態になってしまい、またiPAQ側のActiveSyncから「同期」を選んでも同期が開始されません。今のところ、この問題の解決手段は「物理的にUSBケーブルを抜き、再接続する」という、なんとも情けないものしか見つかっていません。ちなみにこの現象は「高度なネットワーク機能を有効にする」を無効化していても発生しましたので、iPAQ 側のUSBドライバに何か原因があるのかもしれません。これは何とか解法を見つけたいものです。

ちなみにDTPTによるネットワーク接続はExchangeサーバとの直接データ交換を実現することが主目的の様です。私はExchengeサーバと直接繋げる環境はもっていませんが、この状況の packet を眺めるのも面白いのかも知れません。

なかなかActiveSyncの森は、奥が深いですね...。

0 件のコメント:

コメントを投稿