Come il tuo iPhone raggiunge il tuo Mac da ovunque
Il tuo Mac sta dietro un router e il tuo iPhone è su una rete mobile. Nessuno dei due può chiamare l'altro. Ecco la sequenza che li fa parlare, nell'ordine in cui avviene.
Sulla stessa rete: Bonjour e una porta
L'app per Mac è in ascolto sulla porta TCP 51515 e si annuncia tramite Bonjour come
_remotedesktop._tcp, con tre piccole informazioni allegate: un ID dispositivo, il nome del Mac e la
versione del protocollo. L'iPhone cerca quel servizio, quindi un Mac sullo stesso Wi-Fi compare sotto
Nelle vicinanze senza che nessuno debba digitare un indirizzo.
L'annuncio è solo un indizio, niente di più. Nulla che riguardi la sicurezza viene deciso in base a esso, perché chiunque su una rete può annunciare qualsiasi cosa. Conta quello che succede dopo: il telefono apre una connessione TLS 1.3, entrambi i lati presentano un certificato e ciascuno controlla la chiave pubblica dell'altro rispetto a quella che aveva memorizzato quando li hai associati. Come funziona quell'associazione è argomento di un altro articolo.
Su una rete domestica il telefono apre due connessioni: una per il controllo (input, impostazioni, elenco delle finestre) e una che trasporta solo l'immagine. Tenere il video fuori dallo stream di controllo significa che un grosso keyframe non può mai far aspettare un clic del mouse dietro di sé.
Fuori dalla rete: un relay che si limita a presentare
Quando esci di casa, il telefono non può raggiungere un indirizzo privato dietro il tuo router, e il router non accetta una connessione che nessuno ha richiesto. Quindi è il Mac a fare la prima mossa, in anticipo. Finché è in esecuzione tiene aperto un WebSocket in uscita verso il relay di Peering e invia un piccolo ping ogni 25 secondi. Quel socket aperto è la presenza del Mac: è così che il relay sa che il Mac esiste ed è attivo.
Quando tocchi il tuo Mac sull'iPhone, succede questo:
- Il telefono chiede al relay di connettersi all'ID dispositivo del tuo Mac.
- Il relay risponde a entrambe le estremità con un indirizzo e una coppia di token casuali da 16 byte, uno per il controllo e uno per il video.
- Entrambi i dispositivi aprono una connessione TCP in uscita verso il relay e scrivono per prima cosa il proprio token.
- Il relay abbina i due token e unisce i socket, copiando i byte dall'uno all'altro.
Poi il telefono avvia lo stesso handshake TLS che userebbe su una rete domestica, e passa direttamente attraverso il relay fino al Mac. Il relay è un tubo, non una parte della conversazione. Non possiede mai una chiave. Per i dettagli su cosa può e non può imparare, leggi cosa può vedere il relay.
L'immagine prende una scorciatoia
Far passare tutto dal relay funzionerebbe, ma è il percorso più lento e più costoso. Quindi l'immagine non resta sulla connessione TCP. Passa a UDP, più adatto al video: un fotogramma in ritardo non vale nulla, e ritrasmetterlo rende solo il successivo ancora più in ritardo.
Ogni estremità pone inoltre una domanda al relay: da quale indirizzo si connette l'altra parte? Il relay risponde con l'indirizzo che ha osservato, e i due dispositivi iniziano a inviarsi a vicenda piccoli pacchetti di prova cifrati, ogni 250 millisecondi. Ogni pacchetto apre un varco nel router di chi lo invia e, quando i due varchi si allineano, un pacchetto passa e si autentica. Da quel momento l'immagine va direttamente dal Mac all'iPhone e il relay è fuori dal percorso del video.
È la tecnica di solito chiamata hole punching. Funziona con la maggior parte dei router domestici e fallisce con alcuni router mobili e aziendali più restrittivi, nel qual caso l'immagine continua semplicemente a passare dal relay. In ogni caso, non devi configurare nulla né aprire alcuna porta.
Quando UDP è bloccato
Alcune reti scartano completamente UDP. Se non arriva alcuna immagine da tre secondi mentre la connessione di controllo risponde ancora, l'iPhone chiede al Mac di inviare il video sullo stream di controllo, suddiviso in blocchi. Il bitrate è limitato a un valore più basso, quindi l'immagine appare più morbida, ma un'immagine morbida è meglio di una congelata. Il Mac continua a inviare un keyframe sul percorso veloce ogni pochi secondi, e quando il telefono vede che quel percorso si è ripreso, ci ritorna.
Perché è costruito così
- Nessuna porta in ingresso. Ogni connessione è in uscita, quindi non c'è alcuna impostazione del router da cambiare e nulla è esposto su internet.
- Nessun account. I dispositivi sono identificati da chiavi che generano loro stessi, non da un login. Vedi l'associazione senza account.
- Prima il percorso più economico. La stessa rete è gratuita e senza limiti. Il relay trasporta solo ciò che un percorso diretto non può.
Per la versione pensata per chi usa l'app, con le impostazioni che mantengono un Mac raggiungibile mentre sei fuori, vedi accedere al tuo Mac da ovunque e tenere il tuo Mac attivo per l'accesso remoto.
Domande
Devo aprire porte sul router per usare Peering fuori casa?
No. Ogni connessione è in uscita. Il Mac tiene aperta una connessione verso il relay ed entrambi i dispositivi si connettono a esso in uscita, quindi non serve inoltrare nulla.
Peering usa il relay per tutta la sessione?
Il relay unisce la connessione all'inizio. L'immagine poi cerca di andare direttamente tra il tuo Mac e il tuo iPhone, e ripiega sul relay quando la tua rete non consente un percorso diretto.