Peering

Peering / ブログ

iPhoneがどこからでもMacに届く仕組み

Macはルーターの内側にあり、iPhoneはモバイル回線にいます。どちらからも相手に発信できません。2台が話せるようになるまでの流れを、起きる順に説明します。

同じネットワークの場合:Bonjourと1つのポート

MacアプリはTCPポート51515で待ち受け、Bonjourで_remotedesktop._tcpとして自分の存在を知らせます。 これには3つの小さな情報が付いています。デバイスID、Macの名前、プロトコルのバージョンです。 iPhoneはこのサービスを探すので、同じWi-FiにいるMacは、アドレスを入力しなくても「近くのMac」に表示されます。

この通知はあくまでヒントです。ネットワーク上の誰でも何でも通知できるため、セキュリティに関わることはここからは何も決めません。 重要なのは、そのあとに起きることです。iPhoneがTLS 1.3の接続を開き、双方が証明書を提示して、 それぞれ相手の公開鍵を、ペアリングのときに保存した鍵と照合します。 ペアリングの仕組みは別の記事で説明しています。

自宅のネットワークでは、iPhoneは2つの接続を開きます。1つは制御用(入力、設定、ウィンドウの一覧)、もう1つは映像だけを運ぶ接続です。 映像を制御用のストリームに載せないので、大きなキーフレームのせいでマウスのクリックが後ろで待たされることはありません。

iPhone版Peeringの接続画面。近くのMac、離れた場所のMacとペアリングする方法、信頼済みのMacが表示されています。
近くのMacはBonjourで見つかります。信頼済みのMacは、すでにペアリングしたものです。

ネットワークの外の場合:紹介だけをするリレー

外出すると、iPhoneからルーターの内側にあるプライベートアドレスには届かず、ルーターも誰も頼んでいない接続は受け付けません。 そこでMacのほうが先に、早めに動きます。起動している間、MacはPeeringのリレーへの外向きのWebSocketを1本開いたままにして、 25秒ごとに小さなpingを送ります。この開いたソケットがMacの在席表示で、リレーはこれでMacが存在し、起きていることを知ります。

iPhoneでMacをタップすると、次の順で進みます。

  1. iPhoneがリレーに、MacのデバイスIDへの接続を依頼します。
  2. リレーは両側に、アドレスと、制御用と映像用の16バイトのランダムなトークン2つを返します。
  3. 両方のデバイスがリレーへ外向きのTCP接続を開き、最初に自分のトークンを書き込みます。
  4. リレーは2つのトークンを照合して2本のソケットをつなぎ、一方からもう一方へバイト列をそのままコピーします。

そのあと、iPhoneは自宅のネットワークで使うのと同じTLSハンドシェイクを始め、それはリレーを通ってそのままMacに届きます。 リレーは単なる管道で、会話の当事者ではありません。鍵は一切持ちません。リレーに分かることと分からないことの詳細は、 リレーに見えるものをご覧ください。

映像は近道を通る

すべてをリレー経由にしても動きますが、それは最も遅く、最も費用のかかる経路です。そこで映像はTCP接続にとどまらず、 映像に向いているUDPに移ります。遅れて届いたフレームには価値がなく、再送すると次のフレームがさらに遅れるだけだからです。

両端はリレーにもう1つ質問をします。相手はどのアドレスから接続しているのか、というものです。リレーは観測したアドレスを答え、 両方のデバイスは封をした小さなプローブパケットを250ミリ秒ごとに互いへ送り始めます。プローブを送るたびに、送信側のルーターに穴が開き、 2つの穴が重なると、プローブが通り抜けて認証されます。その瞬間から、映像はMacからiPhoneへ直接流れ、リレーは映像の経路から外れます。

この手法は一般にホールパンチングと呼ばれます。ほとんどの家庭用ルーターでは機能しますが、一部の厳格なモバイル回線や社内ネットワークでは失敗します。 その場合、映像はそのままリレー経由で流れ続けます。どちらの場合でも、設定をしたりポートを開けたりする必要はありません。

UDPがブロックされている場合

UDPをまったく通さないネットワークもあります。制御用の接続は応答しているのに3秒間映像が届かないと、 iPhoneはMacに、映像を制御用のストリームで小さく分割して送るよう頼みます。ビットレートの上限は低くなるので画質は柔らかくなりますが、 止まった映像よりはぼやけた映像のほうがましです。Macは高速な経路にも数秒ごとにキーフレームを送り続け、 iPhoneがその経路の回復を確認すると元に戻します。

この作りにした理由

これの利用者向けの説明と、外出中もMacに到達できるようにする設定については、 どこからでもMacにアクセスと、 リモートアクセスのためにMacを起こしておくをご覧ください。

よくある質問

外出先でPeeringを使うために、ルーターのポートを開ける必要はありますか?

いいえ。接続はすべて外向きです。Macはリレーへの接続を1本開いたままにし、両方のデバイスがそこへ接続するので、転送の設定は不要です。

Peeringはセッション全体でリレーを使いますか?

リレーが接続に加わるのは最初だけです。そのあと映像は、MacとiPhoneの間を直接通ろうとし、ネットワークが直接の経路を許さないときはリレーにフォールバックします。