1、CGP是什么?

 

Citrix CGP是Common Gateway Protocol的简写,中文名字为通用网关协议。他还有个大家都很熟悉的名字:Session Reliability,中文名称是会话可靠性。原来最初的时候名字不叫CommonGateway Protocol,而是Citrix Gateway Protocol。在本文的中我们统一称呼CGP或SR为会话可靠性。

wKioL1aNxCDxJtYKAACr6SkXIPc613.png

会话可靠性就是当用户的网络连接被中断时,在用户的连接屏幕上还能保持会话连接的状态。用户继续看到他们正在使用的应用程序,一直到网络连接恢复。此功能对于提供无线连接的移动用户尤其有用。举个例子来说,当我们使用手机通过Citrix系统连接到公司的网络系统内部时,恰好乘坐的地铁进入铁路隧道内,这个时候我们的手机就会瞬间被中断,因为我们的无线信号可能不太好。如果是在没有会话可靠性的情况下,那么我们的连接会话是会被断开的,而且我们的打开的应用程序也会从用户的屏幕上消失,并且用户再次使用的时候必须重新连接到断开的会话。那如果有了会话可靠性,如果前段的连接因为网络的原因被断开,会话保持活动的状态会在服务器上保持着。为了表示连接丢失,用户的显示将被冻结,光标变成一个旋转的沙漏,直至连接恢复。恢复时用户就可以继续中断期间应用程序的工作或者操作,和断开时候的状态并无区别。会话可靠性可以使得用户的会话在断开周重新连接用户会话而无需重新进行身份验证。

下面显示了在会话断开时显示的状态:

wKioL1aNxEaCrBvOAAEvMKcZiR0278.png


一般来说ICA协议对网络要求是苛刻的,对网络延迟要求较高,400-500ms左右会丢包,容易出现闪断问题;CGP使用2598端口作为会话可靠性的端口,这样,在1494之上封装了2598,成为CGP(Common Gateway Protocol),当出现丢包时,就会由RTE RelayService(监听2598)。默认情况下,走的都是2598,实际上防火墙开2598端口即可。

2、CGP的历史

当Citrix Receiver通过网络连接到Citrix的后端服务器时,它要么使用TCP/IP的1494端口,要么使用TCP/IP的2598端口。其中2598端口用于会话可靠性使用,并且在使用CGP时,其使用的是通过SSL加密的通道。

上面说了,CGP最开始的时候并不叫做CGP(CommonGateway Protocol),而是CGP(CitrixGateway Protocol)。CGP起源于Citrix在2003年的时候的一个项目:Secure Gateway project and theNylon protocol。最开始Citrix希望使用该项目来到达的效果就是在ICA会话断开后还能保持会话的能力。后来Citrix给其加入了SSL加密的功能。在后来的版本中将其名称更改为Citrix GatewayProtocol。由于Citrix Gateway Protocol是基于SOCKS代理协议开发的一个会话可靠性的解决方案,并且Citrix向管理端口的IANA国际组织为该协议申请了一个专用的端口2598。

具体来说,Citrix在当时需要一种方法来包装ICA流量,在一个网络链路发生故障时保持会话。因为在当时,网络的连接是十分糟糕的。因此就成立了该项目并不断进行优化和开发,直到今天我们所知道的会话可靠性。

对于用户来说,CGP它透明地运作。在内部有一个2598和1494端口之间的转换堆栈充当中继器,也就是当网路断开始时CGP会允许会话继续保持运行状态。在服务器端CGP会将会话继续进行保持,在客户端CGP不断的进行检测和监听,当前端的网络恢复正常后,就会恢复会话。

 

3、CGP如何工作

  当会话可靠×××启用时,ICA客户端会将ICA通信流量通过CGP进行封装,通过TCP端口2598发送到服务器端的“Citrix XTE Service”,该服务从充当中继器,剥离掉CGP层,然后转发ICA的流量到服务器的1494端口。Citrix XTE Service是ICA侦听器,负责“缓冲”流量。如果客户端和XA或XD服务器之间的网络链路被中断或暂时中断,而我们正在进行通信,我们正在进行通信的流量会在缓冲区中,同时对最终用户通过显示一个旋转的沙漏或静止的屏幕(在最新的版本中,已经更改为弹出消息或提示的方式)。一旦网络连接恢复,就停止在用户的显示器上显示“沙漏”,刷新缓冲区最终用户就可以继续正常工作。

wKiom1aNxEjRkjd0AABvW9s9fak685.png

会话可靠性的工作流程如下所示:

wKioL1aNxIXBzWDjAANRtNRTTHM439.jpg

由于CGP是基于SOCKS代理协议开发的,所以为了加深理解,我们也简单介绍下SOCKS代理协议。

SOCKS是一个通用的TCP/ IP为基础的网络应用代理协议。

SOCKS由两部分组成:SOCKS服务器和SOCKS客户端。SOCKS服务器可以直接与Internet和内部计算机通信。SOCKS客户接触的是SOCKS服务器,而不是直接将请求发送到互联网。其运行如下图所示:

wKioL1aNxLHjTSS5AACDHUIuUuU014.png

所以CGP其实就是TCP+SOCKS+SSL的组合。

wKiom1aNxKHxlfo5AAA3VAze_PU433.png

CGP和SOCKS之间的区别?

  • CGP基于SOCKS的设计思想而开发

  • CGP支持ticket-based的验证和处理

  • CGP服务器发送保持活动消息(默认情况下60秒)

  • 如果ticket是无效的,CGP丢弃的TCP连接没有反应,

  • CGP支持TCP复用,但没有真正使用

  • SOCKS仍然在思杰产品中使用


4、CGP服务集成组件

 4.1、CGP 集成组件: XTEService

可扩展的转换引擎(XTE)是基于Apache的代理服务器,支持:

  • CGP

  • SOCKS

  • HTTP

以上所有通过SSL

可以看出在XenApp<=6.5和XenDesktop<=5.x的思杰XTE Service提供:

  • 会话可靠性

  • SSL中继

  • 密码管理服务

  • 通用打印服务器

 4.2、CGP 集成组件: RDSListeners

wKioL1aNxUTgrOBzAABrka4zEKo955.png

wKioL1aNxVHRx-p-AAPBR3eOkmI030.png

 4.3、CGP 集成组件: CSG

  • ICA客户端和XenApp服务器之间的网关启用SSL

  • SSL隧道的ICA/ CGP流量加密

  • Citrix安全网关是仍是XenApp6.5支持的组件

  • 基于Apache类似XTE服务

  • 基本上是XTE+额外的Apache模块+ GUI的组合

  • 支持STA Ticketing认证

wKioL1aNxXTQJ11MAADbQph_KQM860.png

4.4、CGP集成组件:STA Ticketing认证

    a、STA请求:

以下数据被STA作为请求的内容向Web服务器发送:

  • 用户名和域名

  • 发布应用程序的名称

  • 最不繁忙的服务器地址

  STATicketing认证流程如下图所示:

wKioL1aNxZrD7a_PAALLIBGqYgU828.png

基于XML记录的STA请求的相关信息

wKioL1aNxbOBmuYXAAA6AEjq8rU890.png

b、STA应答:

应答的编码形式如下所示:

;STA_VERSION;STA_ID;TICKET

  • STA_VERSION:40代表是XenDesktop和XenApp,10代表的是XenMobile。

  • STA_ID:通常是从MAC地址生成的16个字符。每个STA ID必须是唯一的。这允许网关定位创建该票的STA和返回到该STA以进行验证。

  • TICKET:是32个大写字母或数字字符随机生成的序列。

例如:

;40;STA403126471;FE0A7B2CE2E77DDC17C7FD3EE7959E79

 

基于XML记录的STA应答的相关信息

wKiom1aNxazBVsx5AAAzfhhWOEk243.png

Ticket【票据】类型

wKioL1aNxhqgXglnAAC1F5TJsJw216.png

  4.5、CGP集成组件:WebSockets

WebSockets协议即是“SOCKS over HTTP”的组合。也是HTTP的升级协议。其默认使用TCP的8008端口。

其默认格式如下:

<html5 enabled="Always"  platforms="Force" launchURL="clients/HTML5Client/src/Session  Window.html“ preferences="wsPort:8080"  singleTabLaunch="true"  chromeAppOrigins="chrome- extension://haiffjcadagjlijoggckpgfnoeiflne  m" />

 

在使用以下组合时开启CGP会用到WebSockets:

  • 使用XA6.5,但是前段交付使用StoreFront 2.x版本

  • 使用XD7.x服务器版本的RDS并且使用ICA-HTML5

  • 使用XD7.x客户端操作系统的ICA Service


5、CGP的不足

启用会话可靠性之后,可能会增加我们的网络负担,我们的网络会更加频繁的发送大量的数据侦测包,这势必会增加我们的网络流量或着说消耗我们更多的网络流量。CGP每隔60秒,默认情况下60就会发生一次数据侦测包对网络环境进行侦测。当然如果你的用户规模在100个人左右,那么其实这点网络流量对你来说并不算什么。如果你的用户规模在5000以上,那么每个用户都会发生数据侦测包的情况下我们的网络流量就会无比的庞大,总的流量就会很吓人。Citrix的测试结果表明,5000用户规模的虚拟桌面节点在开启了会话可靠性之后,其CGP的流量是以MB来计算的。同时启用CGP,还会消耗我们的CPU资源和我们的内存资源,由于XTE服务是将CGP流量放到其专门开发的缓存区域中,而该缓存区域是XTE服务在内存中开辟和申请的一点地址空间。因此对于该缓存区的管理和调度,都需要我们的服务器的CPU资源和内存资源参与进行协同工作,无疑加大了我们服务器的资源的消耗。所以Citrix在对CGP的最佳实践中指出,在XD环境下,如果需要开启会话可靠性,那么我们的虚拟机至少需要2vCPU及以上的规格。

同时,在启用会话可靠性之后,在网络断开时会出现弹出式窗口,沙漏或静止屏幕。用户可能并不喜欢这样。为什么呢?因为这可能掩盖了网络问题的提示或着掩盖了真正的网络问题。如果人错误地设定TcpMaxDataRetransmissions过高,CGP几乎是不可能检测到这个错误。而且有时候冗余链路或着多个运营商或着多家链路继而进来的时候,各种因素都不是CGP能够检查到的。如果是上述的这些问题,Citrix在开启了会话可靠性之后,反而会掩盖真正的网络原因。这个时候可能禁用CGP,网络问题就暴露得更快,而不是让用户一直在那里等待,看见沙漏旋转。

 

6、CGP的好处和适用场景

漫游用户通过不可靠的无线/ 3G / 4G网络进行连接的时候就需要使用CGP。CGP在这些场景中为用户提供了不同的蜂窝网络之间的漫游。比如驾驶中使用无线或者医院护士使用WiFi网络移动到不同的房间等等。

启用匿名访问功能的时候也建议启用CGP。因为在启用匿名访问的时候,比如正在进行邮件的发送,如果这个时候网络断开,那么他重新在连接上之后,就不会在有他发生的邮件信息,或着说他之前的会话是无法找到或着无法续接上他再次连接的会话的,因为在匿名访问的时候,所以用户都是匿名的,服务器不能够识别会话的唯一性和关联性。如果这个时候启用了CGP,我们就可以找出之前断开的会话,并重新连接到正确的会话。

无缝的NetScalerHA故障转移。如果你想没有任何宕机的时间,在NetScaler进行HA的故障转移的时候,我们就需要开启CGP进行缓冲连接以确保我们的连接是不会断开的。如果不启用CGP,正在通过网关代理的用户将必须重新连接。所以在生产环境中,我们在做NetScaler切换时候,可以启用CGP之后在进行NetScaler的HA故障转移。

多流ICA。如果我们使用多流ICA,那么就需要启用CGP,因为它需要CGP(无中继器无法使用多流ICA)。这个时候CGP其实应该被称为“多流CGP”!因为他提供了我们拼接我们多流ICA的功能,没有CGP多流ICA无法使用。

多流ICA架构图:

wKiom1aNxjvD3tCIAAIXZjKUDdc634.png

多流ICA可以在策略中开启

wKioL1aNxoTDEqBpAAGpOKl2CO0777.png

在服务器进程中表现如下:

wKioL1aNxp6gWriTAABQsaGVFkg224.png

  

  使用最新版本的接收器和XenDesktop的时候可以开启CGP。在最新的版本中,Citrix宣称CGP对网络、CPU和内存的开销几乎是可以忽悠不计的。如果有一个网络问题。在信息工具提示中会提供更好的用户体验。而不会是沙漏旋转或着静止屏幕。


7、CGP连接模式

 7.1、直接连接

wKiom1aNxtOBiEsYAABKvqnS1Rk782.png

 7.2、有一跳DMZ区

wKiom1aNx0mRhXhqAAB-5B9j51U973.png

 7.3、双跳DMZ区

wKiom1aNx2_A49JCAABITZ41Q2s073.png


8、结论

在新版本的Citrix XenApp和XenDesktop中,建议开启CGP。由于上述介绍是基于Citrix IMA机构进行介绍的,新版本的FMA架构中,CGP的中继服务不在叫XTE Service。