終端機伺服器逐步解說:啟動、連線和應用程式

本文說明終端機伺服器的初始化程式,並說明當用戶連線到伺服器並執行應用程式時,會發生什麼情況。

適用:Windows Server 2012 R2
原始 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) 進程,以及 Win32k.sys (視窗管理員和圖形裝置介面 - 新關聯 SessionID 底下的 GDI) 核心模組。 修改過 Windows NT 影像載入器會將此 Win32k.sys 辨識為可載入 SessionSpace 的影像,其位置是映像標頭中預先定義的位集。 然後,如果尚未載入 Win32k.sys,它會將映像的程式代碼部分重新放置到物理記憶體中,其中包含來自該會話之虛擬核心地址空間的指標。 根據設計,如果記憶體中已存在,它一律會附加至先前載入的影像程序代碼 (Win32k.sys) 。 例如,從任何作用中的應用程式或會話。

然後,此映射的數據 (或非共用) 區段會從新建立的 SessionSpace 可分頁核心記憶體區段配置給新的工作階段。 不同於主控台工作階段,終端機伺服器用戶端會話會設定為載入顯示器、鍵盤和滑鼠的個別驅動程式。

新的顯示驅動程式是遠端桌面通訊協定 (RDP) 顯示設備 Driver,Tsharedd.dll。 滑鼠和鍵盤驅動程式會透過多個實例堆疊管理員與堆棧通訊,termdd.sys。 Termdd.sys 會將滑鼠和鍵盤活動的訊息傳送至 RDP 驅動程式,Wdtshare.sys。 這些驅動程式可讓 RDP 用戶端會話遠端可用且互動式。 最後,終端機伺服器也會針對 RDP 通訊協定叫用連接接聽程式線程,再次由多個實例堆疊管理員 (Termdd.sys) 管理,其會接聽 TCP 連接埠號碼 3389 上的 RDP 用戶端連線。

此時,CSRSS 進程存在於它自己的 SessionID 命名空間下,並視需要針對每個進程具現化其數據。 從這個 SessionID 內建立的任何進程都會自動在 CSRSS 進程的 SessionSpace 內執行。 這可防止具有不同 SessionID 的進程存取另一個會話的數據。

用戶端連線

RDP 用戶端可以根據 WinCE) 、執行 TCP/IP-32b 的 Windows for Workgroups 3.11 或 Microsoft Win32 API 型平臺,在任何以 Windows 為基礎的終端機 (上安裝並執行。 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) 演演算法來覆寫。 終端機伺服器也包含緩衝區,可讓流量控制將螢幕重新整理傳遞給用戶端,而不是常數位流。 當用戶端上的用戶互動很高時,緩衝區大約每秒排清 20 次。 在空閒時間,或沒有用戶互動時,緩衝區會變慢到每秒僅排清 10 次。 您可以透過登錄來微調所有這些數位。

交涉會話詳細數據之後,此聯機的伺服器 RDP 堆疊實例會對應至現有的閑置 Win32k 使用者會話,系統會提示使用者輸入 Windows NT 登入畫面。 如果已設定自動登入,加密的使用者名稱和密碼將會傳遞至終端機伺服器,並繼續登入。 如果目前沒有任何閑置的 Win32k 工作階段存在,終端機伺服器服務會呼叫工作階段管理員 (SMSS) ,為新的工作階段建立新的用戶空間。 大部分的 Win32k 使用者工作階段都使用共享程式代碼,而且在先前載入一個實例之後,載入速度會明顯更快。

在使用者輸入使用者名稱和密碼之後,封包會以加密方式傳送至終端機伺服器。 然後,Winlogon 程式會執行必要的帳戶驗證,以確保使用者具有登入的許可權,並將使用者的網域和使用者名稱傳遞至終端機伺服器服務,以維護網域/用戶名稱 SessionID 清單。 例如,如果 SessionID 已經與此使用者相關聯 (,則會) 中斷連線的會話,則目前作用中的會話堆疊會附加至舊會話。 接著會刪除用於初始登入的暫時 Win32 工作階段。 否則,聯機會正常進行,而終端機伺服器服務會建立新的網域/用戶名稱 SessionID 對應。 如果基於某些原因,此使用者有多個會話處於作用中狀態,則會話清單隨即顯示,且使用者決定要選取哪一個會話以重新連線。

執行應用程式

使用者登入之後,如果在單一應用程式模式中,桌面 (或應用程式) 會顯示給使用者。 當使用者選取要執行的32位應用程式時,滑鼠命令會傳遞至終端機伺服器,這會將選取的應用程式啟動到新的虛擬記憶體空間 (2 GB 應用程式,2 GB 核心) 。 終端機伺服器上的所有進程都會盡可能以核心和使用者模式共用程序代碼。 為了在程式之間共用程式代碼,Windows NT 虛擬記憶體 (VM) 管理員會使用寫入時複製頁面保護。 當多個進程想要讀取和寫入相同的記憶體內容時,VM 管理員會將寫入時複製頁面保護指派給記憶體區域。 會話 (會話) 會使用相同的記憶體內容,直到執行寫入作業為止,此時 VM 管理員會將實體頁面框架複製到另一個位置、更新進程的虛擬位址以指向新的頁面位置,現在將頁面標示為讀取/寫入。 寫入時複製對於在終端機伺服器上執行的應用程式很有用且有效率。

當 Microsoft Word 等 Win32 型應用程式由工作階段) (一個進程載入實體記憶體時,它會標示為寫入時複製。 當新進程 (會話) 也會叫用 Word 時,映射載入器只會將新進程 (會話) 指向現有的複本,因為應用程式已載入記憶體中。 例如,當需要緩衝區和使用者特定數據 (儲存至檔案) 時,必要的頁面會複製到新的物理記憶體位置,並標示為會話) (個別進程的讀取/寫入。 VM 管理員會保護此記憶體空間不受其他進程的防護。 不過,大部分的應用程式都是可共用的程序代碼,而且不論執行多少次,在物理記憶體中都只會有單一程式代碼實例。

雖然不需要) 在終端機伺服器環境中執行32位應用程式,但最好 (。 Win32) (32 位應用程式將允許共享程式代碼,並在多用戶會話中更有效率地執行。 Windows NT 可讓 Win16) (16 位應用程式在 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,並從會話註銷,則應用程式本身的程式代碼會保留在記憶體中,直到最後一位使用者結束應用程式為止。