Введение

x11vnc – это серверная программа для Виртуальной Сети Вычислений (VNC). Она обеспечивает удалённый доступ от клиентского компьютера к компьютеру, на котором запущена сессия X Window и установлено программное обеспечение x11vnc, непрерывно опрашивая буфер кадра X-сервера на предмет изменений. Это позволяет пользователю управлять своим окружением X11 (KDE, GNOME, Xfce и т.д.) с удалённого компьютера, находящегося как в локальной сети, так и через Интернет, как если бы пользователь работал непосредственно за этим компьютером. x11vnc также может опрашивать устройства, не связанные с X11, такие как веб-камеры, ТВ-тюнеры, iPAQ, Neuros OSD, консоль Linux и графический дисплей Mac OS X. x11vnc является частью проекта LibVNCServer. x11vnc обладает функциями безопасности, позволяющими пользователю установить пароль доступа или использовать имена пользователей и пароли Unix. Также предусмотрены опции для подключения по защищённому SSL-соединению.

Алгоритм голосования

x11vnc хранит копию буфера кадра X-сервера в оперативной памяти. Программный интерфейс X11 XShmGetImage используется для получения данных пикселей буфера кадра. x11vnc сравнивает буфер кадра X-сервера со своей копией, чтобы определить, какие области пикселей изменились (и, следовательно, должны быть отправлены VNC-клиентам). Чтение данных пикселей из физического буфера кадра может быть значительно медленнее, чем запись в него (поскольку графические устройства не оптимизированы для чтения), поэтому последовательная проверка пикселей может быть слишком медленной. Для повышения производительности x11vnc считывает полные строки пикселей, разделенные вертикальным интервалом в 32 пикселя. Достигнув нижней части экрана, он начинает снова у верхней части с немного измененным смещением. После 32 таких проходов весь экран будет обработан. Этот метод позволяет x11vnc обнаруживать изменения на экране примерно в 32 раза быстрее, чем при последовательной проверке (если изменения очень незначительны, например, высотой всего в 1 пиксель). Если присутствует расширение X11 DAMAGE, x11vnc использует его для получения подсказок о том, на какие области сосредоточить опрос, что позволяет быстрее находить изменения и снижать нагрузку на систему.

Вводные инъекции

Когда x11vnc получает события пользовательского ввода (нажатия клавиш, перемещения указателя и нажатия кнопок мыши) от VNC-клиента, он должен синтетически внедрять их в X-сервер. Для этого используются программные интерфейсы XTestFakeKeyEvent, XTestFakeMotionEvent и XTestFakeButtonEvent расширения XTEST. Для устройств, не управляемых X11 (например, графический дисплей Mac OS X), необходимо использовать другие программные интерфейсы. x11vnc также предоставляет интерфейс, позволяющий пользователю использовать собственную программу для внедрения ввода.

Интересные применения

Часто специальные системы создаются с использованием X Window System для управления графическим отображением. x11vnc можно использовать для экспорта дисплея системы для удаленного VNC-доступа. Это обеспечивает удаленный мониторинг, управление и устранение неполадок специальной системы. Иногда это позволяет избежать отправки техника на удаленный объект или дает пользователям возможность управлять оборудованием со своего рабочего места или ноутбука. Известно, что x11vnc использовался на следующих типах систем: электронные микроскопы, системы анализа изображений МРТ и радиологии, консоли управления электростанциями и нефтедобывающими платформами, системы контроля распределения материалов, стенды для испытаний систем самообороны судов, ЯМР-системы, микроскопы для анализа кремниевых пластин и системы управления освещением в театрах и на концертах. x11vnc используется для экспорта дисплеев X11 во встроенных системах, таких как КПК на базе Linux и домашние кинотеатры. Если x11vnc невозможно запустить на специальной системе, его иногда можно запустить на ближайшем компьютере и опрашивать буфер кадра X-сервера по сети. Таким образом можно получить доступ к проприетарным X-терминалам через x11vnc.

Эмуляция Xvnc

Хотя x11vnc в основном используется для X-серверов, связанных с физическим графическим оборудованием, он также может подключаться к виртуальным X-серверам (у которых буферы кадров существуют только в оперативной памяти), таким как Xvfb или сеанс Sun Ray. x11vnc имеет опции (create и svc) для автоматического запуска Xvfb, возможно, от имени пользователя Unix, вошедшего в систему. Интерактивная работа с x11vnc и Xvfb может быть не такой быстрой, как с Xvnc, однако этот режим обеспечивает функции, недоступные в Xvnc, такие как SSL-шифрование и аутентификация пользователей Unix по имени и паролю.

Кэширование на стороне клиента

Протокол RFB (VNC) отличается от других сетевых графических протоколов, таких как X11 и RDP, тем, что в нем не предусмотрено кэширование пиксельных данных на стороне клиента. Хотя это упрощает реализацию клиентской части, это сказывается на скорости интерактивного отклика. Например, при каждой перерисовке окна или фоновой области необходимо повторно отправлять по сети (сжатые) пиксельные данные. Этот эффект особенно заметен для окон со сложным содержимым или фотографиями (например, окна веб-браузера), которые часто сворачиваются и разворачиваются или перерисовываются. x11vnc имеет экспериментальную и несколько грубую реализацию кэширования на стороне клиента. Она включается с помощью опции ncache. При создании RFB-буфера кадров в этом режиме x11vnc выделяет большую вспомогательную область памяти под верхней частью, используемой для фактических (отображаемых на экране) пиксельных данных. Затем x11vnc может использовать команду RFB CopyRect, чтобы указать клиенту перемещать прямоугольники пиксельных данных в эту вспомогательную область и из нее. Эти перемещения выполняются локально, на стороне клиента. Таким образом, x11vnc может управлять вспомогательной областью для хранения и извлечения пиксельных данных, не отправляя их повторно по сети. Режим кэширования на стороне клиента x11vnc может значительно повысить скорость интерактивного отклика для многих задач. Поскольку он использует существующую команду RFB CopyRect, эта схема будет работать с любым (т.е. немодифицированным) VNC-клиентом. Однако есть и недостатки. Первый заключается в том, что требуется большой объем памяти. Для хорошей производительности вспомогательная область должна быть в 10–20 раз больше, чем фактический размер экрана. Таким образом, вместо 5 МБ для буфера фрейм-кадра truecolor 1280x1024 потребуется около 100 МБ (как на стороне VNC-клиента, так и на стороне сервера). Это не является серьезной проблемой на современных компьютерах, но было бы невозможно на устройствах с небольшим объемом памяти. Во-вторых, VNC-клиент может обрабатывать вспомогательную область таким образом, что это может запутать пользователя, например, отображая ее или автоматически прокручивая вниз, если курсор мыши достиг нижней границы экрана. VNC-клиент Unix в SSVNC автоматически скрывает вспомогательную область. Наконец, эвристики x11vnc для кэширования и повторного использования пиксельных данных окна не идеальны и могут приводить к неожиданному мерцанию содержимого окна и другим нежелательным эффектам.