Почему TeamViewer так быстр?

Извините за длину, это вроде как необходимо.

Введение

Я разрабатываю программное обеспечение для удаленного рабочего стола (просто для удовольствия) на 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. Я транслировал 3D-игры DirectX с помощью TeamViewer (со скоростью 1 кадр / с, но Windows Remote Desktop даже не позволяет запускать DirectX).

Кстати, TeamViewer делает все это без драйвера зеркала. Есть возможность установить один, и он становится немного быстрее.

Вопрос

У меня вопрос: как TeamViewer работает так быстро? Это невозможно. Если у вас есть разрешение 1920 на 1080 при глубине даже 24 бита (глубина 16 бит была бы заметно уродливой), это все равно 6220800 байт.Даже использование 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.

Возможные ответы

Будет обновлено, когда люди ответят.

  1. Я, прежде всего, думаю, что TeamViewer очень хорошо управляет сетью. Например, они разделяют большие пакеты до размера чуть меньше MTU и никогда не тратят время на поездку. У них, вероятно, есть всевозможные причудливые ловушки для обнаружения изменений экрана, а также чрезвычайно быстрое сравнение изображений XOR.
155
задан Jason 29 February 2012 в 12:06
поделиться

1 ответ

Мое случайное предположение: телевизионное использование кодек x264 , который имеет коммерческую лицензию (иначе TeamViewer должен был бы выпустить их исходный код). В какой-то момент (больше чем 5 лет назад), я вспоминаю, что основной разработчик x264 написал статью об улучшениях, которые он сделал для низкого двухуровневого кодирования (если Вы задерживаетесь несколькими кодерами кадров, может сжаться лучше), плюс он упомянул некоторые другие улучшения, которые были важны для подобного TeamViewer использования. В том сообщении он упомянул, что играл землетрясение по видеопотоку без значимых проблем. Тогда я был довольно уверен, кто был спонсором этих улучшений, как TeamViewer был в значительной степени единственной опцией в то время. x264 является реализацией с открытым исходным кодом видеокодек H264 , и это - безумно хорошая реализация, это - лучшее. В то же время это чрезвычайно хорошо оптимизировано. Скорее всего, из-за чрезвычайно хорошей реализации x264 Вы получаете намного лучшие результаты с ТВ в более низкой загрузке ЦП. AnyDesk и Chrome Удаленное использование Стола libvpx, который не так хорош как x264 (оптимизация и мудрое качество видео).

Однако я не думаю, что TeamView может победить RDP Microsoft. Мне это является лучшим, однако это работает между окнами PC или от Mac до Windows только. ТВ работает даже с мобильных телефонов.

Обновление: статья была написана в январе 2010, так, чтобы работа была сделана примерно 10 лет назад. Кроме того, я сделал ошибку: он играл служебный долг, не землетрясение. При регистрации вопроса если мое предположение корректно, TeamViewer использовал ту работу в течение 3 лет. Считайте то сообщение в блоге из веб-архива: x264: лучшая платформа потоковой передачи видео низкой задержки в мире . Когда я прочитал статью назад в 2010, я был уверен, что "startup†“то, которое запросило не быть названным", который упоминает автор, было TeamViewer.

0
ответ дан 23 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: