Пошаговое руководство по серверу терминалов: запуск, подключение и приложение

В этой статье описывается процесс инициализации сервера терминалов и описывается, что происходит при подключении пользователя к серверу и запуске приложения.

Применяется к: Windows Server 2012 R2
Исходный номер базы знаний: 186572

Инициализация сервера Терминал Windows

По мере загрузки и загрузки основной операционной системы сервером Терминал Windows запускается служба сервера терминалов (Termsrv.exe) и создает прослушивающие стеки (по одному на пару протокола и транспорта), которые прослушивают входящие подключения. Каждому подключению присваивается уникальный идентификатор сеанса или "SessionID" для представления отдельного сеанса на сервере терминалов. Каждый процесс, созданный в сеансе, помечается связанным идентификатором SessionID, чтобы отличать его пространство имен от пространства имен любого другого соединения.

Сеанс консоли (клавиатура сервера терминалов, мышь и видео) всегда загружается первым и обрабатывается как специальное клиентское подключение и назначается SessionID. Сеанс консоли начинается как обычный системный сеанс Windows NT с настроенными драйверами Windows NT дисплея, мыши и клавиатуры.

Затем служба сервера терминалов вызывает диспетчер сеансов Windows NT (Smss.exe) для создания двух (по умолчанию = 2) неактивных клиентских сеансов (после создания сеанса консоли), ожидающих клиентских подключений. Чтобы создать неактивные сеансы, диспетчер сеансов выполняет процесс подсистемы среды выполнения клиента или сервера на основе Windows NT (Csrss.exe), и ему назначается новый Идентификатор сеанса. Процесс CSRSS также вызовет процесс Winlogon (Winlogon.exe) и модуль ядра Win32k.sys (Windows Manager и интерфейс графического устройства — GDI) в новом связанном sessionID. Измененный загрузчик изображений Windows NT распознает этот Win32k.sys как загрузочный образ SessionSpace по предопределенной битовой кодировке в заголовке образа. Затем он переместит кодовую часть образа в физическую память с указателями из адресного пространства виртуального ядра для этого сеанса, если Win32k.sys еще не загружен. По умолчанию он всегда будет присоединяться к коду ранее загруженного образа (Win32k.sys), если он уже существует в памяти. Например, из любого активного приложения или сеанса.

Затем раздел данных (или не общий) этого образа будет выделен новому сеансу из только что созданного раздела памяти ядра SessionSpace с возможностью страницы. В отличие от сеанса консоли, сеансы клиента сервера терминалов настроены для загрузки отдельных драйверов для дисплея, клавиатуры и мыши.

Новый драйвер дисплея — драйвер устройства отображения протокола удаленного рабочего стола (RDP), Tsharedd.dll. Драйверы мыши и клавиатуры обмениваются данными в стек через диспетчер стека нескольких экземпляров, termdd.sys. Termdd.sys будет отправлять сообщения о действиях мыши и клавиатуры в драйвер RDP и из нее, Wdtshare.sys. Эти драйверы позволяют сеансу клиента RDP быть удаленным и интерактивным. Наконец, сервер терминалов также вызовет поток прослушивателя подключения для протокола RDP, который снова управляется диспетчером стека нескольких экземпляров (Termdd.sys), который прослушивает клиентские подключения RDP на номере TCP-порта 3389.

На этом этапе процесс CSRSS существует в своем собственном пространстве имен SessionID, с его данными, созданными для каждого процесса по мере необходимости. Все процессы, созданные из этого SessionID, будут автоматически выполняться в SessionSpace процесса CSRSS. Это предотвращает доступ к данным другого сеанса процессами с разными идентификаторами сеанса.

Подключение клиента

Клиент RDP можно установить и запустить в любом терминале под управлением Windows (на основе WinCE), Windows для рабочих групп 3.11 под управлением TCP/IP-32b или на платформе Microsoft Win32 API. Клиенты, не использующие Windows, поддерживаются надстройкой Citrix Metaframe. Исполняемый файл клиента RDP Windows для рабочих групп имеет размер около 70 КБ, использует рабочий набор размером 300 КБ и 100 КБ для отображения данных. Клиент на основе Win32 имеет размер около 130 КБ, использует рабочий набор 300 КБ и 100 КБ для отображения данных.

Клиент инициирует подключение к серверу терминалов через TCP-порт 3389. Поток прослушивателя RDP сервера терминалов обнаружит запрос сеанса и создаст новый экземпляр стека RDP для обработки нового запроса сеанса. Поток прослушивателя передаст входящий сеанс новому экземпляру стека RDP и продолжит прослушивать TCP-порт 3389 для дальнейших попыток подключения. Каждый стек RDP создается по мере подключения клиентских сеансов для обработки согласования сведений о конфигурации сеанса. Сначала необходимо установить уровень шифрования для сеанса. Сервер терминалов изначально поддерживает три уровня шифрования: низкий, средний и высокий.

При низком шифровании шифруются только пакеты, отправляемые клиентом на сервер терминалов. Это шифрование "только входные данные" предназначено для защиты ввода конфиденциальных данных, таких как пароль пользователя. Среднее шифрование шифрует исходящие пакеты от клиента так же, как низкоуровневые, но также шифрует все отображаемые пакеты, возвращаемые клиенту с сервера терминалов. Этот метод шифрования защищает конфиденциальные данные, так как они перемещаются по сети для отображения на удаленном экране. Как низкое, так и среднее шифрование использует алгоритм Microsoft-RC4 (измененный алгоритм RC4 с улучшенной производительностью) с 40-разрядным ключом. При высоком уровне шифрования пакеты шифруются в обоих направлениях, к клиенту и из клиента, но используется стандартный отраслевой алгоритм шифрования RC4, опять же с 40-разрядным ключом. Неэкспортная версия сервера терминалов Windows NT обеспечивает 128-разрядное шифрование высокого уровня RC4.

Между клиентом и сервером будет происходить обмен шрифтами, чтобы определить, какие стандартные системные шрифты установлены. Клиент уведомляет сервер терминалов обо всех установленных системных шрифтах, чтобы обеспечить более быструю отрисовку текста во время сеанса RDP. Когда сервер терминалов знает, какие шрифты есть у клиента, можно сэкономить пропускную способность сети, передав клиенту сжатые шрифты и символьные строки Юникода, а не более крупные растровые изображения.

По умолчанию все клиенты резервируют 1,5 МБ памяти для кэша растровых изображений, который используется для кэширования растровых карт, таких как значки, панели инструментов, курсоры и т. д., но не используется для хранения строк Юникода. Кэш настраивается (с помощью раздела реестра) и перезаписывается с помощью алгоритма LRU. Сервер терминалов также содержит буферы для включения управляемой потоком передачи обновлений экрана клиентам, а не константного битового потока. При высоком уровне взаимодействия с пользователем на клиенте буфер сбрасывается примерно 20 раз в секунду. Во время простоя или при отсутствии взаимодействия с пользователем буфер замедляется до 10 раз в секунду. Все эти номера можно настроить с помощью реестра.

После согласования сведений о сеансе экземпляр стека RDP сервера для этого подключения будет сопоставлен с существующим неактивным сеансом пользователя Win32k, и пользователю будет предложено Windows NT экран входа. Если настроен автоматический вход, зашифрованное имя пользователя и пароль будут переданы серверу терминалов, и вход продолжится. Если в настоящее время не существует неактивных сеансов Win32k, служба сервера терминалов вызовет диспетчер сеансов (SMSS), чтобы создать новое пространство пользователя для нового сеанса. Большая часть сеанса пользователя Win32k использует общий код и загружается заметно быстрее после загрузки одного экземпляра ранее.

После ввода пользователем имени пользователя и пароля пакеты отправляются в зашифрованном виде на сервер терминалов. Затем процесс Winlogon выполняет необходимую проверку подлинности учетной записи, чтобы убедиться, что у пользователя есть права на вход, и передает домен и имя пользователя в службу сервера терминалов, которая поддерживает список идентификаторов сеансов домена или имени пользователя. Если идентификатор сеанса уже связан с этим пользователем (например, существует отключенный сеанс), активный в данный момент стек сеансов присоединяется к старому сеансу. Затем удаляется временный сеанс Win32, используемый для первоначального входа. В противном случае подключение выполняется в обычном режиме, и служба сервера терминалов создает новое сопоставление sessionID домена и имени пользователя. Если по какой-либо причине для этого пользователя активно несколько сеансов, отобразится список сеансов, и пользователь решает, какой из них выбрать для повторного подключения.

Запуск приложения

После входа пользователя для пользователя отображается рабочий стол (или приложение, если он находится в режиме с одним приложением). Когда пользователь выбирает 32-разрядное приложение для запуска, команды мыши передаются на сервер терминалов, который запускает выбранное приложение в новом виртуальном пространстве памяти (2 ГБ приложения, 2 ГБ ядра). Все процессы на сервере терминалов будут совместно использовать код в режиме ядра и пользователя, где это возможно. Чтобы обеспечить совместное использование кода между процессами, диспетчер виртуальной памяти (ВМ) Windows NT использует защиту страницы копирования при записи. Если несколько процессов хотят считывать и записывать одно и то же содержимое памяти, диспетчер виртуальных машин назначает защиту страницы копирования при записи в регион памяти. Процессы (сеансы) будут использовать одно и то же содержимое памяти, пока не будет выполнена операция записи. В это время диспетчер виртуальной машины скопирует физический кадр страницы в другое расположение, обновит виртуальный адрес процесса, чтобы он указывал на новое расположение страницы, а затем помечает страницу как чтение и запись. Копирование при записи полезно и эффективно для приложений, работающих на сервере терминалов.

Когда приложение на основе Win32, например Microsoft Word, загружается в физическую память одним процессом (сеанс), оно помечается как копирование при записи. Когда новые процессы (сеансы) также вызывают Word, загрузчик образов просто указывает новым процессам (сеансам) на существующую копию, так как приложение уже загружено в память. Если требуются буферы и данные пользователя (например, сохранение в файл), необходимые страницы будут скопированы в новое расположение физической памяти и помечены как чтение и запись для отдельного процесса (сеанс). Диспетчер виртуальных машин защитит это пространство памяти от других процессов. Большая часть приложения, однако, является общим кодом и будет иметь только один экземпляр кода в физической памяти независимо от того, сколько раз он выполняется.

Предпочтительно (хотя и необязательно) запускать 32-разрядные приложения в среде сервера терминалов. 32-разрядные приложения (Win32) позволят совместно использовать код и более эффективно выполняться в сеансах с несколькими пользователями. Windows NT позволяет 16-разрядным приложениям (Win16) выполняться в среде Win32 путем создания виртуального компьютера на основе MS-DOS (VDM) для каждого приложения Win16. Все 16-разрядные выходные данные претворяются в вызовы Win32, которые выполняют необходимые действия. Так как приложения Win16 выполняются в собственных VDM, код нельзя совместно использовать между приложениями в нескольких сеансах. При переводе между вызовами Win16 и Win32 также используются системные ресурсы. Запуск приложений Win16 в среде сервера терминалов может потреблять в два раза больше ресурсов, чем аналогичное приложение на основе Win32.

Отключение сеанса и выход пользователя

Отключение сеанса

Если пользователь решит отключить сеанс, процессы и все пространство виртуальной памяти останутся и будут выключаться на физический диск, если для других процессов требуется физическая память. Так как сервер терминалов сохраняет сопоставление домена или имени пользователя и связанного с ним идентификатора сеанса, при повторном подключении одного и того же пользователя существующий сеанс будет загружен и снова станет доступным. Дополнительное преимущество RDP заключается в том, что он может изменять разрешение экрана сеанса в зависимости от того, что пользователь запрашивает для сеанса. Например, предположим, что пользователь ранее подключился к сеансу сервера терминалов с разрешением 800 x 600 и отключился. Если пользователь переместится на другой компьютер, поддерживающий только разрешение 640 x 480, и снова подключится к существующему сеансу, рабочий стол будет перерисован для поддержки нового разрешения.

Выход пользователя

Выход из системы обычно прост в реализации. После выхода пользователя из сеанса все процессы, связанные с SessionID, завершаются, а любая память, выделенная сеансу, освобождается. Если пользователь запускает 32-разрядное приложение, например Microsoft Word, и выходит из сеанса, код самого приложения останется в памяти до тех пор, пока последний пользователь не выйдет из приложения.