Извините за длину, это своего рода необходимо.
Введение
Я разрабатываю программное обеспечение для удаленного рабочего стола (просто для удовольствия) на C # 4.0 для Windows Vista / 7. Я преодолел основные препятствия: у меня есть надежная система обмена сообщениями UDP, относительно чистый дизайн программы, у меня запущен драйвер зеркала (бесплатный драйвер зеркала DFMirage от DemoForge), и я реализовал обход NAT для всех Типы NAT, кроме симметричных NAT (присутствующих в ситуациях корпоративного брандмауэра).
Что касается передачи / совместного использования экрана, благодаря драйверу зеркала я автоматически уведомляюсь об измененных областях экрана и могу просто перенаправить постоянно меняющееся изображение экрана драйвера зеркала в мое собственное изображение. Затем я сжимаю область экрана в формате PNG и отправляю ее с сервера моему клиенту. Все выглядит довольно хорошо, но это не достаточно быстро. Это так же медленно, как VNC (кстати, я не использую протокол VNC, просто пользовательский любительский протокол).
От самого медленного программного обеспечения для удаленного рабочего стола до самого быстрого, список обычно начинается со всех VNC-подобных реализаций, затем поднимается до Microsoft Windows Remote Desktop ... и затем ... TeamViewer. Не совсем уверен насчет CrossLoop, LogMeIn - я ими не пользовался, но TeamViewer работает безумно быстро. Это буквально в прямом эфире. Я запустил tree
команду в командной строке, и она обновилась с задержкой 20 мс. Я могу просматривать веб-страницы всего на несколько миллисекунд медленнее, чем на моем ноутбуке. Вертикальная прокрутка кода в Visual Studio имеет время задержки 50 мс. Подумайте о том, насколько надежным должно быть решение для передачи экрана TeamViewer, чтобы добиться всего этого.
VNC используют основанные на опросе хуки для обнаружения изменения экрана и захвата / сравнения экрана методом грубой силы в худшем случае. В своих лучших проявлениях они используют зеркальный драйвер, такой как DFMirage. Я на этом уровне. И они используют то, что называется протоколом RFB.
Удаленный рабочий стол Microsoft Windows, очевидно, идет на один шаг выше, чем 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.