Jakim cudem TeamViewer jest tak szybki?

Przepraszam za Długość, to trochę konieczne.

Wprowadzenie

Rozwijam program do zdalnego pulpitu (dla zabawy) w C# 4.0 Dla Windows Vista/7. Przeszedłem przez podstawowe przeszkody: mam solidny system wiadomości UDP, stosunkowo czysty projekt programu, Mam sterownik lustrzany (darmowy sterownik lustrzany Dfmirage od DemoForge), i zaimplementowałem przemieszczenie NAT dla wszystkich typów NAT z wyjątkiem symetrycznych Nat (obecnych w korporacyjnej zapory sieciowej sytuacje).

Jeśli chodzi o przesyłanie/udostępnianie ekranu, dzięki sterownikowi mirror, jestem automatycznie powiadamiany o zmieniających się regionach ekranu i mogę po prostu przenieść ciągle zmieniającą się bitmapę ekranu sterownika mirror na moją własną bitmapę. Następnie kompresuję obszar ekranu jako PNG i wysyłam go z serwera do mojego klienta. Wszystko wygląda całkiem dobrze, ale nie jest wystarczająco szybko. Jest tak samo wolny jak VNC (btw, nie używam protokołu VNC, tylko Niestandardowy protokół Amatorski).

Z najwolniejsze oprogramowanie pulpitu zdalnego do najszybszego, lista zwykle zaczyna się we wszystkich implementacjach podobnych do VNC, a następnie wspina się na Pulpit zdalny Microsoft Windows...i wtedy...TeamViewer. Nie jestem pewien co do Crossloopa, LogMeIn - nie używałem ich, ale TeamViewer jest szalenie szybki. Jest dosłownie na żywo. Uruchomiłem tree polecenie w wierszu polecenia i zaktualizowałem je z opóźnieniem 20 ms. Mogę przeglądać internet tylko kilka milisekund wolniej niż na moim laptopie. Przewijanie kodu w pionie w wizualnym Studio ma opóźnienie 50 ms. Pomyśl o tym, jak solidne musi być rozwiązanie TeamViewer do przenoszenia ekranu, aby to wszystko osiągnąć.

VNC używają haków opartych na ankiecie do wykrywania zmiany ekranu i przechwytywania/porównywania ekranu brute force w najgorszym przypadku. W najlepszym razie używają sterownika lustrzanego, takiego jak DFMirage. Jestem na tym poziomie. Używają protokołu RFB.

Microsoft Windows Remote Desktop najwyraźniej idzie o krok wyżej niż VNC. Słyszałem, że gdzieś na StackOverflow, że Pulpit zdalny systemu Windows nie wysyła bitmap ekranowych, ale rzeczywiste polecenia rysowania. To dość genialne, ponieważ może po prostu wysłać prosty tekst (narysuj ten prostokąt na tej współrzędnej i pokoloruj go tym gradientem)! Zdalny pulpit naprawdę jest dość szybki - i jest to standardowy sposób pracy z domu. I używa czegoś, co nazywa się protokołem RDP.

Teraz TeamViewer jest dla mnie kompletną tajemnicą. Najwyraźniej wydali swój kod źródłowy dla wersji 2 (TeamViewer to wersja 7 od Luty 2012). Ludzie to przeczytali i powiedzieli, że Wersja 2 jest bezużyteczna - że to tylko kilka ulepszeń w stosunku do VNC z automatycznym przesuwaniem NAT.

Ale Wersja 7...it teraz jest śmiesznie szybki. Jest szybszy niż zdalny pulpit Windows. Streamowałem gry DirectX 3D za pomocą TeamViewer(przy 1 kl. / s, ale Pulpit zdalny systemu Windows nie pozwala nawet na uruchomienie DirectX).

Przy okazji, TeamViewer robi to wszystko BEZ sterownika lustrzanego. Istnieje możliwość instalacji jeden i robi się trochę szybciej.

Pytanie

Moje pytanie brzmi, jak TeamViewer jest tak szybki?To nie może być możliwe. Jeśli Masz rozdzielczość 1920 na 1080 przy nawet 24 bitowej głębi (16 bitowa głębia byłaby zauważalnie brzydka), to nadal 6,220,800 bajtów raw. Nawet użycie libjpeg-turbo (jednej z najszybszych bibliotek kompresji JPG używanych przez duże korporacje), skompresowanie jej do 30KB (bądźmy niezwykle hojni), zajęłoby trochę czasu, aby przejść przez TeamViewer serwery (TeamViewer omija symetryczne Naty korporacyjne, po prostu proxy ruchu przez ich serwery). A kompresja libjpeg-turbo zajmie trochę czasu. Wysokiej jakości kompresja JPG zajmuje 175 milisekund, aby uzyskać pełny zrzut ekranu 1920 na 1080. I ta liczba wzrasta, jeśli komputer hosta uruchamia procesor Atom. Po prostu nie rozumiem, w jaki sposób TeamViewer tak dobrze zoptymalizował transfer ekranu. Ponownie, obrazy o małych rozmiarach mogą być mocno skompresowane, ale weź co najmniej dziesiątki milisekund do kompresji. Kompresowanie obrazów o dużych rozmiarach nie zajmuje dużo czasu, ale przejście przez nie zajmuje dużo czasu. W jakiś sposób TeamViewer kończy cały ten proces, aby uzyskać około 20-25 klatek na sekundę. Używałem monitora sieciowego, a TeamViewer nadal jest bez lagów przy prędkości 500 Kbps I 1 Mbps (VNC Software lag na kilka sekund przy tej szybkości transferu). Podczas mojego testu wiersza poleceń tree, TeamViewer odbierał dane przychodzące z prędkością 1 MB / s i nadal działał 5-6 fps. VNC i zdalny pulpit nie rób tego. Więc jak?

Odpowiedzi będą nieco skomplikowane i skomplikowane, więc proszę nie publikować swojego $0.02, jeśli masz zamiar powiedzieć, że to dlatego, że używają UDP zamiast TCP (uwierzyłbyś, że używają TCP równie skutecznie).

Mam nadzieję, że gdzieś na StackOverflow jest programista TeamViewer.

Potencjalne Odpowiedzi

Zaktualizuje to, gdy ludzie odpowiedzą.

  1. moje myśli są, przede wszystko to, TeamViewer ma bardzo dobrą kontrolę nad siecią. Na przykład, dzielą duże pakiety tuż pod rozmiarem MTU i nigdy nie marnują podróży. Prawdopodobnie mają różnego rodzaju fantazyjne haczyki do wykrywania zmian ekranu wraz z niezwykle szybkimi porównaniami obrazów XOR.
Author: Jason, 2012-02-29

5 answers

Najbardziej fundamentalną rzeczą jest tutaj prawdopodobnie to, że nie chcesz przesyłać statycznych obrazów, ale tylko zmienia się na obrazy, co zasadniczo jest analogiczne do strumienia wideo.

Moim najlepszym zdaniem jest jakiś bardzo wydajny (i mocno wyspecjalizowany i zoptymalizowany) algorytm kompensacji ruchu, ponieważ większość rzeczywistej zmiany w ogólnym wykorzystaniu pulpitu to liniowy ruch elementów (przewijanie tekstu, przesuwanie okien itp. w przeciwieństwie do transformacji elementów).

Wydajność DirectX 3D 1 FPS zdaje się w pewnym stopniu potwierdzać moje przypuszczenia.

 73
Author: Kimvais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-29 12:46:56
Przejście przez serwery TeamViewer zajmuje trochę czasu (TeamViewer omija symetryczne korporacyjne Naty, po prostu pośrednicząc ruch przez ich serwery)

Przekonasz się, że TeamViewer rzadko musi przekazywać ruch przez własne serwery. TeamViewer penetruje NAT i sieci skomplikowane przez NAT za pomocą NAT traversal (myślę, że jest to UDP dziurkowanie , Jak Google libjingle).

Używają własnych serwerów, aby uścisk dłoni i konfiguracja połączenia, ale przez większość czasu relacja między Klientem a serwerem będzie P2P (najlepiej, gdy uścisk dłoni się powiedzie). Jeśli NAT traversal zawiedzie, TeamViewer rzeczywiście przekaże ruch za pośrednictwem własnych serwerów.

Widziałem to tylko wtedy, gdy klient stoi za double-NAT.
 20
Author: Jamie Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 11:54:12

Trochę spóźniona odpowiedź, ale proponuję rzucić okiem na niezbyt znany projekt na codeplex o nazwie ConferenceXP

ConferenceXP jest platformą badawczą typu open source, która zapewnia proste, elastyczne i rozszerzalne konferencje i współpraca przy użyciu sieci o dużej przepustowości oraz zaawansowane możliwości multimedialne Microsoft Windows. ConferenceXP pomaga naukowcom i edukatorom opracowanie innowacyjnych aplikacji i rozwiązań, które cechują jakość transmisji audio i wideo wspierające dystrybucję w czasie rzeczywistym środowisko współpracy i kształcenia na odległość.

Pełne źródło (jest ogromne!). Implementuje protokół RTP .

 13
Author: Simon Mourier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-08 09:40:30

To rzeczywiście brzmi jak streaming wideo bardziej niż streaming obrazu, jak ktoś zasugerował. Kompresja JPEG / PNG nie jest ukierunkowana na tego typu prędkości, więc zapomnij o nich.

Wyobraź sobie kodek nagrywania w systemie, który może w czasie rzeczywistym rejestrować przychodzący strumień wideo (Ekran). Może trochę jak Fraps. Następnie wyobraź sobie kodek odtwarzający wideo po drugiej stronie (zdalny klient). Jak nagrywarki HD mogą to zrobić (nagrywanie na żywo, a nawet odtwarzanie na żywo z tego samego HD), więc należy, w koniec. HD z pewnością nie może dostarczyć obrazów szybciej niż można odczytać wyświetlacz, więc to nie jest wąskie gardło. Wąskim gardłem są kodeki wideo. Znajdziesz koder znacznie więcej problemów niż dekoder, ponieważ wszystkie dekodery są w większości darmowe.

Nie mówię, że to proste; sam użyłem DirectShow do kodowania pliku wideo, a to nie jest w czasie rzeczywistym. Ale biorąc pod uwagę odpowiedni kodek, jestem przekonany, że może działać.

 5
Author: Ruud van Gaal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-23 19:53:44

Dziwnie. ale z mojego doświadczenia TeamViewer nie jest szybszy/bardziej responsywny niż VNC, tylko łatwiejszy w konfiguracji. Mam kilka win-boxen, które VNC nad OpenVPN do (więc jest inna warstwa napowietrzna) i to na tanim kablu (512 w górę) i uważam, że odpowiednio skonfigurowany TightVNC jest znacznie bardziej responsywny niż TeamViewer do tego samego boxen. RDP (oczywiście) tym bardziej, że w dużej części wysyła polecenia rysowania GUI zamiast płytek bitmapowych.

Co sprowadza nas do:

  1. Dlaczego jesteś nie używasz VNC? Istnieje mnóstwo open source rozwiązania, a Tight prawdopodobnie jest teraz na szczycie swojej gry.

  2. Zaawansowane implementacje VNC wykorzystują kompresję stratną i to wydaje się osiągać lepsze wyniki niż wybór PNG. Również IIRC reszta ładunku jest również zgnieciony przy użyciu zlib. Zarówno J Tight, jak i UltraVNC mają bardzo zoptymalizowany algos, szczególnie dla okien. Poza tym Tight jest open-source.

  3. Jeśli win boxen są twoim głównym celem, RDP może być lepsza opcja i ma implementację opensource (rdesktop)

  4. Jeśli * Nix boxen są twoim głównym celem, NX może być lepszą opcją i ma implementację open source(FreeNX, choć nie tak zoptymalizowaną jak zastrzeżony produkt NoMachine).

Jeśli kompresja JPEG jest problemem wydajnościowym dla Twojego algo, jestem prawie pewien, że porównanie obrazów nadal odbierze pewną wydajność. Założę się, że używają najlepszej kompresji dla każdej konkretnej sytuacji, tj. stratnej dla duże klatki, niektóre szybkie i brudne wewnętrznie bezstratne dla mniejszych, porównują fragmenty obrazów i wysyłają tylko diffy typu i kilka innych sztuczek optymalizacyjnych.

I wiele z tych trików musi być obecnych w Tight > 2.0, ponieważ z mojego doświadczenia bije piekło z wydajności TeamViewer wyse, YMMV.

Również wybór środowiska uruchomieniowego skompilowanego JIT zamiast czegoś takiego jak C++ może zabrać kawałek z krawędzi wydajności, szczególnie w komputerach z ograniczeniami pamięci (wiele dostrajanie wydajności idzie do toalety, gdy windows zaczyna intensywnie korzystać z pagefile). I będziesz potrzebował pamięci, aby zachować poprzednie Stany obrazu do wewnętrznego porównania na szczycie tego, co daje Ci DF mirage.

 2
Author: Bojan Markovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-08 07:04:37