RDP協議之USB重定向虛擬通道
在RDP遠程桌面協議中,USB設備虛擬通道擴展協議用於將USB數據包從終端服務器傳輸到終端客戶端。終端客戶端將USB數據包轉發到物理USB設備。然後客戶端在物理設備重新組裝數據包後返回結果。
一般來說,遠程訪問的協議可以重定向USB設備,所以在使用和過程中,必須為客戶端提供一種方式來指定使用該協議重定向的USB設備,或者選擇使用替代方法的設備或者完全不重定向的設備。因為當設備被重定向時,它就不能在客戶端上繼續使用。例如:
USB鼠標:如果使用此協議進行USB鼠標重定向,那麽在客戶端本地將無法使用鼠標。這種結果實用與虛擬桌面全屏使用的場景,但是在傳統的RDP服務中,我們的客戶端和服務器端都需要同時復用我們的鼠標設備,因此,RDP協議的USB虛擬通道如何解決這個問題?
面對這個問題,我們不從RDP協議USB虛擬通道本身的實現上去思考,而是以我們自身先思考如何來解決這個問題為前提。那麽解決辦法有兩種途徑:
1、使用免驅動的鼠標;
2、客戶端使用兩個鼠標。
第一個方案似乎很好,但是有限制條件,那就不完美了;第二個條件就純粹是一種反人類的方案,直接pass。我們發現似乎只有在協議上做優化,才能夠完美兼容當前的使用習慣和操作體驗。
這就涉及到RDP協議的USB虛擬通道采用什麽完美機制來實現上述的需求了。針對這個問題,我們來了解RDP協議的USB虛擬通道是如何工作的?以解我們上述的疑問吧!
首先我們需要先講幾個概念:
1、設備驅動程序:系統用來與設備(如顯示器、打印機、鼠標或通信適配器)通信的軟件。其是一個抽象層,用於控制應用程序訪問給定計算機系統上的各種硬件設備。我們通常將其簡稱為“驅動”。那麽驅動是如何和硬件進行通信的?這個就涉及到每個硬件的寄存器了。我之前寫過一篇介紹應用程序如何通過驅動去實現和硬件的交互,裏面介紹了這方面的內容,包括驅動如何去找到硬件的寄存器地址以及如何與寄存器進行交互。
2、設備接口:一種統一且可擴展的機制,可以與應用程序和系統以編程方式進行交互。設備驅動程序可以為特定設備提供一個或多個設備接口。設備接口由GUID(全球唯一標識符)表示。
3、遠程設備:連接到遠程(或客戶端)機器的設備。
4、終端客戶端:終端服務器的客戶端。在客戶機上運行的終端客戶機程序。在Windows中,RDP只是一個協議,實現我們可以訪問服務器桌面並顯示圖像,為這個協議提供顯示資源和交互資源是名叫終端服務,在高版本中改為遠程桌面服務。
5、終端服務器:運行終端服務的服務器。
就上述問題而言,RDP協議的USB虛擬通道使用了比較靈活的設計來保證使用的靈活性,首先將需要重定向那些USB設備的決定權交給了用戶,由用戶來給予明確的答案。
執行這些規則和策略,我們在Windows的終端客戶端上就可見一斑,這就是用於選擇正確設備的用戶界面,而這些都只是常見的設備,比較全的執行此類規定的還是和Windows的其他服務相集成:組策略、註冊表、通知等。因此和其他協議類似,靈活性選擇重定向的設備是這個設計的滿足當前的使用習慣和操作體驗比較完美的一種解決方案。
其次,針對USB鼠標復用的問題,在協議上解決我想RDP的USB虛擬通道和其他協議並無區別,都是基於“會話”和“焦點”的判斷來自動對USB鼠標進行切換,已達到復用USB鼠標的目的。會話應該很好理解,啟動一個遠程桌面連接就是一個會話,會話的屬性就包括用戶、連接密碼、連接地址等等。而焦點,則是判斷用戶當前的桌面是位於本地客戶端還是遠程桌面。
下面我們具體來介紹RDP協議的USB虛擬通道是如何工作的。
在USB虛擬通道的實現中,終端客戶端的USB硬件設備需要重定向到終端服務器上,那麽首先需要終端客戶端和硬件USB設備進行連接,然後將設備通過RDP協議客戶端重定向到終端服務器上。終端服務器要識別硬件USB設備,就必須在服務器上安裝設備驅動程序。
下圖描述了USB設備和服務器上的USB驅動程序堆棧有關的事件序列。
圖1:USB堆棧流
當插入USB設備時,客戶端向服務器發送添加虛擬通道消息。作為響應,服務器發送也發送一個相同的虛擬通道創建消息給到客戶端,並等待來自客戶端的相同消息。客戶端發送虛擬通道創建消息後,客戶端立即發送添加設備消息,待雙方都創建虛擬通道完畢後互相發送消息確認完畢,服務器立即開始創建一個USB驅動程序堆棧,驅動程序將向系統表示該USB設備的存在。此後,服務器和客戶端就可以準備交換I / O數據包了。
當設備從客戶端拔出時,協議就會關閉服務器發送給特定設備的I/O通道。
具體來說,USB設備虛擬通道的建立和交換數據,都需要遵循以下的邏輯順序:
1、通道設置順序:打開通道,並交換能力。該通道被分配由客戶端和服務器用來識別USB設備的特定標識符。USB設備虛擬通道在單個命名的動態虛擬通道中使用多個通道。每個USB設備有一個控制通道和一個數據通道。此序列的目標是設置通道的標識符並交換硬件標識和版本功能。
圖2:通道設置順序
2、新設備順序:客戶端通知服務器新設備到達。服務器在服務器計算機上創建與客戶端報告的設備相對應的設備。客戶端使用新的設備序列來通知服務器有關新設備。它首先通知服務器創建USB重定向虛擬通道的新實例。一旦創建了新的虛擬通道,則經由新的虛擬通道將新的設備消息發送到服務器。根據添加設備消息的HardwareIds字段識別設備。
圖3:新設備序列
3、I/O序列:服務器向客戶端發送USB數據包,客戶端將USB數據包轉發到物理設備,並在物理設備重新組裝數據包後發送回結果。服務器使用I/O序列向客戶端發送I/O請求。 在RDP協議的USB虛擬通道中,服務器可以向客戶端發送多個I/ O請求,而不用等待先前發送的請求完成。
圖4:I/O序列
USB設備虛擬通道嵌入在動態虛擬通道傳輸中,動態通道虛擬通道擴展在虛擬通道協議之上實現通用的面向連接的通信通道。動態虛擬通道(DVC)是在現有建立的靜態虛擬通道之上。靜態虛擬通道會話是典型的客戶端/服務器關系。遠程桌面協議(RDP)層【RDP協議的架構層次】管理虛擬通道上通道創建、設置和數據傳輸。DVC由通過網絡邏輯連接的兩個端點組成。一個端點是在終端服務(TS) 服務器上運行的應用程序,另一個端點是運行在終端客戶端上的應用程序。DVC由DVC管理器創建和維護。終端服務器和終端客戶端上都有一個DVC管理器。DVC服務器管理器負責初始化DVC環境和創建單獨的DVC。DVC客戶端管理器負責創建和維護與客戶端DVC管理器應用程序的連接。在DVC管理器初始化之後,DVC服務器管理器可以創建單獨的DVC。這些通道用於在運行在終端服務器上的應用程序和在終端客戶端上運行的DVC監聽程序之間交換消息。發送和接收消息在客戶端和服務器之間是對稱的,雙方都可以發起發送數據消息(或消息)。
因此,USB虛擬通道實質是想建立靜態的客戶端/服務器關系的虛擬通道,然後再通過靜態虛擬通道之上,由動態虛擬通道管理器創建相互之間的交換數據通道。靜態虛擬通道和動態虛擬通道之間的轉換是這樣的:
USB設備虛擬通道僅在動態虛擬通道傳輸完全建立後運行。如果動態虛擬通道傳輸被終止,USB設備虛擬通道也被終止。也就是USB設備被手動拔出,那麽動態虛擬通道就被終止了,相應的USB設備虛擬通道也被終止,就會在服務器端的消息中提示USB設備已拔出,這個消息將會是通過靜態的虛擬通道數據交換通道發出。而通過關閉底層虛擬通道來終止協議,那麽就直接關閉掉RDP會話的連接。底層虛擬通道終止,動態虛擬通道就被終止,USB設備虛擬通道也被終止。
除了重定向設備,我們還可以重定向USB設備的驅動程序以及應用程序。如果要重定向設備驅動程序和應用程序,則必須滿足以下要求:
1、設備和應用程序之間的所有通信都通過設備驅動程序支持的I/O序列進行路由。通信不能通過任何其他方式進行路由,例如共享內存,註冊表或磁盤文件。
2、設備驅動程序和應用程序之間的通信不能是除了這些基本調用【讀,寫和IO控制】之外的任何東西。
為什麽呢?因為協議格式字段規定和限制了傳輸的調用使用。
最後我提一個問題:
如果我有一臺帶有雙顯卡的計算機,兩個顯示器、兩個鼠標和兩個鍵盤。假設我將其分配給兩個人同時使用這臺計算機,其中第一個顯示器使用本地計算的操作系統,在第二個顯示器的窗口中通過遠程桌面打開RDP會話,提供給第二個用戶使用。那麽我該通過什麽方式進行設置,使得兩個鼠標和兩個鍵盤互不幹擾,第一個鼠標和鍵盤專用於本地系統,第二個鼠標和鍵盤專用於RDP會話?
本文出自 “我拿流年亂了浮生” 博客,請務必保留此出處http://tasnrh.blog.51cto.com/4141731/1982620
RDP協議之USB重定向虛擬通道