Mi dispiace per la lunghezza, è un po 'necessario.In che modo TeamViewer è così veloce?
Introduzione
sto sviluppando un software di desktop remoto (solo per divertimento) in C# 4.0 per Windows Vista/7. Ho incontrato ostacoli di base: ho un robusto sistema di messaggistica UDP, un design del programma relativamente pulito, ho un mirror driver (il driver gratuito per DFMirage mirror di DemoForge) attivo e funzionante, e ho implementato NAT traversal per tutti Tipi di NAT ad eccezione di NAT simmetrici (presenti nelle situazioni di firewall aziendale).
Per quanto riguarda il trasferimento/condivisione dello schermo, grazie al driver mirror, mi viene automaticamente notificata la modifica delle aree dello schermo e posso semplicemente effettuare il marshalling della bitmap dello schermo in continua evoluzione del mirror driver sulla mia bitmap. Quindi comprimo la regione dello schermo come PNG e la invio dal server al mio client. Le cose sembrano abbastanza buone, ma non abbastanza veloci. È lento come VNC (btw, non uso il protocollo VNC, solo un protocollo amatoriale personalizzato).
Dal più lento software desktop remoto al più veloce, l'elenco di solito inizia con tutte le implementazioni simili a VNC, quindi sale a Microsoft Windows Remote Desktop ... e poi ... TeamViewer. Non abbastanza sicuro di CrossLoop, LogMeIn - non li ho usati, ma TeamViewer è follemente veloce. È letteralmente vivo. Ho eseguito un comando tree
sul prompt dei comandi e aggiornato con 20 ms di ritardo. Posso navigare sul Web solo per pochi millisecondi rispetto al mio portatile. Lo scorrimento verticale del codice in Visual Studio ha un tempo di ritardo di 50 ms. Pensa a quanto sia robusta la soluzione di trasferimento dello schermo di TeamViewer per ottenere tutto ciò.
I VNC utilizzano ganci basati su poll per rilevare il cambio dello schermo e catturare/confrontare lo schermo con forza bruta nei peggiori casi. Al loro meglio, usano un driver mirror come DFMirage. Sono a questo livello E usano qualcosa chiamato il protocollo RFB.
Microsoft Windows Remote Desktop sembra essere un gradino più in alto rispetto a VNC. Ho sentito, da qualche parte su StackOverflow, che Windows Remote Desktop non invia bitmap dello schermo, ma comandi di disegno reali. È abbastanza brillante, perché può solo inviare un testo semplice (traccia questo rettangolo con questa coordinata e coloralo con questo gradiente)! Remote Desktop è davvero veloce - ed è il modo standard di lavorare da casa. E usa qualcosa chiamato il protocollo RDP.
Ora TeamViewer è un mistero completo per me. Apparentemente, hanno rilasciato il loro codice sorgente per la versione 2 (TeamViewer è la versione 7 a febbraio 2012). Le persone lo hanno letto e hanno detto che la Versione 2 è inutile - che sono solo alcuni miglioramenti rispetto a VNC con NAT traversal automatico.
Ma la versione 7 ... è ridicolmente veloce ora. Voglio dire, è in realtà più veloce di Windows Remote Desktop. Ho trasmesso in streaming i giochi DirectX 3D con TeamViewer (a 1 fps, ma Windows Remote Desktop non consente nemmeno l'esecuzione di DirectX).
A proposito, TeamViewer fa tutto questo senza un driver mirror. C'è un'opzione per installarne uno, e diventa solo un po 'più veloce.
La questione
La mia domanda è: come è TeamViewer così veloce? Non deve essere possibile. Se hai una risoluzione 1920 x 1080 con una profondità pari a 24 bit (la profondità di 16 bit sarebbe notevolmente brutta), sono ancora 6220.800 byte grezzi.Anche usando libjpeg-turbo (una delle librerie di compressione JPG più veloci usate dalle grandi aziende), comprimendola fino a 30KB (siamo estremamente generosi), ci vorrebbe del tempo per instradare i server di TeamViewer (TeamViewer ignora i Corporate Symmetric NAT semplicemente delegando il traffico attraverso i loro server). E quella compressione libjpeg-turbo richiederebbe del tempo per comprimerla. La compressione JPG di alta qualità impiega 175 millisecondi per uno screenshot completo di 1920 x 1080. E quel numero sale se il computer dell'host esegue un processore Atom. Semplicemente non capisco come TeamViewer abbia ottimizzato il trasferimento dello schermo così bene. Ancora una volta, le immagini di piccole dimensioni potrebbero essere molto compresse, ma richiedere almeno dieci decimi di millisecondi per comprimerle. Le immagini di grandi dimensioni non richiedono tempo per comprimerle, ma impiegano molto tempo per essere completate. In qualche modo, TeamViewer completa l'intero processo per ottenere circa 20-25 frame al secondo. Ho usato un monitor di rete, e TeamViewer è ancora senza lag alle velocità di 500 Kbps e 1 Mbps (il software VNC è in ritardo per alcuni secondi a quella velocità di trasferimento). Durante il mio test del prompt dei comandi tree
, TeamViewer stava ricevendo dati in entrata ad una velocità di 1 Mbps e ancora in esecuzione 5-6 fps. VNC e il desktop remoto non lo fanno. Così come?
Le risposte saranno un po 'complicata e intricata, quindi si prega di non pubblicare il tuo $ 0.02 se si sta solo andando a dire che è perché usano UDP al posto del TCP (ci credereste che in realtà usano il protocollo TCP altrettanto comunque con successo).
Spero ci sia uno sviluppatore di TeamViewer da qualche parte qui su StackOverflow.
potenziali risposte
aggiornerà questa volta che le persone rispondono.
- I miei pensieri sono, prima di tutto, che TeamViewer ha un controllo di rete molto fine. Ad esempio, dividono pacchetti di grandi dimensioni solo sotto la dimensione MTU e non sprecano mai un viaggio. Probabilmente hanno tutti i tipi di ganci eleganti per rilevare i cambiamenti dello schermo insieme a confronti di immagini XOR estremamente veloci.
Hai provato a decodificare il protocollo? (Sembra che utilizzino PKI per l'impostazione della sessione, quindi potrebbe non essere facile, se possibile) – Kimvais
Aspettarsi una risposta a questa domanda dipende dalla volontà di un'azienda di condividere il proprio segreto commerciale. Il loro primario in quello, quello che li tiene in affari. Hai un no forte, l'unico modo per ottenere un sì è chiamarli. Chiedi dei loro brevetti, immagino. –
Ha senso. Aspetterò altri suggerimenti. – Jason