Вибачте за довжину, це якось потрібно.
Вступ
Я розробляю програмне забезпечення для віддаленого робочого столу (просто для розваги) в C # 4.0 для Windows Vista / 7. Я пережив основні перешкоди: у мене надійна система обміну повідомленнями UDP, відносно чистий дизайн програми, у мене працює і працює драйвер дзеркал (безкоштовний драйвер дзеркала DFMirage від DemoForge), і я реалізував NAT-траверсал для всіх Типи NAT, крім симетричних NAT (присутні у корпоративних брандмауерах).
Що стосується передачі / спільного використання екрана, завдяки драйверу дзеркала я автоматично отримую сповіщення про змінені області екрана, і я можу просто змінити біт-карту екрана драйвера, що постійно змінюється, на мою власну растрову карту. Потім я стискаю область екрана як PNG і відсилаю його з сервера своєму клієнту. Речі виглядають досить добре, але це не досить швидко. Це так само повільно, як VNC (btw, я не використовую протокол VNC, а лише користувацький аматорський протокол).
Від найповільнішого програмного забезпечення віддаленого робочого столу до найшвидшого, список зазвичай починається з усіх VNC-подібних реалізацій, потім піднімається до Microsoft Windows Remote Desktop ..., а потім ... TeamViewer. Не зовсім впевнений у CrossLoop, LogMeIn - я не користувався ними, але TeamViewer шалено швидко. Це буквально в прямому ефірі. Я запустив tree
команду в командному рядку, і вона оновилася із затримкою 20 мс. Я можу переглядати Інтернет лише на кілька мілісекунд повільніше, ніж на своєму ноутбуці. Код вертикально прокрутки у Visual Studio має затримку 50 мс. Подумайте, наскільки надійним рішенням для передачі екрана TeamViewer повинно бути все це.
VNC використовують гачки на основі опитування для виявлення зміни екрана та захоплення / порівняння екрана грубої сили в найгіршому випадку. У кращому випадку вони використовують драйвер дзеркал, як DFMirage. Я на цьому рівні. І вони використовують щось, що називається протоколом RFB.
Microsoft Windows Remote Desktop, мабуть, на крок вище, ніж VNC. Я почув звідкись із StackOverflow, що Windows Remote Desktop не надсилає растрові екрани, а фактичні команди малювання. Це досить геніально, тому що він може просто надіслати простий текст (намалюйте цей прямокутник за цією координатою та пофарбуйте його за допомогою цього градієнта)! Віддалений робочий стіл дійсно досить швидкий - і це стандартний спосіб роботи від дому. І він використовує щось, що називається протоколом RDP.
Зараз TeamViewer для мене повна загадка. Мабуть, вони випустили свій вихідний код для версії 2 (TeamViewer - версія 7 станом на лютий 2012 року). Люди прочитали його і сказали, що Версія 2 марна - що це лише кілька вдосконалень над VNC з автоматичним NAT-траверсією.
Але версія 7 ... зараз це смішно швидко. Я маю на увазі, це насправді швидше, ніж Windows Remote Desktop. Я передавав DirectX 3D-ігри за допомогою TeamViewer (на 1 кадрі в секунду, але Windows Remote Desktop навіть не дозволяє запускати DirectX).
До речі, TeamViewer все це робить без драйвера дзеркала. Є можливість встановити його, і він стає лише трохи швидше.
Питання
Моє запитання: наскільки TeamViewer настільки швидкий?Це не повинно бути можливим. Якщо у вас є роздільна здатність 1920 на 1080 навіть на 24-бітній глибині (16-ти бітова глибина буде помітно некрасивою), це ще 6,220,800 байтів. Навіть використовуючи libjpeg-turbo (одну з найшвидших бібліотек стиснення JPG, яку використовують великі корпорації), стискаючи її до 30 КБ (давайте будемо надзвичайно щедрою), знадобиться час, щоб пройти маршрутизацію через сервери TeamViewer (TeamViewer обходить корпоративні симетричні NAT, просто наближаючись до трафіку через їхні сервери). А для стиснення libjpeg-turbo потрібен час для стиснення. Високоякісне стиснення JPG займає 175 мілісекунд для повного скріншоту 1920 на 1080. І це число збільшується, якщо на комп'ютері хоста працює процесор Atom. Я просто не розумію, як TeamViewer так добре оптимізував їхню передачу екрана. Знову ж, зображення невеликого розміру можуть бути сильно стислі, але знадобиться принаймні десятки мілісекунд для стиснення. Знімки великого розміру не потребують часу для стискання, але потрібно пройти довгий час. Так чи інакше, TeamViewer завершує весь цей процес, щоб отримати приблизно 20-25 кадрів в секунду. Я використовував мережевий монітор, і TeamViewer як і раніше не відстає зі швидкістю 500 Кбіт / с та 1 Мбіт / с (програмне забезпечення VNC на кілька секунд затримується при цій швидкості передачі). Під час могоtree
Тест командного рядка TeamViewer отримував вхідні дані зі швидкістю 1 Мбіт / с і все ще працює 5-6 кадрів в секунду. VNC та віддалений робочий стіл цього не роблять. Так як?
Відповіді будуть дещо складними і хитромудрими, тому, будь ласка, не публікуйте свої $ 0,02, якщо ви лише збираєтесь сказати, що це тому, що вони використовують UDP замість TCP (чи вважаєте ви, що вони насправді так само успішно використовують TCP).
Я сподіваюся, що десь тут, на StackOverflow, є розробник TeamViewer.
Потенційні відповіді
Буде оновлено, як тільки люди відповідуть.
- Думаю, насамперед, що TeamViewer має дуже тонкий мережевий контроль. Наприклад, вони розбивають великі пакети майже під MTU і ніколи не витрачають поїздку. У них, ймовірно, є всілякі фантазійні гачки для виявлення змін екрану разом із надзвичайно швидкими порівняннями XOR.