2012年09月21日

Android のプッシュ通知用コネクションに関するメモ(補記)

はてなブックマークに登録

前回の記事では、Android のプッシュ通知機構 (GCM) が 「Google 所管のサーバと Android 端末との間の持続接続」 をどのように使用しているかを調べてみました。
DSAS 開発者の部屋 : 「Android のプッシュ通知用コネクションに関するメモ」
この記事の文中に、上記の持続接続が「プッシュ通知以外の用途にも利用されている様子でありそちらもおって調査したい」 と注釈を添えています。今回はその内容と関連する話題を控えます。

まとめ

端末と mtalk.google.com:5228 との間の接続はプッシュ通知以外に次の用途で使用される

  • Android 版 Google Talk クライアントのメッセージ送受信 (ボイスチャットを除く)
  • Google Play アプリのウェブページから端末へのプッシュインストール指示

- 他にもあるかも?
- 非公開の内部仕様につき今後変更される可能性も

Google Talk について

  • Android 版 Google Talk クライアントは、com.google.process.gapps (GoogleServicesFramework) プロセスの管理する 「mtalk.google.com:5228」 とのコネクションを使用する。このコネクションを使用できない場合はエラーとなり、独自に代替ポートが使用されることはない

  • ちなみに PC 版 Google Talk クライアント (googletalk.exe) はメッセージ送受信に 「talk.google.com:5222」 とのコネクションを使用する。5222 番ポートを使用できない場合は代わりに 「talk.google.com:443」 を使用する

  • 「mtalk.google.com」 には 「mobile-gtalk.l.google.com」 という別名がある。ネーミングから想像すると、このホストとのコネクションは本来モバイル端末において Google Talk からの利用を主目的とするものであり、プッシュ通知機構からの利用はあるいはむしろ副次的・応用的なものだったのかも?
    $ dig mtalk.google.com
    
    ; <<>> DiG 9.2.1 <<>> mtalk.google.com
                             :
    ;; ANSWER SECTION:
    mtalk.google.com.       81547   IN      CNAME   mobile-gtalk.l.google.com.
    mobile-gtalk.l.google.com. 291  IN      A       74.125.31.188
                             :
    

Google Play ページからのプッシュインストールについて

    

  • Google Play アプリケーションページからのインストール指示は mtalk.google.com:5228 コネクション経由で端末へ送出されパッケージマネージャへ渡される

  • このプッシュインストールは感覚的には GCM によるプッシュ通知とあまり変わらないが、GCM の端末要件が Android 2.2 以上であるのに対し、Play ストアページからのプッシュインストールは 2.2 未満のバージョンでも機能するという違いがある

  • Android 1.6 環境を確認したところ、システムブート後に mtalk.google.com:5228 コネクションが自動的に確立する点は共通しているが、違いとして目に付くところでは 2.2 以降での com.google.process.gapps プロセスの実体である "/system/app/GoogleServicesFramework.apk" が存在しない。中核となる持続接続のハンドリング自体は旧バージョンにおいても実装されているわけで、C2DM, GCM の要件が 2.2 以上とされた背景にはおそらくはモジュール設計上の複合的な要因があるものと察せられる

mtalk.google.com:5228 に接続できない場合は?

端末上の com.google.process.gapps プロセスが 「mtalk.google.com:5228」 へコネクションを確立できない場合の所作を確認した

  • 実験環境のルータの設定で、「mtalk.google.com」 の既知の分散先サーバである 「173.194.72.188」 「74.125.31.188」 の 5228 番ポートへの LAN 上の各ノードからのアクセスを遮断。この状態で Android 端末を起動し観察を行った

  • 端末から mtalk.google.com:5228 へ接続不可につき connect タイムアウトまでステートは SYN_SENT のまま変化せず。タイムアウト後は何度かリトライが発生。対象は常に 5228 番ポート
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 10.10.0.10:43695        173.194.35.15:80        TIME_WAIT   -
    tcp        0      0 ::ffff:10.10.0.10:38835 ::ffff:74.125.235.130:443 ESTABLISHED 776/com.android.ven
    tcp        0      0 ::ffff:10.10.0.10:46503 ::ffff:74.125.235.185:80 ESTABLISHED 881/berserker.andro
    tcp        0      1 ::ffff:10.10.0.10:34224 ::ffff:173.194.72.188:5228 SYN_SENT    256/com.google.proc
                            :
    
                       (時間の経過・・・)
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 10.10.0.10:43695        173.194.35.15:80        TIME_WAIT   -
    tcp        0      0 ::ffff:10.10.0.10:38835 ::ffff:74.125.235.130:443 ESTABLISHED 776/com.android.ven
    tcp        0      0 ::ffff:10.10.0.10:46503 ::ffff:74.125.235.185:80 ESTABLISHED 881/berserker.andro
                            :
    
                       (時間の経過・・・)
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 10.10.0.10:43695        173.194.35.15:80        TIME_WAIT   -
    tcp        0      0 ::ffff:10.10.0.10:38835 ::ffff:74.125.235.130:443 ESTABLISHED 776/com.android.ven
    tcp        0      0 ::ffff:10.10.0.10:46503 ::ffff:74.125.235.185:80 ESTABLISHED 881/berserker.andro
    tcp        0      1 ::ffff:10.10.0.10:32648 ::ffff:173.194.72.188:5228 SYN_SENT    256/com.google.proc
                            :
    

  • 開発者向けの公式ページ に以下の記述が見られるためリトライ時に 5229 or 5230 番ポートが対象となることに期待したが今回の手順による観察ではその所作は見られなかった
     Note: If your organization has a firewall that restricts the traffic
     to or from the Internet, you'll need to configure it to allow
     connectivity with GCM. The ports to open are: 5228, 5229, and 5230. 
     GCM typically only uses 5228, but it sometimes uses 5229 and 5230.

  • 以上の結果から Android 端末の参加するネットワークでは必ず外向きの 5228 ポートへのアクセスを許可しなければならないことがわかる

  • この調査の過程で、「mtalk.google.com」 の分散先として、前出の 2 サーバに加え 「173.194.79.188」 の存在を確認した (2012 年 8 月末時点)

付録:端末上で拾ってみたパケットの様子

Google Talk     

プッシュインストール     


(tanabe)
klab_gijutsu2 at 13:36│Comments(3)TrackBack(0)Android | win

トラックバックURL

この記事へのコメント

1. Posted by yae   2013年07月11日 11:29
質問する場所ではないのかもですが、もしよろしければ教えてください。

実は間違って何かを消した(?)模様で、ある日からGoogle Play アプリのウェブページから端末へのプッシュインストールができなくなり、一部のアプリからのプッシュ通知も届かなくなったのです。

そこで、それを解決しようとウェブ上を徘徊しているところこのページにたどり着きました。

何か解決策等お分かりになれば是非教えて頂けないでしょうか?
2. Posted by tanabe   2013年07月11日 12:05
こんにちは。残念ですが状況が判然としない上にこの方面の仕様が公開されていないこともあり助言はできかねます。 # ご承知の通り一般論としてはこうした場合の最終手段は端末の初期化ですね

3. Posted by yae   2013年07月13日 14:20
5 こんにちは。
早速ご丁寧な返信をありがとうございます。

そうですよね。
やっぱり初期化ですよね。。

考えてみます。
ありがとうございました。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント