Mi dispiace per la lunghezza, è un po 'necessario.
introduzione
Sto sviluppando un software desktop remoto (solo per divertimento) in C # 4.0 per Windows Vista / 7. Ho superato gli ostacoli di base: ho un robusto sistema di messaggistica UDP, un design del programma relativamente pulito, ho un driver mirror (il driver mirror DFMirage gratuito di DemoForge) attivo e funzionante e ho implementato NAT traversal per tutti Tipi di NAT tranne NAT simmetrici (presenti in situazioni di firewall aziendali).
Per quanto riguarda il trasferimento / la condivisione dello schermo, grazie al driver mirror, sono automaticamente avvisato delle regioni dello schermo modificate e posso semplicemente eseguire il marshalling della bitmap dello schermo in continua evoluzione del driver del mirror sulla mia bitmap. Quindi comprimo la regione dello schermo come PNG e la invio dal server al mio client. Le cose sembrano piuttosto buone, ma non è abbastanza veloce. È lento quanto VNC (a proposito, non uso il protocollo VNC, solo un protocollo amatoriale personalizzato).
Dal software desktop remoto più lento al più veloce, l'elenco di solito inizia con tutte le implementazioni simili a VNC, quindi sale a Desktop remoto di Microsoft Windows ... e poi ... TeamViewer. Non sono sicuro di CrossLoop, LogMeIn - Non li ho usati, ma TeamViewer è incredibilmente veloce. È letteralmente vivo. Ho eseguito un tree
comando sul prompt dei comandi e si è aggiornato con un ritardo di 20 ms. Riesco a navigare sul Web solo pochi millisecondi più lentamente rispetto al mio laptop. Lo scorrimento verticale del codice in Visual Studio ha un ritardo di 50 ms. Pensa a quanto deve essere solida la soluzione di trasferimento dello schermo di TeamViewer per ottenere tutto ciò.
I VNC utilizzano hook basati sul poll per rilevare il cambiamento dello schermo e catturare / confrontare lo schermo della forza bruta nel peggiore dei casi. Nel migliore dei casi, usano un driver mirror come DFMirage. Sono a questo livello. E usano qualcosa chiamato il protocollo RFB.
Apparentemente il Desktop remoto di Microsoft Windows supera di un passo 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ò semplicemente inviare un testo semplice (disegna questo rettangolo con questa coordinata e coloralo con questo gradiente)! Il desktop remoto è davvero piuttosto 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). La gente lo ha letto e ha detto che la versione 2 è inutile, che sono solo alcuni miglioramenti rispetto a VNC con attraversamento NAT automatico.
Ma la versione 7 ... è incredibilmente 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 una e diventa solo un po 'più veloce.
La domanda
La mia domanda è: in che modo TeamViewer è così veloce?Non deve essere possibile. Se hai una risoluzione 1920 per 1080 a una profondità anche di 24 bit (una profondità di 16 bit sarebbe notevolmente brutta), questo è ancora 6.220.800 byte grezzi. Anche usando libjpeg-turbo (una delle librerie di compressione JPG più veloci utilizzate dalle grandi aziende), comprimendolo fino a 30 KB (siamo estremamente generosi), ci vorrebbe tempo per instradare attraverso i server di TeamViewer (TeamViewer bypassa i NAT simmetrici aziendali semplicemente inviando traffico attraverso i loro server). E quella compressione libjpeg-turbo richiederebbe del tempo per comprimersi. La compressione JPG di alta qualità richiede 175 millisecondi per uno screenshot completo di 1920 per 1080 per me. E quel numero aumenta se il computer dell'host esegue un processore Atom. Semplicemente non capisco come TeamViewer abbia ottimizzato il loro trasferimento dello schermo così bene. Ancora una volta, le immagini di piccole dimensioni potrebbero essere molto compresse, ma occorrono almeno decine di millisecondi per comprimere. Le immagini di grandi dimensioni non richiedono tempo per essere compresse, ma impiegano molto tempo per passare. 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 a velocità di 500 Kbps e 1 Mbps (ritardo del software VNC per alcuni secondi a quella velocità di trasferimento). Durante il miotree
Test del prompt dei comandi, TeamViewer riceveva i dati in entrata a una velocità di 1 Mbps e continuava a eseguire 5-6 fps. VNC e desktop remoto non lo fanno. Così come?
Le risposte saranno in qualche modo complicate e complesse, quindi per favore non pubblicare i tuoi $ 0,02 se vuoi solo dire che usano UDP invece di TCP (crederesti che effettivamente usano TCP altrettanto correttamente).
Spero che ci sia uno sviluppatore di TeamViewer da qualche parte qui su StackOverflow.
Risposte potenziali
Lo aggiornerò quando le persone risponderanno.
- Innanzitutto, penso che TeamViewer abbia un controllo di rete molto preciso. Ad esempio, hanno diviso i pacchetti di grandi dimensioni appena sotto la dimensione MTU e non sprecano mai un viaggio. Probabilmente hanno tutti i tipi di ganci fantasiosi per rilevare i cambiamenti dello schermo insieme a confronti di immagini XOR estremamente veloci.