Przepraszam za długość, to trochę konieczne.
Wprowadzenie
Tworzę oprogramowanie do zdalnego pulpitu (dla zabawy) w C # 4.0 dla Windows Vista / 7. Przeszedłem przez podstawowe przeszkody: mam niezawodny system przesyłania wiadomości UDP, stosunkowo czysty projekt programu, mam uruchomiony i działający sterownik lustrzany (bezpłatny sterownik lustrzany DFMirage z DemoForge) i zaimplementowałem przechodzenie NAT dla wszystkich Typy NAT z wyjątkiem symetrycznych NAT (obecnych w firmowych firewallach).
Jeśli chodzi o przesyłanie / udostępnianie ekranu, dzięki sterownikowi lustrzanemu, jestem automatycznie powiadamiany o zmienionych regionach ekranu i mogę po prostu przenieść stale zmieniającą się mapę bitową ekranu sterownika lustrzanego do mojej własnej mapy bitowej. Następnie kompresuję obszar ekranu jako plik PNG i wysyłam go z serwera do mojego klienta. Wszystko wygląda całkiem nieźle, ale nie jest wystarczająco szybkie. Jest tak samo wolny jak VNC (przy okazji, nie używam protokołu VNC, tylko niestandardowy protokół amatorski).
Od najwolniejszego oprogramowania do zdalnego pulpitu do najszybszego, lista zwykle zaczyna się we wszystkich implementacjach podobnych do VNC, następnie pnie się do Microsoft Windows Remote Desktop… a potem… TeamViewer. Nie jestem pewien co do CrossLoop, LogMeIn - nie korzystałem z nich, ale TeamViewer jest niesamowicie szybki. Dosłownie na żywo. Uruchomiłem tree
polecenie w wierszu polecenia i zaktualizowałem je z opóźnieniem 20 ms. Mogę przeglądać Internet o kilka milisekund wolniej niż na moim laptopie. Przewijanie kodu w pionie w programie Visual Studio ma 50 ms opóźnienia. Pomyśl o tym, jak solidne musi być rozwiązanie do przenoszenia ekranu TeamViewer, aby to wszystko osiągnąć.
VNC używają haków opartych na ankietach do wykrywania zmian ekranu i przechwytywania / porównywania ekranu brutalnej siły w najgorszym przypadku. W najlepszym przypadku używają sterownika lustrzanego, takiego jak DFMirage. Jestem na tym poziomie. I używają czegoś, co nazywa się protokołem RFB.
Pulpit zdalny Microsoft Windows najwyraźniej idzie o krok wyżej niż VNC. Słyszałem gdzieś na StackOverflow, że Pulpit zdalny systemu Windows nie wysyła bitmap ekranu, ale rzeczywiste polecenia rysowania. To całkiem genialne, ponieważ może po prostu wysłać prosty tekst (narysuj ten prostokąt na tej współrzędnej i pokoloruj go tym gradientem)! Pulpit zdalny jest naprawdę 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 jest wersją 7 od lutego 2012). Ludzie to przeczytali i powiedzieli, że wersja 2 jest bezużyteczna - to tylko kilka ulepszeń w stosunku do VNC z automatycznym przechodzeniem NAT.
Ale wersja 7 ... jest teraz absurdalnie szybka. To znaczy, jest faktycznie szybszy niż Pulpit zdalny systemu Windows. Strumieniowałem gry DirectX 3D z TeamViewer (przy 1 fps, ale Pulpit zdalny Windows nie pozwala nawet na uruchomienie DirectX).
Nawiasem mówiąc, TeamViewer robi to wszystko bez sterownika lustrzanego. Istnieje opcja zainstalowania jednego i robi się to trochę szybciej.
Pytanie
Moje pytanie brzmi: w jaki sposób 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 6220800 bajtów surowych. Nawet użycie libjpeg-turbo (jednej z najszybszych bibliotek kompresji JPG używanych przez duże korporacje), skompresowanie jej do 30 KB (bądźmy niezwykle hojni), zajęłoby trochę czasu, aby przejść przez serwery TeamViewer (TeamViewer omija korporacyjne Symmetric NAT, po prostu przekazując ruch przez ich serwery). Kompresja libjpeg-turbo zajęłaby trochę czasu. Wysokiej jakości kompresja JPG zajmuje dla mnie 175 milisekund dla pełnego zrzutu ekranu 1920 na 1080. Ta liczba rośnie, jeśli komputer hosta obsługuje procesor Atom. Po prostu nie rozumiem, w jaki sposób TeamViewer tak dobrze zoptymalizował przesyłanie ekranu. Obrazy o małym rozmiarze mogą być mocno skompresowane, ale kompresja zajmuje co najmniej kilkadziesiąt milisekund. Obrazy o dużym rozmiarze nie wymagają czasu na kompresję, ale przejście przez nie zajmuje dużo czasu. W jakiś sposób TeamViewer kończy cały proces, uzyskując około 20-25 klatek na sekundę. Użyłem monitora sieci, a TeamViewer nadal działa bez opóźnień przy prędkościach 500 Kb / s i 1 Mb / s (opóźnienie oprogramowania VNC przez kilka sekund przy tej szybkości transferu). Podczas mojegotree
Test wiersza polecenia, TeamViewer odbierał dane przychodzące z szybkością 1 Mb / si nadal działał 5-6 fps. VNC i zdalny pulpit tego nie robią. Więc jak?
Odpowiedzi będą nieco skomplikowane i zawiłe, więc nie wysyłaj swoich 0,02 USD, jeśli chcesz tylko powiedzieć, że to dlatego, że używają UDP zamiast TCP (czy uwierzyłbyś, że faktycznie używają TCP tak samo skutecznie).
Mam nadzieję, że gdzieś tutaj w StackOverflow jest programista TeamViewer.
Potencjalne odpowiedzi
Zaktualizuje to, gdy ludzie odpowiedzą.
- Przede wszystkim myślę, że TeamViewer ma bardzo dobrą kontrolę sieci. Na przykład dzielą duże pakiety do rozmiaru tuż poniżej MTU i nigdy nie marnują podróży. Prawdopodobnie mają różnego rodzaju fantazyjne zaczepy do wykrywania zmian na ekranie, a także niezwykle szybkie porównania obrazów XOR.