Désolé pour la longueur, c'est un peu nécessaire.
Introduction
Je suis le développement d'un logiciel de bureau à distance (juste pour le fun) en C# 4.0 pour Windows Vista/7. J'ai obtenu à travers des obstacles de fond: j'ai une solide UDP système de messagerie, relativement propre conception du programme, j'ai un pilote de mise en miroir (la libre DFMirage pilote de mise en miroir de DemoForge) et en cours d'exécution, et j'ai mis en place le NAT traversal pour tous les types de NAT sauf Symétrique NATs (présent dans le pare-feu d'entreprise).
Concernant l'écran de transfert/partage, grâce au miroir pilote, je suis automatiquement informé de l'évolution de régions d'écran et je peux simplement maréchal le miroir pilote en constante mutation écran bitmap à ma propre image. Puis-je compresser la région d'écran au format PNG et de les envoyer sur le serveur de mon client. Les choses sont assez bonne, mais ce n'est pas assez rapide. C'est aussi lent que VNC (btw, je n'utilise pas le protocole VNC, juste une coutume amateur protocole).
À partir de la plus lente du logiciel de bureau à distance de la manière la plus rapide, la liste commence généralement à tous les VNC-like implémentations, puis grimpe sur Microsoft Windows Remote Desktop...et puis...TeamViewer. Pas tout à fait sûr de CrossLoop, LogMeIn - je ne l'ai pas utilisé, mais TeamViewer est incroyablement rapide. Il est tout à fait littéralement vivre. J'ai couru un tree
commande sur Invite de commandes et mise à jour avec 20 ms de retard. Je peux naviguer sur le web en seulement quelques millisecondes plus lent que sur mon ordinateur portable. Défilement code verticalement dans Visual Studio a 50 ms temps de latence. Pensez à la façon robuste TeamViewer de l'écran de la solution de transfert doit être pour accomplir tout cela.
Inc utiliser sondage à base de crochets pour la détection de changement d'écran et de la force brute de capture d'écran/comparer à leur pire. À leur meilleur, ils utilisent un pilote de mise en miroir comme DFMirage. Je suis à ce niveau. Et ils utilisent ce qu'on appelle le protocole RFB.
Microsoft Windows Remote Desktop apparemment va pas plus haut que le VNC. J'ai entendu, à partir de quelque part sur StackOverflow, que le Bureau à Distance de Windows n'envoie pas d'écran bitmaps, mais, concrètement, les commandes de dessin. C'est tout à fait brillant, parce qu'il suffit de les envoyer de texte simple (tirage au sort ce rectangle à ces coordonnées et la couleur avec ce dégradé)! Remote Desktop est vraiment assez rapide et c'est la façon habituelle de travailler de la maison. Et il utilise ce qu'on appelle le protocole RDP.
Maintenant, TeamViewer est un mystère complet pour moi. Apparemment, ils ont sorti leur code source de la Version 2 (TeamViewer est la Version 7 février 2012). Les gens l'ont lu et a dit que la Version 2 est inutile - que c'est juste quelques améliorations au cours de VNC automatique NAT traversal.
Mais la Version 7...c'est ridiculement rapide maintenant. Je veux dire, c'est effectivement plus rapide que le Bureau à Distance de Windows. J'ai diffusé DirectX 3D jeux avec TeamViewer (à 1 fps, mais le Bureau à Distance de Windows n'autorise même pas de DirectX).
Par la voie, TeamViewer tout cela sans un pilote de mise en miroir. Il y a une option pour installer un, et il devient juste un peu plus rapide.
La Question
Ma question est, comment est TeamViewer si vite? Il ne doit pas être possible. Si vous avez de 1920 par 1080 de résolution à 24 bits de profondeur (16 bits de profondeur serait sensiblement moche), c'est encore 6,220,800 octets bruts. Même l'utilisation de la libjpeg-turbo (l'un des plus rapides de la compression JPG bibliothèques utilisées par les grandes entreprises), de la compression à 30 KO (soyons généreux), serait de prendre le temps de parcours à travers TeamViewer serveurs (TeamViewer contourne entreprise Symétrique NATs tout simplement par l'utilisation de proxy de trafic par le biais de leurs serveurs). Et que libjpeg-turbo-compression prendrais le temps de le compresser. De haute qualité de la compression JPG prend 175 millisecondes pour un plein de 1920 par 1080 capture d'écran pour moi. Et ce nombre est si l'hôte de l'ordinateur exécute un processeur Atom. Je n'ai tout simplement pas comprendre comment TeamViewer a optimisé leur écran de transfert si bien. De nouveau, la petite taille des images peut être très compressé, mais prenez au moins quelques dizaines de millisecondes pour compresser. De grande taille, les images prennent pas le temps de compresser, mais prendre un certain temps pour passer à travers. En quelque sorte, TeamViewer, complète cet ensemble du processus pour obtenir à peu près 20 à 25 images par seconde. J'ai utilisé un moniteur de réseau, et TeamViewer est encore lagless à des vitesses de 500 Kbit / s et 1 Mbit / s (VNC logiciel décalage de quelques secondes que le taux de transfert). Au cours de ma tree
Invite de Commande de test, TeamViewer est de recevoir les données entrantes à un débit de 1 Mbit / s et toujours en cours de 5-6 fps. Et la VNC remote desktop ne pas le faire. Oui, comment?
Les réponses seront un peu compliqué et complexe, de sorte s'il vous plaît ne postez pas votre de 0,02 $si vous allez seulement à dire que c'est parce qu'ils utilisent UDP au lieu de TCP (croiriez-vous qu'ils font réellement l'utilisation de TCP juste avec autant de succès).
J'espère qu'il y a un TeamViewer développeur quelque part ici sur StackOverflow.
Les Réponses Possibles
Les mettra à jour une fois que les gens répondre.
- Mes pensées sont, tout d'abord, que TeamViewer est très fin réseau de contrôle. Par exemple, ils se sont séparés de gros paquets à un peu moins de la taille de la MTU et ne perdez pas un voyage. Ils ont probablement toutes sortes de fantaisie crochets pour détecter les changements d'écran avec extrêmement rapide XOR comparaisons d'images.