溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

RDP協(xié)議之USB重定向虛擬通道

發(fā)布時間:2020-07-25 08:41:05 來源:網(wǎng)絡(luò) 閱讀:4587 作者:tasnrh 欄目:系統(tǒng)運維


RDP遠程桌面協(xié)議中,USB設(shè)備虛擬通道擴展協(xié)議用于將USB數(shù)據(jù)包從終端服務(wù)器傳輸?shù)浇K端客戶端。終端客戶端將USB數(shù)據(jù)包轉(zhuǎn)發(fā)到物理USB設(shè)備。然后客戶端在物理設(shè)備重新組裝數(shù)據(jù)包后返回結(jié)果。

       一般來說,遠程訪問的協(xié)議可以重定向USB設(shè)備,所以在使用和過程中,必須為客戶端提供一種方式來指定使用該協(xié)議重定向的USB設(shè)備,或者選擇使用替代方法的設(shè)備或者完全不重定向的設(shè)備。因為當(dāng)設(shè)備被重定向時,它就不能在客戶端上繼續(xù)使用。例如:

        USB鼠標:如果使用此協(xié)議進行USB鼠標重定向,那么在客戶端本地將無法使用鼠標。這種結(jié)果實用與虛擬桌面全屏使用的場景,但是在傳統(tǒng)的RDP服務(wù)中,我們的客戶端和服務(wù)器端都需要同時復(fù)用我們的鼠標設(shè)備,因此,RDP協(xié)議的USB虛擬通道如何解決這個問題?

       面對這個問題,我們不從RDP協(xié)議USB虛擬通道本身的實現(xiàn)上去思考,而是以我們自身先思考如何來解決這個問題為前提。那么解決辦法有兩種途徑:

        1、使用免驅(qū)動的鼠標;

        2、客戶端使用兩個鼠標。

       第一個方案似乎很好,但是有限制條件,那就不完美了;第二個條件就純粹是一種反人類的方案,直接pass。我們發(fā)現(xiàn)似乎只有在協(xié)議上做優(yōu)化,才能夠完美兼容當(dāng)前的使用習(xí)慣和操作體驗。

       這就涉及到RDP協(xié)議的USB虛擬通道采用什么完美機制來實現(xiàn)上述的需求了。針對這個問題,我們來了解RDP協(xié)議的USB虛擬通道是如何工作的?以解我們上述的疑問吧!



首先我們需要先講幾個概念:

1、設(shè)備驅(qū)動程序:系統(tǒng)用來與設(shè)備(如顯示器、打印機、鼠標或通信適配器)通信的軟件。其是一個抽象層,用于控制應(yīng)用程序訪問給定計算機系統(tǒng)上的各種硬件設(shè)備。我們通常將其簡稱為“驅(qū)動”。那么驅(qū)動是如何和硬件進行通信的?這個就涉及到每個硬件的寄存器了。我之前寫過一篇介紹應(yīng)用程序如何通過驅(qū)動去實現(xiàn)和硬件的交互,里面介紹了這方面的內(nèi)容,包括驅(qū)動如何去找到硬件的寄存器地址以及如何與寄存器進行交互。

2、設(shè)備接口:一種統(tǒng)一且可擴展的機制,可以與應(yīng)用程序和系統(tǒng)以編程方式進行交互。設(shè)備驅(qū)動程序可以為特定設(shè)備提供一個或多個設(shè)備接口。設(shè)備接口由GUID(全球唯一標識符)表示。

3、遠程設(shè)備:連接到遠程(或客戶端)機器的設(shè)備。

4、終端客戶端:終端服務(wù)器的客戶端。在客戶機上運行的終端客戶機程序。在Windows中,RDP只是一個協(xié)議,實現(xiàn)我們可以訪問服務(wù)器桌面并顯示圖像,為這個協(xié)議提供顯示資源和交互資源是名叫終端服務(wù),在高版本中改為遠程桌面服務(wù)。

5、終端服務(wù)器:運行終端服務(wù)的服務(wù)器。


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

RDP協(xié)議之USB重定向虛擬通道

執(zhí)行這些規(guī)則和策略,我們在Windows的終端客戶端上就可見一斑,這就是用于選擇正確設(shè)備的用戶界面,而這些都只是常見的設(shè)備,比較全的執(zhí)行此類規(guī)定的還是和Windows的其他服務(wù)相集成:組策略、注冊表、通知等。因此和其他協(xié)議類似,靈活性選擇重定向的設(shè)備是這個設(shè)計的滿足當(dāng)前的使用習(xí)慣和操作體驗比較完美的一種解決方案。

其次,針對USB鼠標復(fù)用的問題,在協(xié)議上解決我想RDP的USB虛擬通道和其他協(xié)議并無區(qū)別,都是基于“會話”和“焦點”的判斷來自動對USB鼠標進行切換,已達到復(fù)用USB鼠標的目的。會話應(yīng)該很好理解,啟動一個遠程桌面連接就是一個會話,會話的屬性就包括用戶、連接密碼、連接地址等等。而焦點,則是判斷用戶當(dāng)前的桌面是位于本地客戶端還是遠程桌面。

 

下面我們具體來介紹RDP協(xié)議的USB虛擬通道是如何工作的。

在USB虛擬通道的實現(xiàn)中,終端客戶端的USB硬件設(shè)備需要重定向到終端服務(wù)器上,那么首先需要終端客戶端和硬件USB設(shè)備進行連接,然后將設(shè)備通過RDP協(xié)議客戶端重定向到終端服務(wù)器上。終端服務(wù)器要識別硬件USB設(shè)備,就必須在服務(wù)器上安裝設(shè)備驅(qū)動程序。

下圖描述了USB設(shè)備和服務(wù)器上的USB驅(qū)動程序堆棧有關(guān)的事件序列。

RDP協(xié)議之USB重定向虛擬通道

圖1:USB堆棧流

當(dāng)插入USB設(shè)備時,客戶端向服務(wù)器發(fā)送添加虛擬通道消息。作為響應(yīng),服務(wù)器發(fā)送也發(fā)送一個相同的虛擬通道創(chuàng)建消息給到客戶端,并等待來自客戶端的相同消息??蛻舳税l(fā)送虛擬通道創(chuàng)建消息后,客戶端立即發(fā)送添加設(shè)備消息,待雙方都創(chuàng)建虛擬通道完畢后互相發(fā)送消息確認完畢,服務(wù)器立即開始創(chuàng)建一個USB驅(qū)動程序堆棧,驅(qū)動程序?qū)⑾蛳到y(tǒng)表示該USB設(shè)備的存在。此后,服務(wù)器和客戶端就可以準備交換I / O數(shù)據(jù)包了。

當(dāng)設(shè)備從客戶端拔出時,協(xié)議就會關(guān)閉服務(wù)器發(fā)送給特定設(shè)備的I/O通道。

 

具體來說,USB設(shè)備虛擬通道的建立和交換數(shù)據(jù),都需要遵循以下的邏輯順序:

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

RDP協(xié)議之USB重定向虛擬通道

2:通道設(shè)置順序

2、新設(shè)備順序:客戶端通知服務(wù)器新設(shè)備到達。服務(wù)器在服務(wù)器計算機上創(chuàng)建與客戶端報告的設(shè)備相對應(yīng)的設(shè)備。客戶端使用新的設(shè)備序列來通知服務(wù)器有關(guān)新設(shè)備。它首先通知服務(wù)器創(chuàng)建USB重定向虛擬通道的新實例。一旦創(chuàng)建了新的虛擬通道,則經(jīng)由新的虛擬通道將新的設(shè)備消息發(fā)送到服務(wù)器。根據(jù)添加設(shè)備消息的HardwareIds字段識別設(shè)備。

RDP協(xié)議之USB重定向虛擬通道

3:新設(shè)備序列

3I/O序列:服務(wù)器向客戶端發(fā)送USB數(shù)據(jù)包,客戶端將USB數(shù)據(jù)包轉(zhuǎn)發(fā)到物理設(shè)備,并在物理設(shè)備重新組裝數(shù)據(jù)包后發(fā)送回結(jié)果。服務(wù)器使用I/O序列向客戶端發(fā)送I/O請求。 在RDP協(xié)議的USB虛擬通道中,服務(wù)器可以向客戶端發(fā)送多個I/ O請求,而不用等待先前發(fā)送的請求完成。

RDP協(xié)議之USB重定向虛擬通道

4I/O序列


USB設(shè)備虛擬通道嵌入在動態(tài)虛擬通道傳輸中,動態(tài)通道虛擬通道擴展在虛擬通道協(xié)議之上實現(xiàn)通用的面向連接的通信通道。動態(tài)虛擬通道(DVC)是在現(xiàn)有建立的靜態(tài)虛擬通道之上。靜態(tài)虛擬通道會話是典型的客戶端/服務(wù)器關(guān)系。遠程桌面協(xié)議(RDP)層【RDP協(xié)議的架構(gòu)層次】管理虛擬通道上通道創(chuàng)建、設(shè)置和數(shù)據(jù)傳輸。DVC由通過網(wǎng)絡(luò)邏輯連接的兩個端點組成。一個端點是在終端服務(wù)(TS) 服務(wù)器上運行的應(yīng)用程序,另一個端點是運行在終端客戶端上的應(yīng)用程序。DVC由DVC管理器創(chuàng)建和維護。終端服務(wù)器和終端客戶端上都有一個DVC管理器。DVC服務(wù)器管理器負責(zé)初始化DVC環(huán)境和創(chuàng)建單獨的DVC。DVC客戶端管理器負責(zé)創(chuàng)建和維護與客戶端DVC管理器應(yīng)用程序的連接。在DVC管理器初始化之后,DVC服務(wù)器管理器可以創(chuàng)建單獨的DVC。這些通道用于在運行在終端服務(wù)器上的應(yīng)用程序和在終端客戶端上運行的DVC監(jiān)聽程序之間交換消息。發(fā)送和接收消息在客戶端和服務(wù)器之間是對稱的,雙方都可以發(fā)起發(fā)送數(shù)據(jù)消息(或消息)。

因此,USB虛擬通道實質(zhì)是想建立靜態(tài)的客戶端/服務(wù)器關(guān)系的虛擬通道,然后再通過靜態(tài)虛擬通道之上,由動態(tài)虛擬通道管理器創(chuàng)建相互之間的交換數(shù)據(jù)通道。靜態(tài)虛擬通道和動態(tài)虛擬通道之間的轉(zhuǎn)換是這樣的:

RDP協(xié)議之USB重定向虛擬通道

USB設(shè)備虛擬通道僅在動態(tài)虛擬通道傳輸完全建立后運行。如果動態(tài)虛擬通道傳輸被終止,USB設(shè)備虛擬通道也被終止。也就是USB設(shè)備被手動拔出,那么動態(tài)虛擬通道就被終止了,相應(yīng)的USB設(shè)備虛擬通道也被終止,就會在服務(wù)器端的消息中提示USB設(shè)備已拔出,這個消息將會是通過靜態(tài)的虛擬通道數(shù)據(jù)交換通道發(fā)出。而通過關(guān)閉底層虛擬通道來終止協(xié)議,那么就直接關(guān)閉掉RDP會話的連接。底層虛擬通道終止,動態(tài)虛擬通道就被終止,USB設(shè)備虛擬通道也被終止。

除了重定向設(shè)備,我們還可以重定向USB設(shè)備的驅(qū)動程序以及應(yīng)用程序。如果要重定向設(shè)備驅(qū)動程序和應(yīng)用程序,則必須滿足以下要求:

1、設(shè)備和應(yīng)用程序之間的所有通信都通過設(shè)備驅(qū)動程序支持的I/O序列進行路由。通信不能通過任何其他方式進行路由,例如共享內(nèi)存,注冊表或磁盤文件。

2、設(shè)備驅(qū)動程序和應(yīng)用程序之間的通信不能是除了這些基本調(diào)用【讀,寫和IO控制】之外的任何東西。

為什么呢?因為協(xié)議格式字段規(guī)定和限制了傳輸?shù)恼{(diào)用使用。


最后我提一個問題:

如果我有一臺帶有雙顯卡的計算機,兩個顯示器、兩個鼠標和兩個鍵盤。假設(shè)我將其分配給兩個人同時使用這臺計算機,其中第一個顯示器使用本地計算的操作系統(tǒng),在第二個顯示器的窗口中通過遠程桌面打開RDP會話,提供給第二個用戶使用。那么我該通過什么方式進行設(shè)置,使得兩個鼠標和兩個鍵盤互不干擾,第一個鼠標和鍵盤專用于本地系統(tǒng),第二個鼠標和鍵盤專用于RDP會話?


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI