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.
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:
- O iPhone pede ao relay que se conecte ao ID de dispositivo do seu Mac.
- 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.
- Os dois dispositivos abrem uma conexão TCP de saída com o relay e escrevem primeiro o seu token.
- 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
- Nenhuma porta de entrada. Toda conexão é de saída, então não há ajuste de roteador a mudar e nada exposto na internet.
- Nenhuma conta. Os dispositivos são identificados por chaves que eles mesmos geram, não por um login. Veja pareamento sem conta.
- Primeiro o caminho barato. A mesma rede é grátis e sem medição. O relay carrega só o que um caminho direto não consegue.
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.