Xamarin パケットモニターで見た、Build Hostとの通信
1.Build Host
Xamarin.VisualStudioでは、iOSのバイナリを作成するために、Mac(Xcode)が必須となりますが、この時、WindowsとMacの間の連携に使用されるのが「Build Host」です。しかし、色々な事情で、この「BuildHost」との通信が、途絶えてしまうことが(よく)あります。

よく出てくるこの画面です・・・
再起動したり、バージョンを変更したりしているうちに、いつの間に繋がる・・・という印象で、私としては、上手く繋がらないときの対処方法が、今ひとつハッキリしていませんでした。
そこで、今回は、トラブル対処時の情報の一つとなるように、WindowsとMac間の通信をパケットモニターで確認してみることにしました。
なお、本記事は、私が個人的に勝手に解釈したものであり、間違いを含んでいる可能性は十分にありますことを、予めご了承ください。
なお、パケットモニターには、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ウエイハンドシェークで始まっているのを確認できます。
表面的には、図の状態で「Connect」ボタンを押したときです。
そして、Buid Hostを止める(Unpairをクリックする)と、MacからのFINパケットで、この通信は終了しています。
これも、表面的には、図の状態で「Unpair」ボタンを押したときです。
下記は、同通信のTCPストリームを表示したもので、赤色が、Windowsからのもので青色がMacからのものです。
赤枠で囲んだ部分が、VisualStudioで最初にPINを入れるまで(リンク確率前)のものです。
PIN入力の完了後(リンク中)は、定期的にWindows側からKEEPALIVEが送られています。
4.データ通信
先の制御通信のMac側からの最初のレスポンスにある、「MTBSERVERPORTS:数字;数字」が、データ通信の際のMac側の待ち受けポート番号となります。
このポート番号は、制御通信ごとに変化(インクリメント)しています。
(いったん制御が切れると、次の制御開始時にポート番号は、変わっています)
事後、このポート番号を頼りに、データ通信のフィルタをすることになります。
(数値は、まずは最初のものが使用されているようで、2つ目のものが使用されている状況は、今のところ確認できていません。)
//ポート番号が49353の場合のフィルタの例 tcp.port==49353
データ通信は、HTTPプロトコルでWindowsからリクエストされ、Macからは、XML形式でレスポンスされます。
以下は、いくつかのデータ通信をTCPストリームで表示したものです。
・WindowsでPINを入力した時
Code="OK"でログインに成功している
・PINの整合がとれリンクが確立した後の最初の通信(情報取得?)
・シュミレータの一覧を取得している?
5.トラブル時の状態
(1) BuidlHostが息をしていない場合
なんらかの理由で、BuildHostが正常に動作していない場合、Windowsからのハンドシェークが失敗して、制御通信が始まらないことになります。図では、Windowsから5000番に対するSYNパケットに対して、MacがRSTを返しているのが確認できます。
(2) PINを間違えている場合
Code="Error"になっています。
(3) Bonjour Serviceが息をしていない
Xamarin.VisualStudioとBuild Hostとの間には、Bonjour Serviceというサービスが、介在しています。擬似的に、このサービスを止めてみると・・・

5000番への通信は、一切行われなくなります。
