Comment votre iPhone joint votre Mac de n'importe où
Votre Mac est derrière un routeur et votre iPhone est sur un réseau mobile. Aucun des deux ne peut appeler l'autre. Voici la séquence qui les fait se parler, dans l'ordre où elle se déroule.
Sur le même réseau : Bonjour et un seul port
L'app Mac écoute sur le port TCP 51515 et s'annonce via Bonjour sous le nom
_remotedesktop._tcp, avec trois petites informations : un identifiant d'appareil, le nom du Mac et
la version du protocole. L'iPhone recherche ce service, si bien qu'un Mac sur le même Wi-Fi apparaît sous
À proximité sans que personne ait à saisir d'adresse.
Cette annonce n'est qu'une indication. Rien de ce qui touche à la sécurité n'en dépend, car n'importe qui sur un réseau peut annoncer n'importe quoi. Ce qui compte, c'est la suite : l'iPhone ouvre une connexion TLS 1.3, les deux côtés présentent un certificat, et chacun compare la clé publique de l'autre à celle qu'il a mémorisée lors de l'association. Le fonctionnement de cette association fait l'objet d'un article à part.
Sur un réseau domestique, l'iPhone ouvre deux connexions : une pour le contrôle (saisie, réglages, liste des fenêtres) et une qui ne transporte que l'image. Garder la vidéo hors du flux de contrôle évite qu'une grosse image clé fasse attendre un clic de souris derrière elle.
Hors du réseau : un relais qui se contente de présenter
Dès que vous quittez la maison, l'iPhone ne peut plus joindre une adresse privée derrière votre routeur, et le routeur n'acceptera pas une connexion que personne n'a sollicitée. C'est donc le Mac qui fait le premier pas, en avance. Tant qu'il tourne, il garde ouverte une connexion WebSocket sortante vers le relais de Peering et envoie un petit ping toutes les 25 secondes. Cette connexion ouverte est la présence du Mac : c'est ainsi que le relais sait que le Mac existe et qu'il est éveillé.
Quand vous touchez votre Mac sur l'iPhone, voici ce qui se passe :
- L'iPhone demande au relais de se connecter à l'identifiant d'appareil de votre Mac.
- Le relais répond aux deux extrémités avec une adresse et deux jetons aléatoires de 16 octets, l'un pour le contrôle et l'autre pour la vidéo.
- Les deux appareils ouvrent une connexion TCP sortante vers le relais et y écrivent d'abord leur jeton.
- Le relais fait correspondre les deux jetons et relie les connexions, en copiant les octets de l'une vers l'autre.
L'iPhone lance alors la même négociation TLS que sur un réseau domestique, et elle traverse directement le relais jusqu'au Mac. Le relais est un tuyau, pas un participant à la conversation. Il ne détient jamais de clé. Pour le détail de ce qu'il peut ou ne peut pas apprendre, lisez ce que le relais peut voir.
L'image prend un raccourci
Tout faire passer par le relais fonctionnerait, mais ce serait le chemin le plus lent et le plus coûteux. L'image ne reste donc pas sur la connexion TCP. Elle passe en UDP, mieux adapté à la vidéo : une image en retard ne vaut rien, et en retransmettre une ne fait que retarder la suivante.
Chaque extrémité pose aussi une question au relais : depuis quelle adresse l'autre côté se connecte-t-il ? Le relais répond avec l'adresse qu'il a observée, et les deux appareils commencent à s'envoyer de petits paquets de sondage scellés, toutes les 250 millisecondes. Chaque sondage ouvre une brèche dans le routeur de l'émetteur, et quand les deux brèches se rejoignent, un sondage passe et s'authentifie. À partir de ce moment, l'image va directement du Mac à l'iPhone et le relais sort du chemin de la vidéo.
C'est la technique que l'on appelle généralement le hole punching (perçage de NAT). Elle fonctionne avec la plupart des routeurs domestiques et échoue avec certains réseaux mobiles ou d'entreprise stricts, auquel cas l'image continue simplement de passer par le relais. Dans les deux cas, vous n'avez rien à configurer ni aucun port à ouvrir.
Quand l'UDP est bloqué
Certains réseaux rejettent l'UDP en bloc. Si aucune image n'est arrivée depuis trois secondes alors que la connexion de contrôle répond toujours, l'iPhone demande au Mac d'envoyer la vidéo par le flux de contrôle, découpée en morceaux. Le débit est plafonné plus bas, l'image est donc plus floue, mais une image floue vaut mieux qu'une image figée. Le Mac continue d'envoyer une image clé sur le chemin rapide toutes les quelques secondes, et quand l'iPhone voit ce chemin se rétablir, il y revient.
Pourquoi c'est conçu ainsi
- Aucun port entrant. Toutes les connexions sont sortantes : aucun réglage de routeur à modifier et rien d'exposé sur Internet.
- Aucun compte. Les appareils sont identifiés par des clés qu'ils génèrent eux-mêmes, pas par un identifiant de connexion. Voir l'association sans compte.
- Le chemin le moins cher d'abord. Le même réseau est gratuit et sans limite. Le relais ne porte que ce qu'un chemin direct ne peut pas porter.
Pour la version destinée aux utilisateurs, avec les réglages qui gardent un Mac joignable pendant votre absence, voir accéder à votre Mac de n'importe où et garder votre Mac éveillé pour l'accès à distance.
Questions
Dois-je ouvrir des ports sur mon routeur pour utiliser Peering hors de chez moi ?
Non. Toutes les connexions sont sortantes. Le Mac garde une connexion ouverte vers le relais, et les deux appareils s'y connectent vers l'extérieur, donc rien n'a besoin d'être redirigé.
Peering utilise-t-il le relais pendant toute la session ?
Le relais intervient au début de la connexion. L'image essaie ensuite de passer directement entre votre Mac et votre iPhone, et se replie sur le relais quand votre réseau n'autorise pas de chemin direct.