Поделиться через


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

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

Исходный номер базы знаний: 186572

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

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

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

Затем служба сервера терминалов вызывает диспетчер сеансов Windows NT (Smss.exe), чтобы создать два (по умолчанию = 2) бездействующие клиентские сеансы (после создания сеанса консоли), ожидающие клиентских подключений. Чтобы создать сеансы бездействия, диспетчер сеансов выполняет процесс подсистемы среды выполнения клиента или сервера на основе Windows NT (Csrss.exe), а новый идентификатор сеанса назначается данному процессу. Процесс CSRSS также вызовет процесс Winlogon (Winlogon.exe) и модуль ядра Win32k.sys (Window Manager и графический интерфейс устройства — GDI) в новом связанном сеансе. Измененный загрузчик образов 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, при этом данные создаются для каждого процесса по мере необходимости. Все процессы, созданные из этого сеанса, будут выполняться в пространстве сеансов процесса CSRSS автоматически. Это предотвращает доступ к данным другого сеанса с разными идентификаторами сеансов.

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

Клиент RDP можно установить и запустить на любом терминале под управлением Windows (на основе WinCE), Windows for Workgroups 3.11 под управлением TCP/IP-32b или платформы API Microsoft Win32. Клиенты, отличные от 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 Terminal Server обеспечивает 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 выполняются в пределах собственной виртуальной виртуальной машины, код нельзя совместно использовать между приложениями в нескольких сеансах. Перевод между вызовами Win16 и Win32 также использует системные ресурсы. Выполнение приложений Win16 в среде сервера терминалов может использовать два раза больше ресурсов, чем аналогичное приложение на основе Win32.

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

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

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

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

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