SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin パケットモニターで見た、Build Hostとの通信

【 Xamarin 記事一覧 】

1.Build Host

Xamarin.VisualStudioでは、iOSのバイナリを作成するために、MacXcode)が必須となりますが、この時、WindowsMacの間の連携に使用されるのが「Build Host」です。
しかし、色々な事情で、この「BuildHost」との通信が、途絶えてしまうことが(よく)あります。
f:id:furuya02:20150512045740p:plain:w300
よく出てくるこの画面です・・・
再起動したり、バージョンを変更したりしているうちに、いつの間に繋がる・・・という印象で、私としては、上手く繋がらないときの対処方法が、今ひとつハッキリしていませんでした。
そこで、今回は、トラブル対処時の情報の一つとなるように、WindowsMac間の通信をパケットモニターで確認してみることにしました。

なお、本記事は、私が個人的に勝手に解釈したものであり、間違いを含んでいる可能性は十分にありますことを、予めご了承ください。

なお、パケットモニターには、Wiresharkを利用させて頂きました。
https://www.wireshark.org/

2.通信の種類

Build Hostとの通信には、大きく2種類があります。
一つは、「制御通信」で、もう一つは、「データ通信」です。
(この呼び方は、私が勝手に命名してしまってます)

「制御通信」は、リンクが開始してから終了するまで、ずっと繋がりっぱなしで、「データ通信」は、必要な情報を、Windows側からリクエストする毎に使用されています。


3.制御通信

Build Hostは、最初の接続口として、TCPの5000番ポートで待ち受けており、Pair開始からUnpairで終了するまで、ずっと繋がっています。

Wiresharkでは。ポート番号を頼りにして、次のようにフィルタすると簡単に確認できます。

tcp.port==5000

最悪、他にも5000番の通信がある場合、sourceとdestinationと加えて、こんな感じにすると見えてくると思います。

//Windowsが192.168.0.103、Macが192.168.0.102で動作している場合
tcp.port==5000 && (ip.addr==192.168.0.103 || ip.addr==192.168.0.102)

制御通信は、Windows側から、Macの5000番に対するTCPの3ウエイハンドシェークで始まっているのを確認できます。
f:id:furuya02:20150512053059p:plain
表面的には、図の状態で「Connect」ボタンを押したときです。
f:id:furuya02:20150512091920p:plain

そして、Buid Hostを止める(Unpairをクリックする)と、MacからのFINパケットで、この通信は終了しています。
f:id:furuya02:20150512054054p:plain
これも、表面的には、図の状態で「Unpair」ボタンを押したときです。
f:id:furuya02:20150512092920p:plain


下記は、同通信のTCPストリームを表示したもので、赤色が、Windowsからのもので青色がMacからのものです。f:id:furuya02:20150512052601p:plain

赤枠で囲んだ部分が、VisualStudioで最初にPINを入れるまで(リンク確率前)のものです。
PIN入力の完了後(リンク中)は、定期的にWindows側からKEEPALIVEが送られています。

f:id:furuya02:20150512053452p:plain

4.データ通信

先の制御通信のMac側からの最初のレスポンスにある、「MTBSERVERPORTS:数字;数字」が、データ通信の際のMac側の待ち受けポート番号となります。
f:id:furuya02:20150512055423p:plain
このポート番号は、制御通信ごとに変化(インクリメント)しています。
(いったん制御が切れると、次の制御開始時にポート番号は、変わっています)

事後、このポート番号を頼りに、データ通信のフィルタをすることになります。
(数値は、まずは最初のものが使用されているようで、2つ目のものが使用されている状況は、今のところ確認できていません。)

//ポート番号が49353の場合のフィルタの例
tcp.port==49353

データ通信は、HTTPプロトコルWindowsからリクエストされ、Macからは、XML形式でレスポンスされます。

以下は、いくつかのデータ通信をTCPストリームで表示したものです。

WindowsでPINを入力した時
Code="OK"でログインに成功している
f:id:furuya02:20150512064947p:plain
・PINの整合がとれリンクが確立した後の最初の通信(情報取得?)
f:id:furuya02:20150512055733p:plain
・シュミレータの一覧を取得している?
f:id:furuya02:20150512055738p:plain


5.トラブル時の状態

(1) BuidlHostが息をしていない場合

なんらかの理由で、BuildHostが正常に動作していない場合、Windowsからのハンドシェークが失敗して、制御通信が始まらないことになります。

図では、Windowsから5000番に対するSYNパケットに対して、MacがRSTを返しているのが確認できます。

f:id:furuya02:20150512054615p:plain

(2) PINを間違えている場合

Code="Error"になっています。
f:id:furuya02:20150512064955p:plain

(3) Bonjour Serviceが息をしていない

Xamarin.VisualStudioとBuild Hostとの間には、Bonjour Serviceというサービスが、介在しています。
擬似的に、このサービスを止めてみると・・・
f:id:furuya02:20150512094623p:plain
5000番への通信は、一切行われなくなります。
f:id:furuya02:20150512094630p:plain



【 Xamarin 記事一覧 】