终端服务器演练:启动、连接和应用程序

本文介绍终端服务器的初始化过程,并介绍了当用户连接到服务器并运行应用程序时发生的情况。

适用于: Windows Server 2012 R2
原始 KB 编号: 186572

Windows 终端服务器初始化

当Windows 终端服务器启动并加载核心操作系统时,终端服务器服务 (Termsrv.exe) 将启动并创建侦听堆栈, (每个协议和侦听传入连接的传输对) 一个。 每个连接都有一个唯一的会话标识符或“SessionID”来表示与终端服务器的单个会话。 会话中创建的每个进程都使用关联的 SessionID 进行“标记”,以区分其命名空间与任何其他连接的命名空间。

(终端服务器键盘、鼠标和视频) 会话的控制台始终是第一个加载的主机,并被视为特殊情况客户端连接并分配有 SessionID。 控制台会话作为普通Windows NT系统会话启动,并加载了配置的Windows NT显示器、鼠标和键盘驱动程序。

然后,终端服务器服务调用Windows NT会话管理器 (Smss.exe) ,以在创建等待客户端连接的控制台会话) 后, (创建两个 (默认值为 2) 空闲客户端会话。 若要创建空闲会话,会话管理器 (Csrss.exe) 执行基于Windows NT的客户端/服务器运行时子系统进程,并将新的 SessionID 分配给该进程。 CSRSS 进程还将在新关联的 SessionID 下调用 Winlogon (Winlogon.exe) 进程和 Win32k.sys (窗口管理器和图形设备接口 - 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) 进行管理,该管理器侦听 TCP 端口号 3389 上的 RDP 客户端连接。

此时,CSRSS 进程存在于其自己的 SessionID 命名空间下,其数据根据需要按进程实例化。 从此 SessionID 中创建的任何进程都将在 CSRSS 进程的 SessionSpace 中自动执行。 这可以防止具有不同 SessionID 的进程访问另一个会话的数据。

客户端连接

RDP 客户端可以在任何基于 Windows 的终端上安装和运行, (基于 WinCE) 、运行 TCP/IP-32b 的 Windows for Workgroups 3.11 或基于 Microsoft Win32 API 的平台。 Citrix 元帧加载项支持非基于 Windows 的客户端。 Windows for Workgroups RDP 客户端的可执行文件大小约为 70 KB,使用 300 KB 的工作集,并使用 100 KB 的显示数据。 基于 Win32 的客户端大小约为 130 KB,使用 300 KB 的工作集和 100 KB 的显示数据。

客户端将通过 TCP 端口 3389 启动与终端服务器的连接。 终端服务器 RDP 侦听器线程将检测会话请求,并创建新的 RDP 堆栈实例来处理新的会话请求。 侦听器线程会将传入会话移交给新的 RDP 堆栈实例,并继续侦听 TCP 端口 3389 以进一步尝试连接。 每个 RDP 堆栈都是在客户端会话连接以处理会话配置详细信息的协商时创建的。 第一个详细信息将为会话建立加密级别。 终端服务器最初将支持三个加密级别:低、中和高。

低加密将仅加密从客户端发送到终端服务器的数据包。 这种“仅输入”加密旨在保护敏感数据(例如用户密码)的输入。 中等加密将加密来自客户端的传出数据包与低级别加密相同,但也会加密从终端服务器返回到客户端的所有显示数据包。 这种加密方法保护敏感数据,因为它通过网络传输以显示在远程屏幕上。 低加密和中等加密都使用 Microsoft-RC4 算法 (修改的 RC4 算法,) 具有 40 位密钥的性能改进。 高加密将双向加密客户端和来自客户端的数据包,但会再次使用行业标准 RC4 加密算法和 40 位密钥。 Windows NT终端服务器的非导出版本将提供 128 位高级 RC4 加密。

客户端和服务器之间将发生字体交换,以确定安装了哪些常见系统字体。 客户端将通知终端服务器所有已安装的系统字体,以便在 RDP 会话期间更快地呈现文本。 当终端服务器知道客户端可用的字体时,可以通过将压缩字体和 Unicode 字符串(而不是较大的位图)传递给客户端来节省网络带宽。

默认情况下,所有客户端都为用于缓存位图(如图标、工具栏、游标等)的位图缓存保留 1.5 MB 内存,但不用于保存 Unicode 字符串。 缓存可以通过注册表项) (,并使用最近使用最少 (LRU) 算法进行覆盖。 终端服务器还包含缓冲区,用于启用流控制将屏幕刷新传递到客户端,而不是常量位流。 当客户端上的用户交互较高时,缓冲区大约每秒刷新 20 次。 在空闲时间或没有用户交互时,缓冲区会减慢到每秒仅刷新 10 次。 可以通过注册表优化所有这些数字。

协商会话详细信息后,此连接的服务器 RDP 堆栈实例将映射到现有的空闲 Win32k 用户会话,并且系统会提示用户Windows NT登录屏幕。 如果配置了自动登录,则加密的用户名和密码将传递给终端服务器,登录将继续。 如果当前不存在空闲 Win32k 会话,终端服务器服务将调用会话管理器 (SMSS) ,为新会话创建新的用户空间。 Win32k 用户会话的大部分都在利用共享代码,在以前加载一个实例后,加载速度会明显加快。

用户键入用户名和密码后,数据包将加密发送到终端服务器。 然后,Winlogon 进程执行必要的帐户身份验证,以确保用户具有登录权限,并将用户的域和用户名传递给终端服务器服务,该服务维护域/用户名 SessionID 列表。 例如,如果 SessionID 已与此用户关联 () 存在断开连接的会话,则当前活动的会话堆栈将附加到旧会话。 然后,将删除用于初始登录的临时 Win32 会话。 否则,连接将正常进行,终端服务器服务会创建新的域/用户名 SessionID 映射。 如果出于某种原因,此用户有多个会话处于活动状态,则会显示会话列表,并且用户决定选择哪个会话进行重新连接。

运行应用程序

用户登录后,如果处于单应用程序模式,则桌面 (或应用程序) 为用户显示。 当用户选择要运行的 32 位应用程序时,鼠标命令将传递给终端服务器,该终端服务器将所选应用程序启动到新的虚拟内存空间 (2 GB 应用程序、2 GB 内核) 。 终端服务器上的所有进程都将尽可能以内核和用户模式共享代码。 为了实现进程之间的代码共享,Windows NT虚拟内存 (VM) 管理器使用写入时复制页保护。 当多个进程想要读取和写入相同的内存内容时,VM 管理器将向内存区域分配写入时复制页保护。 (会话) 的进程将使用相同的内存内容,直到执行写入操作,此时 VM 管理器会将物理页帧复制到另一个位置,更新进程的虚拟地址以指向新的页面位置,现在将该页标记为可读/写。 写入时复制对于在终端服务器上运行的应用程序非常有用且高效。

当基于 Win32 的应用程序(如 Microsoft Word)由会话) (进程加载到物理内存中时,它将标记为写入时复制。 当新进程 (会话) 也调用Word时,映像加载程序只会将新进程 (会话) 指向现有副本,因为应用程序已加载到内存中。 例如,当需要缓冲区和用户特定的数据 (保存到文件) 时,必要的页将复制到新的物理内存位置,并将单个进程标记为可读/写 (会话) 。 VM 管理器将保护此内存空间免受其他进程的限制。 但是,大多数应用程序都是可共享代码,无论运行多少次,物理内存中只有一个代码实例。

在终端服务器环境中运行 32 位应用程序不需要) ,但最好 (。 Win32) (32 位应用程序将允许共享代码,并在多用户会话中更高效地运行。 Windows NT允许 16 位应用程序 (Win16) 在 Win32 环境中运行,方法是为每个 Win16 应用程序创建基于 MS-DOS 的虚拟计算机 (VDM) 。 所有 16 位输出都转换为 Win32 调用,后者执行必要的操作。 由于 Win16 应用在其自己的 VDM 中执行,因此无法在多个会话中的应用程序之间共享代码。 Win16 和 Win32 调用之间的转换也会消耗系统资源。 在终端服务器环境中运行 Win16 应用程序可能会消耗比基于 Win32 的类似应用程序消耗的两倍资源。

会话断开连接和用户注销

会话断开连接

如果用户决定断开会话的连接,如果其他进程需要物理内存,进程和所有虚拟内存空间将保留并分页到物理磁盘。 由于终端服务器保留域/用户名及其关联的 SessionID 的映射,因此当同一用户重新连接时,现有会话将加载并再次可用。 RDP 的另一个好处是,它能够根据用户请求会话的内容更改会话屏幕分辨率。 例如,假设用户以前以 800 x 600 分辨率连接到终端服务器会话,但已断开连接。 如果用户随后移动到仅支持 640 x 480 分辨率的其他计算机,并重新连接到现有会话,则将重绘桌面以支持新的分辨率。

用户注销

注销通常易于实现。 用户从会话注销后,与 SessionID 关联的所有进程将终止,并释放分配给会话的所有内存。 如果用户正在运行 32 位应用程序(如 Microsoft Word),并从会话中注销,则应用程序本身的代码将保留在内存中,直到最后一个用户从应用程序退出。