Entschuldigung für die Länge, es ist irgendwie notwendig.
Einführung
Ich entwickle eine Remotedesktopsoftware (nur zum Spaß) in C # 4.0 für Windows Vista / 7. Ich habe grundlegende Hindernisse überwunden: Ich habe ein robustes UDP-Messagingsystem, ein relativ sauberes Programmdesign, einen Spiegeltreiber (den kostenlosen DFMirage-Spiegeltreiber von DemoForge) und NAT-Traversal für alle implementiert NAT-Typen mit Ausnahme von symmetrischen NATs (in Firewall-Situationen von Unternehmen vorhanden).
In Bezug auf die Bildschirmübertragung / -freigabe werde ich dank des Spiegeltreibers automatisch über geänderte Bildschirmbereiche informiert und kann die sich ständig ändernde Bildschirm-Bitmap des Spiegeltreibers einfach in meine eigene Bitmap umwandeln. Dann komprimiere ich den Bildschirmbereich als PNG und sende ihn vom Server an meinen Client. Die Dinge sehen ziemlich gut aus, aber es ist nicht schnell genug. Es ist genauso langsam wie VNC (übrigens verwende ich nicht das VNC-Protokoll, sondern nur ein benutzerdefiniertes Amateurprotokoll).
Von der langsamsten Remotedesktopsoftware bis zur schnellsten beginnt die Liste normalerweise bei allen VNC-ähnlichen Implementierungen und steigt dann auf Microsoft Windows Remotedesktop auf ... und dann auf TeamViewer. Ich bin mir bei CrossLoop, LogMeIn nicht ganz sicher - ich habe sie nicht verwendet, aber TeamViewer ist wahnsinnig schnell. Es ist buchstäblich live. Ich habe einen tree
Befehl auf der Eingabeaufforderung ausgeführt und er wurde mit einer Verzögerung von 20 ms aktualisiert. Ich kann nur wenige Millisekunden langsamer im Internet surfen als auf meinem Laptop. Das vertikale Scrollen von Code in Visual Studio hat eine Verzögerungszeit von 50 ms. Überlegen Sie, wie robust die Bildschirmübertragungslösung von TeamViewer sein muss, um all dies zu erreichen.
VNCs verwenden umfragebasierte Hooks, um Bildschirmänderungen zu erkennen und Brute-Force-Bildschirmerfassung / -vergleich im schlimmsten Fall durchzuführen. Im besten Fall verwenden sie einen Spiegeltreiber wie DFMirage. Ich bin auf diesem Niveau. Und sie verwenden das sogenannte RFB-Protokoll.
Microsoft Windows Remote Desktop geht offenbar einen Schritt höher als VNC. Ich habe irgendwo auf StackOverflow gehört, dass Windows Remote Desktop keine Bildschirm-Bitmaps sendet, sondern tatsächliche Zeichenbefehle. Das ist ziemlich brillant, weil es einfach einfachen Text senden kann (zeichnen Sie dieses Rechteck an dieser Koordinate und färben Sie es mit diesem Farbverlauf)! Remotedesktop ist wirklich ziemlich schnell - und es ist die Standardmethode, von zu Hause aus zu arbeiten. Und es wird das sogenannte RDP-Protokoll verwendet.
Jetzt ist mir TeamViewer ein Rätsel. Anscheinend haben sie ihren Quellcode für Version 2 veröffentlicht (TeamViewer ist Version 7 ab Februar 2012). Die Leute haben es gelesen und gesagt, dass Version 2 nutzlos ist - dass es nur ein paar Verbesserungen gegenüber VNC mit automatischer NAT-Durchquerung sind.
Aber Version 7 ... es ist jetzt lächerlich schnell. Ich meine, es ist tatsächlich schneller als Windows Remote Desktop. Ich habe DirectX 3D-Spiele mit TeamViewer gestreamt (mit 1 fps, aber Windows Remote Desktop lässt DirectX nicht einmal laufen).
TeamViewer macht das übrigens alles ohne Spiegeltreiber. Es gibt eine Option, um eine zu installieren, und es wird nur ein bisschen schneller.
Die Frage
Meine Frage ist, wie ist TeamViewer so schnell?Es darf nicht möglich sein. Wenn Sie eine Auflösung von 1920 x 1080 bei einer Tiefe von sogar 24 Bit haben (16-Bit-Tiefe wäre merklich hässlich), sind das immer noch 6.220.800 Bytes Raw. Selbst die Verwendung von libjpeg-turbo (einer der schnellsten JPG-Komprimierungsbibliotheken, die von großen Unternehmen verwendet wird) und die Komprimierung auf 30 KB (seien wir äußerst großzügig) würde einige Zeit in Anspruch nehmen, um die Server von TeamViewer zu durchlaufen (TeamViewer umgeht symmetrische NATs von Unternehmen, indem einfach der Datenverkehr durchgeleitet wird ihre Server). Und diese libjpeg-turbo-Komprimierung würde Zeit brauchen, um komprimiert zu werden. Die JPG-Komprimierung in hoher Qualität dauert 175 Millisekunden für einen vollständigen Screenshot von 1920 x 1080. Und diese Zahl steigt, wenn auf dem Computer des Hosts ein Atom-Prozessor ausgeführt wird. Ich verstehe einfach nicht, wie TeamViewer die Bildschirmübertragung so gut optimiert hat. Auch hier können kleine Bilder stark komprimiert sein. Die Komprimierung dauert jedoch mindestens zehn Millisekunden. Das Komprimieren großer Bilder dauert nicht lange, aber es dauert lange, bis sie fertig sind. Irgendwie schließt TeamViewer diesen gesamten Prozess ab, um ungefähr 20-25 Bilder pro Sekunde zu erhalten. Ich habe einen Netzwerkmonitor verwendet, und TeamViewer ist bei Geschwindigkeiten von 500 Kbit / s und 1 Mbit / s immer noch verzögert (VNC-Software verzögert sich bei dieser Übertragungsrate einige Sekunden). Während meinertree
Beim Eingabeaufforderungstest empfing TeamViewer eingehende Daten mit einer Geschwindigkeit von 1 Mbit / s und führte immer noch 5-6 fps aus. VNC und Remotedesktop tun das nicht. Also, wie?
Die Antworten werden etwas kompliziert und kompliziert sein. Bitte posten Sie Ihre $ 0,02 nicht, wenn Sie nur sagen wollen, dass sie UDP anstelle von TCP verwenden (würden Sie glauben, dass sie TCP tatsächlich genauso erfolgreich verwenden)?
Ich hoffe, dass es hier auf StackOverflow irgendwo einen TeamViewer-Entwickler gibt.
Mögliche Antworten
Wird dies aktualisieren, sobald Leute antworten.
- Ich bin zuallererst der Meinung, dass TeamViewer eine sehr gute Netzwerksteuerung hat. Zum Beispiel teilen sie große Pakete auf knapp unter die MTU-Größe auf und verschwenden keine Reise. Sie haben wahrscheinlich alle möglichen ausgefallenen Haken, um Bildschirmänderungen zusammen mit extrem schnellen XOR-Bildvergleichen zu erkennen.