关于Citrix的ICA协议,他的英文全称,网上都称呼其为Independent ComputingArchitecture,翻译为中文就是独立计算体系结构。但是根据Citrix的内部材料显示,也可以称为是ICA = Intelligent Console Architecture!翻译为中文就是智能控制台架构!

 

1、       历史

ICA 1.0 – 1992

在ICA1.0的版本中,最初是基于串行连接开放的,后来添加了IPX和NetBIOS的支持。所以在ICA1.0版本中,支持串行、IPX和NetBIOS。

Citrix ICA协议简要介绍_Citrix ICA

ICA 2.0 – 1992

ICA2.0版本是ICA协议的第一个拥有图形界面的版本,并将Citrix WinCredible技术集成到ICA协议当中以支持多用户。并且支持多个操作系统:OS/2、DOS、Windows 3.1以及TCP/IP stack for OS/2 from FTP Software。

Citrix ICA协议简要介绍_Windows_02

CitrixWinCredible技术

【Citrix WinCredible技术是Citrix公司基于微软公司的Windows 3.1推出的将桌面系统让多个用户进行访问的技术解决方案,极大地扩展了Windows3.1的优势,实现高性能的远程访问Windows。 WinCredible技术是一个完整的基于Windows系统的扩展技术,支持多个并发用户通过本地局域网或串行连接或远程通过拨号调制解调器访问服务器。WinCredible可用于配置Windows远程访问服务器,局域网上的Windows应用程序服务器,广域网络视窗应用性能增强器,并为多个Windows用户构建一个低成本的启动系统。】

ICA 3.0 – 1995

1995年8月思杰发布的WinFrame For Networks产品,在基于Window NT的架构上构建远程访问Windows服务器。相应的远程访问协议ICA就升级到了3.0版本。在3.0当中,集成了Thinwire1.0、打印、客户端驱动器映射、音频、剪贴板等功能。并支持更多的网络协议和接入方式:TCP/IP, IPX,SPX, NetBEUI, Serial, Modems。

Citrix ICA协议简要介绍_Citrix ICA_03

1996年8月思杰发布了世界上第一个Windows应用程序的网页浏览器客户端。

Citrix ICA协议简要介绍_虚拟化_04

微软在1997宣布,Windows服务器NT系统,多用户访问支持启用Terminal Server协议。1998年6月思杰发布MetaFrame的1.0用于Windows NT Server 4.0终端服务器版本。

Citrix ICA协议简要介绍_Windows_05

MetaFrame是Citrix公司的一款远程集中访问企业信息中心的产品,并和微软的终端服务(Terminal Service)紧密集成,就是在微软的终端服务技术的基础上开发出来的。Citrix MetaFrame 提供一种最简洁的解决方案,可以在企业的信息中心,集中管理所有的企业应用,让员工或用户在任何地点都可以安全、快捷地进行访问。这就是后来大名鼎鼎的XenApp的前身。

ICA更名与混乱时代

  之后由于虚拟化技术的出现,桌面虚拟化技术暂露头角,Citrix在原先ICA协议的基础之上,修改ICA协议的显示技术,增加一些适宜的功能提供给XenDesktop桌面虚拟化使用,在内部被称之为PortICA,区别于XenApp的原先的ICA协议。到了XenDesktop3.0版本的时候,Citrix内部将PortICA协议的部分功能模块的名称进行了更名,更名列表如下:

Citrix ICA协议简要介绍_虚拟化_06

这些更名的功能模块主要提供给桌面虚拟化使用。在XenDesktop4.0版本的时候,Citrix将这些区别于原先ICA协议的功能模块单独提取出来,统一封装在HDX当中,统一命名为HDX,即高清用户体验。

融合时代

在最新版本的Citrix产品中,Citrix将XenApp和XenDesktop进行了融合,将原先XenApp和XenDesktop 4.0的IMA架构集成到了XenDesktop 新版本的FMA架构中。FMA架构最早出现在Citrix XenDesktop 5.x系列的产品中,这种架构区别于传统IMA架构,更加的易于管理和便捷。

此时的ICA协议和HDX进行了整合,Citrix将其统称为ICA/HDX协议。


2、       ICA协议堆栈

ICA协议是泛区网络或广域网的高延迟链路优化的协议。它还支持Quality-Of-Service服务质量(QoS)和其他带宽优化功能。

Citrix ICA协议简要介绍_Citrix ICA_07

ICA协议工作于OSI七层模型中的第六层。

Citrix ICA协议简要介绍_Windows_08

该ICA数据包包含以下标题:帧头,可靠性,加密,压缩,命令,数据命令,帧路径。该命令是唯一必需的信息。

在ICA中将KVM,打印,音频,驱动器映射,剪贴板,无缝窗口等虚拟通道进行封装。先目前ICA协议基于32bit开发,最多支持32个虚拟通道。 RDP通道和ICA不同,RDP支持30个虚拟通道。每个通道都有一个服务器上的对应点。这些通道位于在ICAWinstation驱动的上面,并且每个通道都有自己相对应的虚拟通道驱动程序。

Citrix ICA协议简要介绍_Citrix ICA_09

为了更好的理解ICA协议,以及明白ICA协议如何与TCP/IP进行交互,以及在以太网中如何进行数据包的接受和发送。下面我就接受ICA协议的数据库传输的细节。ICA协议堆栈如下图所示:

Citrix ICA协议简要介绍_虚拟化_10

  在上图中,描述了ICA数据如何通过各协议层的进行流动。ICA协议数据包是通过TCP/ IP网络由客户端应用程序(或服务器)中产生并包装用于递送到服务器(或客户端应用程序)。

  目的地(客户端或服务器)接收的ICA数据通过相应的协议层。所有的ICA协议层驻留在OSI网络模型内。

2.1、虚拟通道驱动

每个虚拟通道会通过他自己专门的虚拟通道驱动将数据发送到WinStation驱动。因为每个虚拟通道的实现功能不一致,所以其去调用相应系统的自己的驱动就不相同和规范。所以虚拟通道的驱动都是基于需要实现的功能来作相应的驱动开发,完全取决于虚拟通道实现。

  2.2、WinStation驱动

该WinStation驱动通过较低的网络层接收和发送来自多个ICA虚拟通道驱动的虚拟通道的数据。该WinStation驱动工作在OSI网络模型的应用层、表示层和会话层。该WinStation驱动程序执行以下功能:

  • 建立客户端和服务器之间的ICA会话,并保持会话信息诸如在ICA会话中压缩和加密功能是否开启和ICA数据包优先级标识是否启用。

  • 编码ICA命令信息和变换输入虚拟通道数据分成ICA报文,它放置在WinStation驱动程序的输入缓冲区中。一个ICA包由一个命令字节后跟可选命令数据如下所示:

Citrix ICA协议简要介绍_虚拟化_11

包含指令数据的ICA数据包并不是硬性的要求,因此一个ICA数据包在命令格式这里可能仅包含单个命令字节。 一个ICA数据包包含一个虚拟通道数据。一个单一的ICA包的最大长度不能超过2048字节(2KB)。

  • 压缩ICA数据包(当数据包处于连通时进行压缩)。

  • 合并或分离压缩ICA数据包(如果不使用压缩或解压缩的ICA数据包)进入一个可用的输出缓冲器。WinStation驱动程序确定在各输出缓冲器的数据量,使得包括ICA数据包的长度在成帧协议驱动程序离开时不超过1460字节(保持ICA数据包通过TCP/ IP传送的时候不被分解或丢弃)。

  • 在加入到输出缓冲器(当压缩已打开时)附加一个压缩报头。

  • 当多个ICA数据包被分配到一个输出缓冲器中,WinStation驱动程序在输出缓冲区里确定哪些ICA虚拟通道的数据包是具有最高优先级的。确定基于虚拟通道的每个输出缓冲区的优先级,并通过此信息提供给成帧协议的驱动程序。例如,如果该输出缓冲器包含Thinwire(优先级0)和打印(优先级为3)的ICA的数据包,那么Thinwire的数据的优先级最高,在输出数据的时候优先输出Thinwire虚拟通道的ICA数据包。

  • 将输出缓冲区转发给加密协议驱动程序(在加密时)。

2.3、加密协议驱动程序

在打开加密时,加密协议驱动程序将Winstation驱动输出缓冲区数据传递过来的数据添加加密头。所有的数据都经过加密头加密,包括压缩头(如果压缩开启)。

2.4、帧协议驱动程序

  帧协议驱动程序计算输出缓冲区的字节计数,并添加一个帧头。在除了字节计数、帧头包括一个二位的由WINSTATION驱动程序确定优先值。例如,如果总字节输出缓冲区数是1320个字节,该数据包是高优先级的,帧头的二进制值如下:

Citrix ICA协议简要介绍_Citrix ICA_12

低阶和高阶字节是反向的网络传输,和帧头被创建如下:

Citrix ICA协议简要介绍_Citrix ICA_13

上述帧头所描述的ICA优先级分组标注功能第一次引入了是在MetaFrame 1.8版本中,还包括MetaFrame XP。之前早期版本的MetaFrame使用的帧头,不包含优先位。所有16位的帧头被用于字节计数。由于字节计数将永远不会超过2048个字节(ICA包2 kb的限制),早期版本的帧头使用时前两位将始终为零。

  2.5、TDTCP

ICA协议通过tdtcp(TCP传输驱动程序)传输控制TCP/IP协议栈。tdtcp是ICA(RDP)接口的TCP/IP协议栈。tdtcp不附加任何额外的头部或尾部信息到ICA数据。

2.6、TCP/IP协议

   一旦TDTCP控制转移到TCP/IP协议栈,该TCP/IP协议驱动程序将准备在网络中传输ICA数据。详细介绍了TCP/IP标准和TCP/IP网络传输数据的封装,可以在互联网上提供的文件(http://www.faqs.org/)上找到和查看。


3、       ICA协议的服务质量

 

QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力, 是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。 在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS,比如Web应用,或E-mail设置等。但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。在RFC 3644上有对QoS的说明。这解决方案能够识别网络流量中的ICA通信,无论是基于TCP端口(1494默认情况下)或通过识别当新的ICA会话被建立时发起初始化握手(这比使用TCP端口更安全,因为在TCP端口数量是可配置的)。一些QoS的解决方案还可以识别基于其他信息的ICA通信,如发布的应用程序或源IP地址。这种识别使得ICA会话在进行传输时优先整个网络。例如,当用户在通过ICA会话运行关键业务应用程序如PeopleSoft,所有ICA会话可以得到的高优先级的执行功能。

ICA优先级数据包标记提供了QoS解决方案的机会,ICA内部识别虚拟通道优先级,使ICA会话传输优先级较高的数据首先发送。 ICA优先级数据包标记要求在与QoS解决方案结合使用时注意以下事项:

  • TCP和IP是面向流的协议。当接收到ICA数据通过TCP/IP后,它不可以被组合或分解,这取决于ICA协议的驱动程序如何打包的ICA数据。ICA输出缓冲器是专门限制ICA数据包大小为1460字节的,使它们传递到TCP/IP协议栈保持不变。然而,并不能保证输出缓冲区后到TCP/IP协议栈后将保持不变。因此,在帧头的ICA的优先级位不得不总是在TCP段或IP数据包中的同一个地方。这可以防止服务质量的解决方案依靠一个数据偏移无法识别在TCP和IP层优先级位。为了避免这个潜在的问题,QoS的解决方案ICA的数据必须验证在TCP和IP层的报头信息的字节计数匹配的前两个字节的字节数(正确对准后,前两个字节将包括优先级位和ICA的字节数成帧头)。如果将字节计数不匹配,在ICA输出缓冲器中输出到TCP/IP协议栈的ICA数据包可能是不完整的或是异常的数据包。

  • ICA优先级数据包标记是在表示层(OSI网络模型的第六层)来实现。大多数路由器在较低层(层中的两个通过四个)读取数据。因此,路由器不要有权访问ICA优先级数据包标记信息。当IP数据包通过路由器发送的数据包可能被分片。如果这种情况下,第一分组将包含成帧头,包括优先级位和一个现在不正确字节计数(由于分组被分段)。随后的数据包片段将不会有一个成帧头,从而将不包括优先级位(或字节数)。因此,如果服务质量解决方案通过接收到不完整的数据包后,ICA通信就会出现问题。因此需要检验IP层和ICA成帧之间的字节数头,确保优先级位被正确识别。

  • TCP要求收到在TCP缓冲区中的每个TCP段发送附加前确认段。这可以防止的QoS解决方案能够实现QOS的优先级功能。如果没有优先级标记头,TCP会报告收到失败的TCP报文段。


4、       ICA协议虚拟通道

4.1、什么是ICA虚拟通道?

Citrix的核心是ICA协议,ICA协议连接了运行在Citrix服务器上的应用进程和远端客户端设备,通过ICA的32个虚拟通道(分别传递各种输入输出数据如鼠标、键盘、图像、声音、端口、打印等等),运行在信息中心服务器上的应用进程的输入输出数据重新定向到远端客户端机器的输入输出设备上。ICA默认拥有32个虚拟通道,Citrix使用了前29个虚拟通道。剩下的可以让第三方自定义虚拟通道,虚拟通道是Citrix服务器远程计算体验的一个组成部分。【根据Citrix部分资料显示:现在的ICA协议支持64个静态的虚拟通道,有待权威资料证实,安卓系统开发的Citrix Receiver只支持32个虚拟通道

  虚拟通道的架构图如下图所示:

Citrix ICA协议简要介绍_Citrix ICA_14

虚拟通道是由一个客户端的虚拟驱动与服务器端的驱动程序进行通讯的。在客户端,虚拟通道对应于虚拟驱动程序,各自提供特定的功能。同样的,在服务器端也有相对于客户端的服务器端驱动程序来负责一一对应,并实现双向之间的数据通讯。

 

虚拟通道的虚拟驱动工作在协议层的表示层。

 

以下是包含在以***册表路径VirtualDriver注册表键的功能列表:

HKEY_LOCAL_MACHINE\SOFTWARE\Citrix\ICA Client\Engine\Configuration\Advanced\Modules\ICA3.0

我们可以通过该注册表位置查看在我们的环境中包含的虚拟通道的功能和虚拟通道的驱动都有哪些以及对应的相应功能。

我们可以删除我们不需要的虚拟通道。详情可以参考本连接到文档http://www.dell.com/downloads/global/solutions/customization_of_the_citrix_ica_web_client.pdf

4.2、ICA虚拟通道如何工作

我们知道操作系统分为用户模式和内核模式。在ICA虚拟通道中,有些虚拟通道工作与用户模式,有些虚拟通道工作与内核模式。

在服务器端的用户模式,一些虚拟通道由Wfshell.exe加载,例如:SpeedBrowse,EUEM,语音麦克风,双音频,剪贴板,多媒体,无缝会话共享,SpeedScreen等。这些虚拟通道就是工作在操作系统的用户模式。

其他的虚拟通道工作在操作系统的内核模式,需要使用时则加载至内核模式,例如CDM.sys和vdtw30.sys。

所有客户虚拟通道上层通过WinStation驱动进行数据的传输,如果安装了ICA客户端,在服务器端和客户端上,都有相应的WinStation驱动,在服务端上内置到了Wdica.sys中,在客户端中内置到wfica32.exe。

下图显示了虚拟通道的客户端 - 服务器连接

Citrix ICA协议简要介绍_虚拟化_15

下面是客户端 - 服务器使用虚拟通道进行数据交换的过程概述。

 

1、 客户端连接到Citrix后端的服务器进行服务的获取,比如启动一个应用程序。

2、 服务器端应用程序启动时,获得一个虚拟通道句柄,该虚拟通道需要将应用程序的启动显示图形界面信息推送到前端的客户端。因此应用层的应用程序根据命令向VM上的显示驱动层调取显示功能时,这时ICA的虚拟通道驱动程序会截取掉相应的显示调取和数据信息,并将其发送到WinStation驱动的缓冲区中。

3、在数据和命令到达WinStation驱动之后,WinStation驱动的处理模式有两种,轮询模式和直接模式:

  • 直接模式:如果服务器应用程序有数据要发送到客户端,数据被立即发送到客户端。当收到由虚拟通道驱动转发过来的的数据存放于WinStation驱动缓存区中时,WinStation驱动会根据高虚拟通道的优先级,将数据转发给压缩或着加密驱动程序进行相应的操作。待加密和压缩完成后将其转发至帧协议驱动,将数据包进行封装成数据帧,并通过相应的连接TCP/IP协议栈,有TCP/IP立即将其传递到客户端。

  • 轮询模式:如果客户端的虚拟驱动有数据要发送到服务器,该数据的优先级来说就需要再等待一下,等待WinStation驱动依照轮询的方式执行或着读取他。即如果是客户端发往服务器的数据,数据包将会进行缓存中,并进行排队,等待WinStation驱动读取排队队列,直到WinStation驱动读取它。

  4、客户端接收到数据包之后,在客户端上安装的ICA接受模块就会将数据进行反解析,解码出相应的数据与命令,然后通过客户端OS向特定的驱动调用相应接口实现对于的功能。

  5、当服务器通过虚拟通道将应用程序显示推送完成并使用完成后,关闭虚拟通道,并释放所有分配的资源。

4.3、ICA虚拟通道优先级

ICA数据包优先级标记为正在传输的ICA会话虚拟通道数据定义传输的优先级。这是通过每个虚拟通道有一个2位的优先级相关联来实现的。此2位的优先级包括在ICA数据报文之内。 他们2位的优先位值结合形成四个优先值:

00(0)高优先级

01(1)中优先级

10(2)低优先级

11(3)后台优先权

每个虚拟通道被分配这些优先级值中的一个。缺省虚拟通道优先级如下:

Citrix ICA协议简要介绍_虚拟化_16

Citrix ICA协议简要介绍_Windows_17

所有虚拟通道的优先级设置存储在以***册表项:

[HKLM\System\CurrentControlSet\Control\TerminalServer\Wds\icawd\Priority](REG_MULTI_SZ)

此项包含一行,格式为每个虚拟通道:

VirtualChannelName,Priority

VirtualChannelName是如在上述表中指定的标准的虚拟通道的缩

VirtualChannelName必须7个字符,所以尾随空格必须逗号在必要的时候才加入。重点是以下数字之一优先级值:0,1,2,3。

Thinwire虚拟通道(CTXTW和CTXTWI)是唯一默认的高优先级的虚拟通道,这会确保对延迟敏感的用户界面数据被优先发送。

 

4.4.、自定义虚拟通道

以下是自定义虚拟通道的文档连接:

https://www.citrix.com/downloads/citrix-receiver/sdks/virtual-channel-sdk.html

https://www.citrix.com/community/receiver-ica-sdks.html

 

4.5、动态虚拟通道

动态虚拟通道技术其实现的机制和多路复用分机制差不多,我们可以安装这样的思路去理解就可以了。动态虚拟通道技术封装在ICA协议当中,也可以调用微软的RDP动态虚拟通道API来使用。相当于在ICA虚拟通道不够的情况下,使用RDP协议的虚拟通道API调用其虚拟通道来实现功能。

微软的RDP协议的动态虚拟通道:http://msdn.microsoft.com/en-us/library/bb540860(v=vs.85).aspx

 

4.6、直通功能的虚拟通道

 

在Citrix ICA协议中,以下的虚拟通道在单跳或多跳操作方式相同:

  • Client Drive Mapping,

  • Client COM Port Mapping,

  • Client Printer Mapping,

  • Smartcard support,

  • Kerberos,

  • Twain,

  • Client Local Text Echo/Speed Screen Latency Reduction (ZLC),

  • Program Neighborhood Support,

  • Transparent Key Pass-Through,

  • Multimedia Support,

  • Client UPD and End User Experience Monitoring.

因为延迟的重要性,如进行压缩和解压缩和呈现在每一跳的功能时可能会稍微影响在性能方面的用户体验。特别是以下的虚拟通道领域:

  • Seamless,

  • ThinWire,

  • Philips Speech Mike recorder and foot pedal and Bi-directional Audio

 

尽管一些特定场景没有测试,但是Citrix提供虚拟通道大多数情况下,在Windows中使用XenDesktop的ICA会话,大部分都是直通会话。

具体来说,zXenDesktop服务器上,有一个VDA Hook【钩子】运行,命名为picaPassthruHook,其唯一目的是让客户端相信其是在CPS服务器上运行,因此将客户端进入其传统的直通模式。

 

以下是支持的直通模式功能的虚拟通道:

  • SSON,

  • Client Drive Mapping,

  • Client COM Port Mapping,

  • Client Printer Mapping,

  • Smartcard support,

  • Kerberos,

  • Client Local Text Echo/Speed Screen Latency Reduction (ZLC),

  • Transparent Key Pass-Through,

  • Multimedia Support, Client UPD.