RDP協議之USB重定向虛擬通道


RDP遠程桌面協議中,USB設備虛擬通道擴展協議用於將USB數據包從終端服務器傳輸到終端客戶端。終端客戶端將USB數據包轉發到物理USB設備。而後客戶端在物理設備從新組裝數據包後返回結果。編程

       通常來講,遠程訪問的協議能夠重定向USB設備,因此在使用和過程當中,必須爲客戶端提供一種方式來指定使用該協議重定向的USB設備,或者選擇使用替代方法的設備或者徹底不重定向的設備。由於當設備被重定向時,它就不能在客戶端上繼續使用。例如:服務器

        USB鼠標:若是使用此協議進行USB鼠標重定向,那麼在客戶端本地將沒法使用鼠標。這種結果實用與虛擬桌面全屏使用的場景,可是在傳統的RDP服務中,咱們的客戶端和服務器端都須要同時複用咱們的鼠標設備,所以,RDP協議的USB虛擬通道如何解決這個問題?網絡

       面對這個問題,咱們不從RDP協議USB虛擬通道自己的實現上去思考,而是以咱們自身先思考如何來解決這個問題爲前提。那麼解決辦法有兩種途徑:架構

        一、使用免驅動的鼠標;ide

        二、客戶端使用兩個鼠標。優化

       第一個方案彷佛很好,可是有限制條件,那就不完美了;第二個條件就純粹是一種反人類的方案,直接pass。咱們發現彷佛只有在協議上作優化,纔可以完美兼容當前的使用習慣和操做體驗。spa

       這就涉及到RDP協議的USB虛擬通道採用什麼完美機制來實現上述的需求了。針對這個問題,咱們來了解RDP協議的USB虛擬通道是如何工做的?以解咱們上述的疑問吧!操作系統



首先咱們須要先講幾個概念:設計

1、設備驅動程序:系統用來與設備(如顯示器、打印機、鼠標或通訊適配器)通訊的軟件。其是一個抽象層,用於控制應用程序訪問給定計算機系統上的各類硬件設備。咱們一般將其簡稱爲「驅動」。那麼驅動是如何和硬件進行通訊的?這個就涉及到每一個硬件的寄存器了。我以前寫過一篇介紹應用程序如何經過驅動去實現和硬件的交互,裏面介紹了這方面的內容,包括驅動如何去找到硬件的寄存器地址以及如何與寄存器進行交互。3d

2、設備接口:一種統一且可擴展的機制,能夠與應用程序和系統以編程方式進行交互。設備驅動程序能夠爲特定設備提供一個或多個設備接口。設備接口由GUID(全球惟一標識符)表示。

三、遠程設備:鏈接到遠程(或客戶端)機器的設備。

四、終端客戶端:終端服務器的客戶端。在客戶機上運行的終端客戶機程序。在Windows中,RDP只是一個協議,實現咱們能夠訪問服務器桌面並顯示圖像,爲這個協議提供顯示資源和交互資源是名叫終端服務,在高版本中改成遠程桌面服務。

五、終端服務器:運行終端服務的服務器。


就上述問題而言,RDP協議的USB虛擬通道使用了比較靈活的設計來保證使用的靈活性,首先將須要重定向那些USB設備的決定權交給了用戶,由用戶來給予明確的答案。

28cf010048ef5a13ccd4c7b9675e0d1b.png

執行這些規則和策略,咱們在Windows的終端客戶端上就可見一斑,這就是用於選擇正確設備的用戶界面,而這些都只是常見的設備,比較全的執行此類規定的仍是和Windows的其餘服務相集成:組策略、註冊表、通知等。所以和其餘協議相似,靈活性選擇重定向的設備是這個設計的知足當前的使用習慣和操做體驗比較完美的一種解決方案。

其次,針對USB鼠標複用的問題,在協議上解決我想RDP的USB虛擬通道和其餘協議並沒有區別,都是基於「會話」和「焦點」的判斷來自動對USB鼠標進行切換,已達到複用USB鼠標的目的。會話應該很好理解,啓動一個遠程桌面鏈接就是一個會話,會話的屬性就包括用戶、鏈接密碼、鏈接地址等等。而焦點,則是判斷用戶當前的桌面是位於本地客戶端仍是遠程桌面。

 

下面咱們具體來介紹RDP協議的USB虛擬通道是如何工做的。

在USB虛擬通道的實現中,終端客戶端的USB硬件設備須要重定向到終端服務器上,那麼首先須要終端客戶端和硬件USB設備進行鏈接,而後將設備經過RDP協議客戶端重定向到終端服務器上。終端服務器要識別硬件USB設備,就必須在服務器上安裝設備驅動程序。

下圖描述了USB設備和服務器上的USB驅動程序堆棧有關的事件序列。

39e5035f05ca957fdcb893ce36950e09.png

圖1:USB堆棧流

當插入USB設備時,客戶端向服務器發送添加虛擬通道消息。做爲響應,服務器發送也發送一個相同的虛擬通道建立消息給到客戶端,並等待來自客戶端的相同消息。客戶端發送虛擬通道建立消息後,客戶端當即發送添加設備消息,待雙方都建立虛擬通道完畢後互相發送消息確認完畢,服務器當即開始建立一個USB驅動程序堆棧,驅動程序將向系統表示該USB設備的存在。此後,服務器和客戶端就能夠準備交換I / O數據包了。

當設備從客戶端拔出時,協議就會關閉服務器發送給特定設備的I/O通道。

 

具體來講,USB設備虛擬通道的創建和交換數據,都須要遵循如下的邏輯順序:

1、通道設置順序:打開通道,並交換能力。該通道被分配由客戶端和服務器用來識別USB設備的特定標識符。USB設備虛擬通道在單個命名的動態虛擬通道中使用多個通道。每一個USB設備有一個控制通道和一個數據通道。此序列的目標是設置通道的標識符並交換硬件標識和版本功能。

9dc9e62cfdaf5f71cd29ad3b6a9a0caf.png

2:通道設置順序

2、新設備順序:客戶端通知服務器新設備到達。服務器在服務器計算機上建立與客戶端報告的設備相對應的設備。客戶端使用新的設備序列來通知服務器有關新設備。它首先通知服務器建立USB重定向虛擬通道的新實例。一旦建立了新的虛擬通道,則經由新的虛擬通道將新的設備消息發送到服務器。根據添加設備消息的HardwareIds字段識別設備。

98e811fca79b7a0154910dbba3e95766.png

3:新設備序列

3I/O序列:服務器向客戶端發送USB數據包,客戶端將USB數據包轉發到物理設備,並在物理設備從新組裝數據包後發送回結果。服務器使用I/O序列向客戶端發送I/O請求。 在RDP協議的USB虛擬通道中,服務器能夠向客戶端發送多個I/ O請求,而不用等待先前發送的請求完成。

b4b7847543ae1d63dbef4eb8c4cfdc60.png

4I/O序列


USB設備虛擬通道嵌入在動態虛擬通道傳輸中,動態通道虛擬通道擴展在虛擬通道協議之上實現通用的面向鏈接的通訊通道。動態虛擬通道(DVC)是在現有創建的靜態虛擬通道之上。靜態虛擬通道會話是典型的客戶端/服務器關係。遠程桌面協議(RDP)層【RDP協議的架構層次】管理虛擬通道上通道建立、設置和數據傳輸。DVC由經過網絡邏輯鏈接的兩個端點組成。一個端點是在終端服務(TS) 服務器上運行的應用程序,另外一個端點是運行在終端客戶端上的應用程序。DVC由DVC管理器建立和維護。終端服務器和終端客戶端上都有一個DVC管理器。DVC服務器管理器負責初始化DVC環境和建立單獨的DVC。DVC客戶端管理器負責建立和維護與客戶端DVC管理器應用程序的鏈接。在DVC管理器初始化以後,DVC服務器管理器能夠建立單獨的DVC。這些通道用於在運行在終端服務器上的應用程序和在終端客戶端上運行的DVC監聽程序之間交換消息。發送和接收消息在客戶端和服務器之間是對稱的,雙方均可以發起發送數據消息(或消息)。

所以,USB虛擬通道實質是想創建靜態的客戶端/服務器關係的虛擬通道,而後再經過靜態虛擬通道之上,由動態虛擬通道管理器建立相互之間的交換數據通道。靜態虛擬通道和動態虛擬通道之間的轉換是這樣的:

120dd919ace4ba8b540f3d045169b781.png

USB設備虛擬通道僅在動態虛擬通道傳輸徹底創建後運行。若是動態虛擬通道傳輸被終止,USB設備虛擬通道也被終止。也就是USB設備被手動拔出,那麼動態虛擬通道就被終止了,相應的USB設備虛擬通道也被終止,就會在服務器端的消息中提示USB設備已拔出,這個消息將會是經過靜態的虛擬通道數據交換通道發出。而經過關閉底層虛擬通道來終止協議,那麼就直接關閉掉RDP會話的鏈接。底層虛擬通道終止,動態虛擬通道就被終止,USB設備虛擬通道也被終止。

除了重定向設備,咱們還能夠重定向USB設備的驅動程序以及應用程序。若是要重定向設備驅動程序和應用程序,則必須知足如下要求:

一、設備和應用程序之間的全部通訊都經過設備驅動程序支持的I/O序列進行路由。通訊不能經過任何其餘方式進行路由,例如共享內存,註冊表或磁盤文件。

二、設備驅動程序和應用程序之間的通訊不能是除了這些基本調用【讀,寫和IO控制】以外的任何東西。

爲何呢?由於協議格式字段規定和限制了傳輸的調用使用。


最後我提一個問題:

若是我有一臺帶有雙顯卡的計算機,兩個顯示器、兩個鼠標和兩個鍵盤。假設我將其分配給兩我的同時使用這臺計算機,其中第一個顯示器使用本地計算的操做系統,在第二個顯示器的窗口中經過遠程桌面打開RDP會話,提供給第二個用戶使用。那麼我該經過什麼方式進行設置,使得兩個鼠標和兩個鍵盤互不干擾,第一個鼠標和鍵盤專用於本地系統,第二個鼠標和鍵盤專用於RDP會話?

相關文章
相關標籤/搜索