Peering

Peering / Blog

Como o seu iPhone chega ao seu Mac de qualquer lugar

O seu Mac está atrás de um roteador e o seu iPhone está em uma rede móvel. Nenhum dos dois consegue ligar para o outro. Esta é a sequência que os faz conversar, na ordem em que acontece.

Na mesma rede: Bonjour e uma porta

O app do Mac escuta na porta TCP 51515 e se anuncia pelo Bonjour como _remotedesktop._tcp, com três pequenas informações anexadas: um ID de dispositivo, o nome do Mac e a versão do protocolo. O iPhone procura esse serviço, então um Mac no mesmo Wi-Fi aparece em Próximos sem que ninguém digite um endereço.

O anúncio é só uma dica e nada mais. Nada relacionado à segurança é decidido a partir dele, porque qualquer pessoa em uma rede pode anunciar qualquer coisa. O que importa é o que vem depois: o iPhone abre uma conexão TLS 1.3, os dois lados apresentam um certificado, e cada um confere a chave pública do outro com a que guardou quando vocês fizeram o pareamento. Como esse pareamento funciona é assunto de outro post.

Em uma rede doméstica, o iPhone abre duas conexões: uma para o controle (entrada, ajustes, a lista de janelas) e outra que carrega só a imagem. Manter o vídeo fora do fluxo de controle significa que um keyframe grande nunca faz um clique do mouse esperar atrás dele.

O Peering no iPhone: a tela Conectar listando um Mac próximo, uma forma de parear com um Mac em outro lugar e os Macs confiáveis.
Os Macs próximos vêm do Bonjour. Os Macs confiáveis são os que você já pareou.

Fora da rede: um relay que só apresenta

Quando você sai de casa, o iPhone não consegue alcançar um endereço privado atrás do seu roteador, e o roteador não aceita uma conexão que ninguém pediu. Por isso o Mac dá o primeiro passo, cedo. Enquanto está em execução, ele mantém um WebSocket de saída aberto com o relay do Peering e envia um pequeno ping a cada 25 segundos. Esse soquete aberto é a presença do Mac: é assim que o relay sabe que o Mac existe e está ativo.

Quando você toca no seu Mac no iPhone, acontece o seguinte:

  1. O iPhone pede ao relay que se conecte ao ID de dispositivo do seu Mac.
  2. O relay responde às duas pontas com um endereço e um par de tokens aleatórios de 16 bytes, um para o controle e outro para o vídeo.
  3. Os dois dispositivos abrem uma conexão TCP de saída com o relay e escrevem primeiro o seu token.
  4. O relay combina os dois tokens e une os soquetes, copiando bytes de um para o outro.

Então o iPhone inicia o mesmo handshake TLS que usaria em uma rede doméstica, e ele passa direto pelo relay até o Mac. O relay é um duto, não uma parte da conversa. Ele nunca guarda uma chave. Para saber em detalhes o que ele pode e não pode descobrir, leia o que o relay pode ver.

A imagem pega um atalho

Passar tudo pelo relay funcionaria, mas é o caminho mais lento e o mais caro. Por isso a imagem não fica na conexão TCP. Ela passa para o UDP, mais adequado a vídeo: um quadro atrasado não vale nada, e retransmiti-lo só atrasa o seguinte.

Cada ponta também faz uma pergunta ao relay: de que endereço o outro lado se conecta? O relay responde com o endereço que observou, e os dois dispositivos começam a enviar um ao outro pequenos pacotes de teste selados, a cada 250 milissegundos. Cada teste abre um buraco no roteador de quem o envia, e quando os dois buracos se alinham, um teste passa e se autentica. A partir desse momento a imagem vai direto do Mac para o iPhone e o relay sai do caminho do vídeo.

Essa é a técnica geralmente chamada de hole punching. Ela funciona com a maioria dos roteadores domésticos e falha com alguns mais restritos, de redes móveis e corporativas, caso em que a imagem simplesmente continua passando pelo relay. De um jeito ou de outro, você não precisa configurar nada nem abrir uma porta.

Quando o UDP está bloqueado

Algumas redes descartam o UDP por completo. Se nenhuma imagem chegar por três segundos enquanto a conexão de controle ainda responde, o iPhone pede ao Mac que envie o vídeo pelo fluxo de controle, dividido em pedaços. Ele fica limitado a uma taxa de bits menor, então a imagem fica mais suave, mas uma imagem suave é melhor do que uma congelada. O Mac continua enviando um keyframe pelo caminho rápido a cada poucos segundos, e quando o iPhone vê esse caminho se recuperar, volta para ele.

Por que foi construído assim

Para a versão voltada ao usuário, com os ajustes que mantêm um Mac acessível enquanto você está fora, veja acessar o seu Mac de qualquer lugar e manter o Mac ativo para acesso remoto.

Perguntas

Preciso abrir portas no meu roteador para usar o Peering fora de casa?

Não. Toda conexão é de saída. O Mac mantém uma conexão aberta com o relay, e os dois dispositivos se conectam a ele, então nada precisa ser redirecionado.

O Peering usa o relay durante a sessão inteira?

O relay entra na conexão no começo. Depois, a imagem tenta ir direto entre o Mac e o iPhone, e volta para o relay quando a sua rede não permite um caminho direto.