由于目前Windows Server的版本已经进入到了2016版,因此在本文中,终端服务一律称为其最新名称:远程桌面服务(RDS)。
以下组件对于了解远程桌面服务协议至关重要:
RDP客户端:支持远程桌面服务协议的客户端称为RDP客户端,因为客户端安装了支持远程处理的软件组件。使用此RDP客户端,用户连接到RD会话主机服务器以登录到远程桌面计算机或远程应用程序。
远程桌面会话主机(RD会话主机):RDP客户端与之通信的服务器称为远程桌面会话主机(RD会话主机),她将RDP客户端连接到远程应用程序。
远程桌面服务协议RDP将RDP客户端和RD会话主机服务器安全地连接起来,使得RDP客户端和RD会话主机的组件之间引导通信以及用于管理服务器的功能。
RDP协议是一个多通道协议,使用TCP或UDP传输。使用UDP传输时,除了主远程桌面连接外,RDP协议还可以在RDP客户端和RDP会话主机服务器之间创建多个传输连接。
下图描述了RDP协议与远程桌面服务以及相关联的组件交互的架构图。
图:远程桌面服务架构图
RD会话主机支持使用外部系统,例如目录服务(DS),许可服务,组策略服务,文件服务和认证服务和远程桌面进行交互。这些服务使用的协议不是远程桌面服务的一部分。
ConnectionBroker组件(在上图中用虚线显示)是RDP客户端连接到RD会话主机中可选的组件。Connection Broker组件的作用是将RDP客户端的用户根据一定的负载均衡算法分配给RD会话主机之间上的用户会话。
RDP客户端和RD会话主机服务器之间还可以通过使用RD Gateway网关协议进行通信,RDGateway组件在这里进行RDP会话的代理,使其RDP协议通信可以跨隧道或跨防火墙。
当RDP客户端的用户运行远程应用程序时,应用程序在RD会话主机服务器上执行,RD会话主机服务器向RDP客户端发送图形输出或其他类型的数据。
该系统的总体功能可以分为以下几类:
建立RDP客户端和RD会话主机服务器之间的安全连接。
重定向功能。
终止RDP客户端和RD会话主机服务器之间的连接。
1、在RDP客户端和RD会话主机服务器之间建立安全连接。
RDP协议允许RDP客户端安全连接到RD会话主机服务器; 在跨域边界连接场景下,RDP客户端使用虚拟专用网络(VPN)或网关协议先连接到RD网关服务器,再由RD网关服务器代理RDP会话到RD会话主机上。
2、重定向功能
当RDP客户端和RD会话主机服务器之间存在远程桌面协议(RDP)连接时,会频繁重定向数据和资源。此重定向允许RD会话主机服务器访问RDP客户端上的资源,以及允许RD会话主机服务器将数据从RD会话主机服务器上远程应用重定向到RDP客户端。重定向功能的一些示例包括:
键盘,鼠标和触摸输入:将来自RDP客户端的键盘,鼠标和触摸板输入的数据重定向到RD会话主机上的用户会话中。
打印机作业:将来自RD会话主机上的用户会话的打印作业重定向到RDP客户端的打印机。
媒体播放器内容:在RD会话主机上运行的应用可以将媒体播放器内容重定向到RDP客户端。
文件系统数据:RD会话主机可以使用文件系统重定向访问RDP客户端上的本地驱动器。
剪贴板:剪贴板重定向使用户能够将数据从运行在RD会话主机上的应用程序复制到位于RDP客户端上的剪贴板上,同时也允许位于RDP客户端上的剪贴板的数据复制到RD会话主机上。
智能卡:RD会话主机可以连接到RDP客户端上的智能卡并访问其中的凭据数据。
端口:RD会话主机可以连接到RDP客户端上的串行端口,并行端口和USB端口并访问其中的设备以及数据。
凭据:RDP客户端将本地凭据(用户名和密码)重定向连接到RD会话主机用于验证用户并登录。
3、终止RDP客户端和RD会话主机服务器之间的连接
有两种类型的终止远程桌面连接,即:
注销
断开连接
1、注销
RDP客户端的用户从RD会话主机服务器注销,导致RD会话主机服务器上的用户会话关闭。
2、断开连接
由于网络问题或因为RDP客户端在用户未点击注销之前就将所分配的会话关闭,RDP客户端可能会与RD会话主机服务器断开连接。发生这种情况时,根据RD会话主机服务器的配置,用户会话保留在RD会话主机服务器上一定时间。并允许用户重新连接到现有会话。
以上这些功能的呈现都需要RDP协议的完美运作和协同,在前文中我们曾经提到过RDP协议本质是一个协议集合体,本节中的表提供了远程桌面服务的成员协议的完整列表。
远程桌面服务成员协议列表:
协议名称 | 说明 | 简称 |
远程桌面协议:基本连接和图形远程处理 | 该协议通过将图形显示信息从远程计算机传送到用户并将输入从用户传送到远程计算机来促进用户与远程计算机系统的交互,其中将输入注入到用户会话中。该协议还允许用户计算机上的组件和在远程计算机上运行的组件之间的通过专门的可扩展的机制进行通信。 | MS-RDPBCGR |
终端服务网关服务器协议 | 此协议提供了一个网关,其为RDP客户端和防火墙后面的RD会话主机服务器之间的通过隧道进行RDP通信的能力。 | MS-TSGU |
终端服务:终端服务器运行时接口 | 此协议用于远程查询和配置RD会话主机的数据。例如,此协议可用于查询在RD会话主机上运行的活动会话的数量。 | MS-TSTS |
终端服务:工作区配置协议 | 此协议允许对无法访问非托管计算机的管理员统一查看用户工作资源。该协议用于传输信息,以便客户端计算机可以在服务器或虚拟计算机上启动远程桌面和远程应用程序。 | MS-TSWP |
用于优化图形数据的成员协议,支持会话管理和许可:
协议名称 | 说明 | 简称 |
远程桌面协议:桌面组合虚拟通道扩展 | 此协议支持远程桌面组合(桌面壁纸等内容)。 | MS-RDPEDC |
远程桌面协议:图形设备接口(GDI)加速扩展 | 此协议对生成图像的绘图操作进行编码,从而减少远程图形处理相关的带宽。 | MS-RDPEGDI |
远程桌面协议:复合远程V2 | 该协议用于显示在通过网络连接到第一个远程机器上打开远程桌面并在该桌面内再次远程到一台机器(服务器)上运行的RDP桌面的内容(嵌套RDP显示)。 | MS-RDPCR2 |
远程桌面协议:NSCodec扩展 | 该协议指定了可以用于通过利用有效的压缩来编码屏幕图像的图像编解码器。 | MS-RDPNSC |
远程桌面协议:RemoteFX编解码器扩展 | 该协议指定可以用于通过利用有效的压缩来编码屏幕图像的有损图像编解码器。 | MS-RDPRFX |
远程桌面协议:会话选择扩展 | 该协议描述了RDP客户端和服务器之间交换的消息,以便于精确定位应用程序共享上下文。 | MS-RDPEPS |
远程桌面协议:许可扩展 | 此协议允许授权的RDP客户端或用户连接到RD会话主机。此扩展涉及RDP客户端,RD会话主机和许可证服务器之间的通信。 RD会话主机可以配置为基于每个设备或每个用户的许可模式。客户端访问许可证(CAL)安装在许可证服务器上,当RD会话主机代表客户端请求许可证时,许可证服务器从其可用的许可证池中发出许可证。 | MS-RDPELE |
用于在RDP客户端和RD会话主机服务器之间传输设备数据或资源数据的成员协议:
协议名称 | 说明 | 简称 |
远程桌面协议:剪贴板虚拟通道扩展 | 此协议提供对操作系统提供的剪贴板的基本编程访问,并确保任何应用程序能够将数据放置到剪贴板,从剪贴板提取数据,枚举剪贴板上可用的数据格式,并注册以接收、通知系统剪贴板已更新。 | MS-RDPECLIP |
远程桌面协议:文件系统虚拟通道扩展 | 此协议通过重定向两者之间的所有输入/输出请求和响应,提供RD会话主机服务器和RDP客户端文件系统驱动程序之间的访问。 | MS-RDPEFS |
远程桌面协议:串行和并行端口虚拟通道扩展 | 此协议指定用于启用RDP客户端和RD会话主机服务器之间的端口重定向的通信。通过将端口从RDP客户端重定向到RD会话主机服务器,在RD会话主机服务器上运行的应用程序可以访问连接到这些端口的远程设备。 | MS-RDPESP |
远程桌面协议:打印虚拟通道扩展 | 此协议指定用于在RDP客户端和RD会话主机服务器之间启用打印机重定向的通信。通过将打印机从RDP客户端重定向到RD会话主机服务器,在服务器上运行的应用程序可以访问远程打印机设备,就像它们是本地打印机一样。 | MS-RDPEPC |
远程桌面协议:智能卡虚拟通道扩展 | 此协议使RDP客户端智能卡设备在单个RDP会话的上下文中可用于服务器端应用程序。 | MS-RDPESC |
远程桌面协议:远程程序虚拟通道扩展 | 此协议是一个远程桌面协议(RDP)功能,它提供一个远程应用程序作为本地用户应用程序在客户端计算机上显示。 | MS-RDPERP |
远程桌面协议:多方虚拟通道扩展 | 此协议启用远程显示桌面和应用程序内容。为了有效地实现应用共享或协作解决方案,传达附加信息以使参与者获知除了正在共享哪些应用或窗口之外还涉及谁。 | MS-RDPEMC |
远程桌面协议:音频输出虚拟通道扩展 | 此协议将音频数据从RD会话主机服务器传输到RDP客户端。例如,当RD会话主机服务器播放音频文件时,RD会话主机服务器使用该协议将音频数据传送到RDP客户端。然后,RDP客户端就可以播放出该音频。 | MS-RDPEA |
远程桌面协议:动态虚拟通道扩展 | 该协议在虚拟通道协议之上实现通用的面向连接的通信信道。在现有的静态虚拟通道上建立动态虚拟通道(DVC)。 | MS-RDPEDYC |
远程桌面协议:即插即用设备虚拟通道扩展 | 此协议指定用于在RDP客户端和RD会话主机服务器之间启用即插即用设备重定向的通信。 | MS-RDPEPNP |
远程桌面协议:XML纸张规格(XPS)打印虚拟通道扩展 | 此协议指定安装在RD会话主机服务器上的虚拟打印机驱动程序和安装在RDP客户端上的打印机驱动程序之间的通信。此协议的主要目的是获取打印功能并在RDP客户端上显示特定于打印机的用户界面。 | MS-RDPEXPS |
远程桌面协议:音频输入虚拟通道扩展 | 此协议支持将音频数据从RDP客户端传输到RD会话主机。例如,在RD会话主机上运行的应用程序可以记录音频数据。此数据将从RDP客户端传输到RD会话主机,允许应用程序从安装在RDP客户端上的音频设备进行记录。 | MS-RDPEAI |
远程桌面协议:USB设备虚拟通道扩展 | 此协议用于将通用串行总线(USB)设备从RDP客户端重定向到RD会话主机服务器,这允许服务器访问RDP客户端本地物理连接的USB设备,就好像该设备在服务器本地。 | MS-RDPEUSB |
远程桌面协议:视频虚拟通道扩展 | 此协议支持将同步的音频和视频数据从RD会话主机传输到RDP客户端。 RDP客户端可以播放音频和视频数据,并使用由协议提供的定时信息来同步该数据。 | MS-RDPEV |
远程桌面协议:UDP传输扩展 | 此协议扩展使用用户数据报协议(UDP)传输。 | MS-RDPEUDP |
远程桌面协议:图形管道扩展 | 此协议由基本连接和基本图形处理用于启用图形数据的智能处理。 | MS-RDPEGFX |
远程桌面协议:多传输扩展 | 此协议支持打开多个传输作为基本连接和基本图形处理协议的扩展。 | MS-RDPEMT |
远程桌面协议:虚拟通道回显扩展 | 此协议用于确定RD会话主机和RDP客户端之间的网络特性(例如往返时间(RTT))。 | MS-RDPEECO |
远程桌面协议:视频优化远程虚拟通道扩展 | 此协议设计为在RDP客户端和RD会话主机之间建立的远程桌面协议(RDP)虚拟通道的上下文中运行。当RD会话主机服务器正在显示其被分类为视频的内容并且需要将该视频数据发送到RDP客户端时,该协议扩展适用。 | MS-RDPEVOR |
远程桌面协议:输入虚拟通道扩展 | 此协议用于将多点触摸输入帧或写字笔/板输入从RDP客户端传输到RD会话主机服务器。 | MS-RDPEI |
远程桌面协议:显示控制虚拟通道扩展 | 此协议用于请求远程会话中的显示配置更改 | MS-RDPEDISP |
远程桌面协议:认证重定向虚拟通道 | 该协议用于在远程会话中的虚拟通道上执行认证协议操作。这允许RDP服务器会话在无法访问底层用户凭证的情况下执行网络身份验证。 | MS-RDPEAR |
下图描述了远程桌面服务系统的协议之间的关系。
图:远程桌面协议之间的关系
这些成员协议之间,首先由一个最基本的协议:基本连接和基本图形处理协议,该协议承担将RDP客户端和RD会话主机之间进行连接的操作和基本的图形输出处理。是RDP协议集中的最基础的协议,也是由T120系列协议的改进而来的协议。之后,随着各个功能的使用和扩展,才会使用到与之相对应的扩展协议。这些协议集完美的集成、协作,共同完成了将RDP客户端资源重定向到RD会话主机并将RD会话主机的数据和信息传递到RDP客户端的能力。
除了这些协议集自己进行的相互交互之外,还针对有其他系统/组件的依赖:
域控制器或Kerberos系统的认证和授权服务。身份验证服务依赖于证书基础结构来支持安全套接字层(SSL)协议。
[RFC1035]中规定的DNS用于地址解析。
目录服务或用于分配用户会话或虚拟机的其他组件(如连接代理)。
用于终端服务的文件服务发布远程桌面和远程应用程序。
在本小节中,我们将说明远程桌面协议:音频输出虚拟通道的一些技术实现。该协议的目的是将音频数据从服务器(RD会话主机,在这里为了方便,我们称呼为服务器)传输到客户端(RDP客户端)。例如,当服务器播放音频文件时,服务器使用该协议将音频数据传送到客户端。然后客户端就可以播放该音频。
远程桌面协议:音频输出虚拟通道扩展协议可以通过两种不同的传输方法在客户端和服务器之间交换:
静态虚拟通道;
动态虚拟通道。
静态或动态虚拟通道可用于在客户端和服务器之间传输所有信息,并且必须用于某些序列。并且,对于某些序列,也可以使用UDP。
在远程桌面协议:音频输出虚拟通道扩展协议,某些序列指代为三个不同的序列:
初始化序列:建立连接并交换能力和设置。
数据传输序列:音频数据被传输。
音频设置传输序列:传输对音频设置的更改。
1、初始化序列
初始化序列具有以下目标:
1).建立客户端和服务器端的协议版本和功能。
2).建立客户端和服务器共有的音频格式列表。所有音频数据以此列表中指定的格式传输。
3).确定是否可以使用UDP传输音频数据。
最开始的时候,服务器发送服务器音频格式和版本PDU,指定其协议版本和支持的音频格式给客户端。作为响应,客户端发送客户端音频格式和版本协议数据单元(PDU)给服务器端。通过这种交换,服务器和客户端因而具有彼此的版本,彼此的能力以及支持的音频格式的同步列表。
如果客户端和服务器都至少是版本6,则客户端必须在发送客户端音频格式和版本PDU之后立即发送质量模式PDU。之后RDP6.0之后才支持音频的质量模式。音频的质量模式顾名思义就是可以对音频数据进行Qos以进行优先传输。
如果客户端想要通过UDP接收数据,则客户端通告要用于UDP流量的端口。给定客户端的端口,服务器尝试使用该UDP端口向客户端发送TrainingPDU。客户端如果收到,会尝试使用其自己的TrainingConfirm PDU进行答复。然后,服务器使用音频虚拟通道向客户端发送私钥(使用Crypt Key PDU)。此密钥将用于加密通过UDP发送的某些数据。如果所有前述步骤成功,则通过UDP发送数据传输序列。如果上述步骤任何失败,则数据传输序列在虚拟通道(不通过UDP)上发送。其通信步骤如下图所示:
图:使用UDP进行数据传输的初始化序列
如果所有数据传输序列要通过虚拟通道发送,则服务器和客户端通过虚拟通道交换Training PDU和TrainingConfirm PDU。在这里我们约定,使用静态虚拟通道(TCP传输)的虚拟通道简称为虚拟通道,使用UDP传输的的虚拟通道称之为动态虚拟通道。其步骤如下图所示:
图:使用虚拟通道进行数据传输的初始化序列
2、数据传输序列
数据传输序列的目的是将音频数据从服务器传输到客户端。对于数据传输序列存在两种不同的协议:
通过虚拟通道(TCP)传输;
通过动态虚拟通道(UDP)传输。
通过虚拟通道的数据传输序列具有非常简单的协议。如果客户端版本或服务器版本小于8,服务器发送两个连续的音频数据包:WaveInfoPDU和Wave PDU。 在收到音频数据时,客户端向服务器发送Wave Confirm PDU以通知服务器它已经收到了音频数据。收到音频数据之后,意味着它可以被客户端处理、取消或丢弃。其步骤如下图所示:
图:使用WaveInfo PDU和Wave PDU通过虚拟通道的数据传输序列
如果客户端和服务器版本都至少为8,则服务器发送Wave2 PDU。在收到音频数据时,客户端向服务器发送Wave Confirm PDU以通知服务器它已经收到了音频数据。其步骤如下图所示:
图:使用Wave2 PDU的虚拟通道上的数据传输序列
通过UDP的数据传输序列的协议多一点。类似于通过虚拟通道的协议,服务器向客户端发送一组音频数据。当客户端完成接收音频数据时,客户端向服务器发回Wave Confirm PDU。与在虚拟通道上使用的协议的区别是服务器如何发送音频数据。
如果客户端或服务器版本小于5,服务器使用Wave EncryptPDU发送音频数据。在接收到音频数据时,客户端向服务器发送Wave Confirm PDU。其步骤如下图所示:
图:UDP上的数据传输序列
如果客户端和服务器版本都至少为5,则可以使用另一种方法通过UDP发送音频数据。 这种方法涉及服务器在连续的PDU中发送音频数据。 所有PDU(除了最后一个)是UDP Wave PDUs。然后再发生最后一个PDU,其数据包为UDP Wave Last PDU。给定这些PDU,客户端就可以根据最后一个PDU和之前一个PDU重建音频数据样本。在接收音频数据时,客户端向服务器发送Wave ConfirmPDU以进行回应。其步骤如下图所示:
图:当协议版本至少为5时,通过UDP的数据传输序列
在初始化序列期间,服务器使用Crypt Key PDU通过虚拟通道向客户端发送32字节的私钥。一些音频数据使用此密钥加密。
在音频数据传输结束时,服务器通过在虚拟通道上发送Close PDU通知客户端。
3、音频设置传输序列
音频设置传送序列具有将从服务器传送到客户端的音频设置改变的功能。可以重定向两个不同的设置:音量和音高。所有音频设置传输序列通过虚拟通道发送。设置分别使用Volume PDU和Pitch PDU进行重定向。
远程桌面协议:音频输出虚拟通道扩展协议默认嵌入在[基本连接和基本图形处理协议]中指定的静态虚拟通道传输中,或者嵌入在[动态虚拟通道]中指定的动态虚拟通道传输中。
远程桌面协议:音频输出虚拟信道扩展协议仅在静态虚拟信道传输或动态虚拟通道完全建立后才会运行。如果静态或动态虚拟通道传输终止,则不会通过远程桌面协议:音频输出虚拟通道扩展协议发生其他通信。
远程桌面协议:音频输出虚拟通道扩展协议旨在在客户端和服务器之间建立的远程桌面协议虚拟通道的上下文中运行。当客户端需要播放在服务器上播放的音频时,此协议才会使用。
远程桌面协议:音频输出虚拟通道扩展协议是基于功能的。客户端和服务器在协议初始化序列期间交换功能。在已经接收和存储功能之后,客户端和服务器不发送不能由另一个处理的PDU或数据格式。
该协议的一些细节:
1)、协议版本
服务器音频格式和版本PDU和客户端音频格式和版本PDU的wVersion字段分别指示在服务器和客户端上支持的协议版本。协议版本用于确定一些协议能力。例如,仅当客户端协议版本和服务器协议版本都至少为6时,才支持质量模式。
2)、音频格式列表和当前音频格式
客户端在客户端音频格式和版本PDU中将音频格式列表发送到服务器。该列表必须在协议的整个持续时间内保持。 Wave Info PDU,Wave EncryptPDU和UDP Wave Last PDU的wFormatNo字段是该列表的索引。位于该索引处的格式是当前音频格式。当前音频格式可能在协议操作期间更改。音频格式列表的索引是从零开始的,其中值0指向列表中的第一格式。在此处,我们不像各位详细描述各个PDU的字节细节,如果大家感兴趣,可以去微软的官网下载RDP协议的技术文档进行查看。
3)、密钥
Crypt密钥是客户端和服务器使用的密钥,用于两个目的:
在Wave Encrypt PDU中加密和解密数据。
为音频FragData和Wave Encrypt PDU创建签名字段。
这两个目的的规范我们也不做详细介绍。
4)、质量模式设置
如果客户端和服务器的协议版本都至少是版本6,则客户端必须通过向服务器发送QualityMode PDU来通知服务器其优选的音频质量设置。此设置应存储在服务器上,并指定服务器使用哪种模式来调整连接的音频质量。
接下来我们来说一说播放音频的时候,整个流程是什么?
当在服务器上播放音频时(例如,当服务器在Windows Media Player中打开MP3文件时),服务器必须开始重定向音频数据。如果初始化序列没有出现,服务器必须启动初始化序列,然后继续启动数据传输序列。
其消息处理事件和排序规则如下图所示:
图:状态转换图
状态转换图总结了远程桌面协议的消息排序规则:音频输出虚拟通道扩展。以下是每个箭头的描述:
1.事件:从客户端连接。
操作:服务器发送服务器音频格式和版本PDU。
2.事件:服务器接收客户端音频格式和版本PDU。
操作:服务器输入“协商的格式和版本”状态。
3.事件:等待客户音频格式和版本PDU后超时。
操作:服务器终止协议。
4.事件:客户端版本<6或服务器版本<6。
操作:服务器进入“发送Training PDU”状态。
5.事件:客户端版本> = 6,服务器版本> = 6。
操作:等待来自客户端的质量模式PDU。
6.事件:服务器接收质量模式PDU或超时。
操作:服务器进入“发送Training PDU”状态。
7.事件:客户端音频格式和版本PDU中有一个有效的UDP端口,服务器正在尝试使用UDP。
操作:服务器进入“通过UDP发送TrainingPDU”状态。
8.事件:客户端音频格式和版本PDU中没有有效的UDP端口,或者服务器没有尝试使用UDP。
操作:服务器进入“通过虚拟通道发送Training PDU”状态。
9.事件:服务器通过UDP发送Training PDU。
操作:服务器进入“等待Training Confirm PDU”状态。
10.事件:服务器从客户端接收Training Confirm PDU。
操作:服务器发送Crypt Key PDU。
11.事件:等待Training Confirm PDU确认PDU后超时。
操作:服务器进入“通过虚拟通道发送Training PDU”状态。
12.事件:服务器发送Crypt Key PDU并成功。
操作:服务器进入“准备通过UDP发送数据”状态。
13.事件:发送加密密钥PDU时失败。
操作:服务器进入“通过虚拟通道发送Training PDU”状态。
14.事件:数据就绪。
操作:服务器发送Wave Encrypt PDU,或UDP WavePDU和UDP Wave Last PDU。
15.事件:服务器从客户端接收Wave Confirm PDU。
操作:服务器进入“准备通过UDP发送数据”状态。
16.事件:发送数据时失败。
操作:服务器发送关闭PDU并终止协议。
17.事件:服务器通过虚拟通道发送Training PDU。
操作:服务器进入“等待Training Confirm PDU”状态。
18.事件:服务器从客户端接收Training Confirm PDU。
操作:服务器进入“准备通过虚拟通道发送数据”状态。
19.事件:等待Training PDU超时通过虚拟通道确认PDU。
操作:服务器终止协议。
20.事件:数据就绪。
操作:服务器发送WaveInfo PDU,Wave PDU或Wave2 PDU。
21.事件:服务器从客户端接收Wave Confirm PDU。
操作:服务器进入“准备通过虚拟通道发送数据”状态。
22.事件:发送数据时失败。
操作:服务器发送关闭PDU和服务器终止协议。
备注:除非另有规定,否则服务器和客户端必须忽略格式错误、无法识别和错序的数据包。
在本小节中我们将说明远程桌面协议:音频输入重定向虚拟通道扩展协议的一些技术实现。此协议的目的是将音频数据从远程桌面协议(RDP)客户端传输到远程桌面协议(RDP)服务器端,以下分别称为客户端和服务器。例如,在服务器上运行的应用可以请求记录音频数据。此数据将从客户端传输到服务器,以允许服务器应用程序从安装在客户端上的音频设备进行记录。
该协议和上文我们将的音频输出虚拟通道扩展协议一样,分为三个主要序列:
初始化顺序:服务器和客户端交换版本和音频格式,并开始记录。
数据传输顺序:客户端向服务器发送音频数据。
格式更改序列:服务器请求新的音频格式,客户端确认此请求。
1、初始化序列
初始化序列具有以下目标:
1)、建立客户端和服务器协议版本和功能。
2)、建立客户端和服务器都支持的音频格式列表。
3)、开始录制音频数据。
最开始的时候,服务器在已经建立的动态虚拟通道内向客户端发送版本PDU。客户端将使用自己的版本PDU进行响应。接下来,服务器将发送声音格式PDU,其中包含服务器支持的音频格式的列表。客户端向服务器发送自己的声音格式PDU,建立音频格式的公共列表。所有音频数据将使用此列表中的某种格式进行编码。
一旦交换了音频格式,服务器将通过发送Open PDU来指示它已经请求开始记录。客户端将尝试从附加的音频捕获设备开始记录,并在Open Reply PDU中将结果返回给服务器。此时,客户端将开始发送音频数据。其步骤如下图所示:
图:初始化序列
2、数据传输序列
数据传输序列简单地将音频数据从客户端传输到服务器。客户端将使用在初始化序列或格式改变序列期间商定的当前音频格式对捕获的音频数据进行编码并将其发送到服务器。客户端首先发送Incoming Data PDU,其通知服务器下一个分组将包含音频数据。然后客户端将在Data PDU中发送音频数据。其步骤如下图所示:
图:数据传输序列
3、格式更改序列
格式改变序列提供用于服务器请求客户端使用不同格式来编码音频数据的机制。服务器通过发送Format Change PDU来发起序列,从初始化序列期间商定的列表中识别服务器期望的格式。然后,客户端通过发送指定相同格式的格式Format Change PDU来确认格式的改变。客户端接收到服务器端的PDU之后,客户端将使用新格式对音频数据进行编码。其步骤如下图所示:
图:格式更改序列
远程桌面协议:音频输入重定向虚拟通道扩展协议嵌入在动态虚拟通道传输中。并且只有在动态虚拟通道传输完全建立后,该虚拟通道扩展才会运行。如果动态虚拟通道传输终止,则不会通过远程桌面协议产生该通信:音频输入重定向虚拟通道扩展协议。
远程桌面协议:音频输入重定向虚拟通道扩展通用是基于功能的。客户端和服务器在协议初始化序列期间交换功能。
协议的一些详细信息:
音频格式列表:客户端和服务器维护在整个协议期间在初始化序列期间商定的音频格式的列表。Format Change PDU的NewFormat字段和Open PDU的InitialFormat字段是该列表中的索引。音频格式列表的索引是从零开始的,其中值零是指列表中的第一个格式。
当前音频格式:客户端和服务器维护当前的音频格式。这是当从客户端发送到服务器时音频数据必须被编码的格式。Format Change PDU的NewFormat字段或Open PDU的InitialFormat字段指示当前音频格式。
音频捕获设备状态:音频捕获设备有两种状态:打开和未打开。最初状态未打开。服务器发送Open PDU以要求客户端打开音频捕获设备。客户端发送Open Reply PDU以告诉服务器打开捕获设备的结果。如果捕获设备打开成功,音频输入设备状态将打开。
音频数据就绪:客户端发送Incoming Data PDU,通知服务器它已准备好发送数据。服务器维持音频数据就绪状态以准备接收数据PDU。
协议版本:客户端和服务器存储在初始化序列期间协商的协议版本。比如我们通过2003的RDP客户端去连接2012的远程桌面,那么其中很多功能是无法使用的,因为协商的协议版本不一致,功能不一致,只能使用协商一致的公共功能部分。
录制音频
当服务器尝试开始录制音频时,例如服务器运行录音机,客户端必须重定向音频数据。如果初始化序列没有发生,服务器必须开始初始化序列。
其消息处理事件和排序规则如下图所示:
下图中的状态转换图总结了远程桌面协议的消息排序规则:音频输入重定向虚拟通道扩展协议。
图:状态转换图
客户端处理的流程详细描述如下:
1、初始化序列
1.1处理版本PDU
版本PDU必须是客户端接收的第一个PDU。客户端必须存储协议版本,并使用它来确定服务器支持哪些消息。
1.2发送版本PDU
客户端必须通过向服务器发送其自己的版本PDU来确认服务器发送的版本PDU。
1.3处理声音格式PDU
客户端使用服务器在选择将使用哪些格式时发送的音频格式。
1.4发送传入数据PDU
在用声音格式PDU响应服务器之前,客户端必须发送传入数据PDU。
1.5发送声音格式PDU
客户端必须响应由服务器发送的声音格式PDU,通过回复自己的声音格式PDU。客户端发送回服务器的音频格式列表必须是服务器发送的列表的子集。不在服务器列表中的格式不得包含在客户端的音频格式列表中。
客户端发送的列表为当前协议会话建立允许的音频格式。这些格式必须由格式改变PDU的NewFormat字段和Open PDU的initialFormat字段引用。 I的值指的是该列表的第I个格式,并且意味着音频数据必须以列表中的第I个格式编码。
1.6处理打开的PDU
服务器发送Open PDU以指示其准备好开始接收音频数据。Open PDU指定两种音频格式。第一种格式由InitialFormat字段指定,并且是协商的音频格式列表的索引。这种格式是客户端必须用来编码音频数据并发送到服务器的音频格式。该格式用于编码以后可以由格式改变PDU改变的音频数据。
第二种格式由wFormatTag,nChannels,nSamplesPerSec,nAvgBytesPerSec,nBlockAlign,nBitsPerSample,cbSize和ExtraFormatData字段指定。这些字段指定应该用于从实际音频输入设备捕获数据的格式。
1.7发送格式更改PDU
客户端在从服务器接收到格式改变PDU之后发送格式改变PDU。 NewFormat字段必须设置为与服务器格式更改PDU中的NewFormat字段相同的值。
客户端在从服务器接收到Open PDU之后还发送格式改变PDU。客户端在发送Open Reply PDU之前发送此格式改变PDU,并且NewFormat字段务必设置为与服务器的OpenPDU中的initialFormat字段相同的值。
1.8发送打开答复PDU
在处理Open PDU之后,客户端必须尝试从本地音频输入设备开始记录。 客户端必须通过在结果字段中发送适当的HRESULT代码来通知服务器结果。 HRESULT代码在其第一位设置为1时为错误代码。不在此处介绍HRESULT的说明。
2、数据传输序列
2.1发送传入数据PDU
一旦客户端捕获了要发送到服务器的音频数据包,客户端必须在发送每个数据PDU之前立即发送传入数据PDU。
2.2发送数据PDU
此消息必须在发送传入数据PDU后立即发送。客户端必须用数据字段填充使用当前音频格式编码的音频包。
3、格式改变序列
3.1处理格式更改PDU
格式改变PDU指示服务器要求客户端使用不同的音频格式来编码音频数据。客户端必须将当前音频格式更改为NewFormat字段中包含的值,NewFormat字段是协商的音频格式列表的索引。客户端还必须通过使用格式改变PDU进行答复来确认格式改变。在发送格式改变PDU之后,必须使用新格式对所有音频数据进行编码,直到服务器请求另一格式改变。
3.2发送格式更改PDU
在处理格式改变PDU之后,客户端必须通过用它自己的格式改变PDU进行答复来确认格式改变。NewFormat字段必须设置为当前音频格式的新值。在发送格式改变PDU之后,必须使用新格式对所有音频数据进行编码,直到服务器请求另一格式。格式改变操作必须是成功的。
服务器端处理的详细流程如下:
1、初始化序列
1.1发送版本PDU
版本PDU必须是服务器发送的第一个PDU。
1.2处理版本PDU
服务器必须存储客户端发送的协议版本。
1.3发送声音格式PDU
在处理客户端的版本PDU之后,服务器必须发送声音格式PDU。声音格式PDU通知客户端服务器支持的音频格式。
1.4处理传入数据PDU
客户端发送传入数据PDU以通知服务器它将以其声音格式PDU进行响应。此PDU用于诊断目的。进入数据PDU也在数据PDU之前。
1.5处理声音格式PDU
服务器必须存储由客户端发送的音频格式的列表。此列表是在此协议会话期间可以使用的格式的最终列表。
1.6发送打开的PDU
在音频格式交换完成后,服务器发送一个Open PDU。
1.7处理格式更改PDU
在发送Open Reply PDU并开始传输音频数据之前,客户端发送格式改变PDU。该PDU确认由服务器选择的初始格式,并通知服务器所有音频数据必须最初以NewFormat字段指定的格式编码。
1.8处理Open Reply PDU
Open Reply PDU包含客户端尝试打开音频捕获设备的结果。如果结果字段是成功代码,客户端将开始发送音频数据。如果结果字段是错误代码,客户端不得发送音频数据。如果结果字段是错误代码,则服务器可以发送附加的Open PDU。
2、数据传输序列
2.1处理传入数据PDU
传入数据PDU指示客户端将要发送音频数据分组。服务器使用此信息进行诊断。进入数据PDU也在声音格式PDU之前。
2.2处理数据PDU
在接收到数据PDU之后,服务器根据当前音频格式对音频数据进行解码。 然后将解码的音频提供给正在记录音频的服务器侧应用。
3、格式更改序列
3.1发送格式更改PDU
当服务器确定需要新格式时,它必须从初始化序列中协商的音频格式列表中选择一个格式。服务器必须将格式改变PDU的NewFormat字段设置为新的音频格式的列表中的索引。
服务器必须继续解码使用旧音频格式到达的任何音频数据,直到它从客户端接收到确认格式改变PDU。
3.2处理格式更改PDU
客户端发送格式更改PDU以确认格式更改。接收确认后,服务器必须将当前音频格式设置为NewFormat。在这之后,客户端发送的所有音频数据务必使用新的音频格式进行编码。服务器必须根据新的音频格式解码在该PDU之后到达的所有音频分组。
THE END!
本文出自 “我拿流年乱了浮生” 博客,请务必保留此出处http://tasnrh.blog.51cto.com/4141731/1880878
原文地址:http://tasnrh.blog.51cto.com/4141731/1880878