本文說明終端機伺服器的初始化程式,並說明當用戶連線到伺服器並執行應用程式時會發生什麼事。
原始 KB 編號: 186572
Windows 終端機 伺服器初始化
當 Windows 終端機 伺服器開機並載入核心作業系統時,終端機伺服器服務 (Termsrv.exe) 會啟動並建立接聽堆棧(每個通訊協定和傳輸配對一個),以接聽傳入連線。 每個連線都會獲得唯一的會話標識碼或 「SessionID」,以代表終端機伺服器的個別會話。 會話內建立的每個進程都會使用相關聯的 SessionID 來「標記」,以區分其命名空間與任何其他連線的命名空間。
控制台(終端機伺服器鍵盤、滑鼠和視訊)會話一律是第一個要載入的會話,並被視為特殊案例用戶端連線並指派的 SessionID。 控制台會話會以一般 Windows NT 系統會話的形式啟動,並載入已設定的 Windows NT 顯示器、滑鼠和鍵盤驅動程式。
終端機伺服器服務接著會呼叫 Windows NT 工作階段管理員(Smss.exe),以建立等候用戶端連線的兩個閒置用戶端會話(預設 = 2) 閒置用戶端會話。 若要建立閑置會話,會話管理員會執行 Windows NT 型用戶端/伺服器運行時間子系統進程(Csrss.exe),並將新的 SessionID 指派給該程式。 CSRSS 程式也會叫用 Winlogon (Winlogon.exe) 進程,以及新相關聯 SessionID 底下的 Win32k.sys (Window Manager 和圖形裝置介面 - GDI) 核心模組。 修改過的 Windows NT 映射載入器會透過映像標頭中預先設定的位,將此Win32k.sys辨識為 SessionSpace 可載入的映像。 然後,如果尚未載入Win32k.sys,則會將映像的程式代碼部分重新放置到物理記憶體中,且具有來自該會話虛擬核心地址空間的指標。 根據設計,如果映像已存在於記憶體中,它一律會附加至先前載入的映像程式代碼(Win32k.sys)。 例如,從任何使用中的應用程式或會話。
接著,此映射的數據 (或非共用) 區段會從新建立的 SessionSpace 可分頁核心記憶體區段配置給新的工作階段。 不同於主控台工作階段,終端機伺服器用戶端會話會設定為載入顯示、鍵盤和滑鼠的個別驅動程式。
新的顯示驅動程式是遠端桌面通訊協定 (RDP) 顯示設備驅動器,Tsharedd.dll。 滑鼠和鍵盤驅動程式會透過多個實例堆疊管理員與堆棧通訊,termdd.sys。 Termdd.sys會將滑鼠和鍵盤活動的訊息傳送至 RDP 驅動程式,以及從 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 Metaframe 附加元件支援非 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) 演演算法覆寫。 終端機伺服器也包含緩衝區,可讓流程控制將螢幕重新整理傳遞至用戶端,而不是固定的 bitstream。 當客戶端的用戶互動很高時,緩衝區會排清大約每秒 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 由一個進程載入物理記憶體時(工作階段),則會標示為「寫入時複製」。 當新的進程 (Sessions) 也會叫用 Word 時,映射載入器只會將新的進程 (Sessions) 指向現有的複本,因為應用程式已經載入記憶體中。 當需要緩衝區和使用者特定數據時(例如,儲存至檔案),必要的頁面會複製到新的物理記憶體位置,並標示為個別程式(會話)的讀取/寫入。 VM 管理員會保護此記憶體空間免於其他進程。 不過,大部分的應用程式都是可共用的程序代碼,而且無論執行多少次,在物理記憶體中只會有一個程式代碼實例。
最好是在終端機伺服器環境中執行32位應用程式。雖然並非必要。 32 位應用程式 (Win32) 將允許共享程式代碼,並在多用戶會話中更有效率地執行。 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,並從會話註銷,則應用程式本身的程式碼會保留在記憶體中,直到最後一位使用者離開應用程式為止。