Citrix ADC

用例2:基于TCP字节流中的名值对配置基于规则的持久性

有些协议在TCP字节流中传输名-值对。本例中TCP字节流中的协议是金融信息交换(FIX)协议。在非xml实现中,FIX协议允许通过网络通信的两台主机以名称-值对列表(称为“FIX字段”)的形式交换业务或与贸易相关的信息。字段格式为<标记> = <价值> <分隔符>.这种传统的标记值格式使FIX协议成为用例的理想选择。

FIX字段中的标记是一个数字标识符,表示该字段的含义。在例子中;

  • 标记35表示消息类型。
  • 等号后的值对于给定的标记具有特定的含义,并与数据类型相关联。标记35的值A表示该消息是一条登录消息。
  • 分隔符是非打印的“头的开始”(SOH) ASCII字符(0x01),它是插入符号(^)。
  • 每个字段还分配了一个名称。带有标签35的字段是msgType字段。

下面是一个登录消息的示例。

8= fix.4.1 9=61 35= a 49= invmgr 56= brkr 34=1 52=20000426-12:05:06 98=0 108=30 10=157

标记值列表(如上面所示)的持久性类型的选择是由从列表中提取特定字符串的可用选项决定的。基于令牌的持久性方法要求您指定希望从有效负载中提取的令牌的偏移量和长度。FIX协议不允许您这样做,因为给定字段的偏移量及其值的长度可能因消息的不同而不同。这种变化取决于消息类型、前面的字段和前面值的长度。它也会根据实现的不同而有所不同,这取决于是否定义了自定义字段。这样的变化使得无法预测给定字段的准确偏移量,也无法指定作为标记提取的值的长度。因此,在这种情况下,基于规则的持久性是首选的持久性类型。

假设虚拟服务器fixlb1正在负载平衡到一个服务器群的TCP连接,该服务器群承载了启用fix的应用程序的实例。您希望根据SenderCompID字段的值为连接配置持久性,该字段标识发送消息的公司。这个FIX字段的标记是49(在前面的登录消息示例中显示)。

如果要为负载均衡虚拟服务器配置基于规则的持久性,请将负载均衡虚拟服务器的持久性类型设置为rule,并使用表达式配置规则参数。该表达式必须提取出TCP有效负载中您希望在其中找到SenderCompID字段的部分,将结果字符串类型转换为基于分隔符的名称-值列表,然后提取SenderCompID字段的值(标记49),如下所示:

set lb vserver fixlb1 -persistenceType RULE -rule "CLIENT.TCP.PAYLOAD(300).TYPECAST_NVLIST_T('=','^').VALUE("\49\")"

注意:表达式中使用了反斜杠字符,因为这是一个CLI命令。如果您正在使用配置实用程序,请不要输入反斜杠字符。

如果客户端发送一个FIX消息,其中包含前面登录消息示例中的名称-值列表,表达式将提取值INVMGR, Citrix ADC设备将基于该值创建一个持久会话。

PAYLOAD()函数的参数可以大到您认为在函数提取的字符串中包含SenderCompID字段所必需的大小。如果希望设备在提取字段值时忽略大小写,可以选择使用SET_TEXT_MODE(IGNORECASE)函数,并使用HASH函数根据提取值的散列创建持久会话。下面的表达式使用SET_TEXT_MODE(IGNORECASE)和HASH函数:

.TYPECAST_NVLIST_T CLIENT.TCP.PAYLOAD (500) ('=','^'). SET_TEXT_MODE (IGNORECASE) value .HASH(“49”)

下面是更多规则示例,您可以使用这些规则为FIX连接(替换<标记>使用你想要提取值的字段的标签):

  • 要提取TCP有效负载前300个字节中的任何FIX字段的值,可以使用表达式CLIENT.TCP.PAYLOAD(300).BEFORE_STR(" ^ ").AFTER_STR("<标记>= ")。
  • 要提取偏移量为80的长度为20字节的字符串,将该字符串转换为名称-值列表,然后提取所需字段的值,请使用表达式CLIENT.TCP.PAYLOAD(100).SUBSTR(80,20).TYPECAST_NVLIST_T(' = ', ' ^ ').VALUE("<标记>”)。
  • 要提取TCP有效负载的前100个字节,将字符串转换为名称-值列表,并提取所需字段的第三个出现的值,请使用表达式CLIENT.TCP.PAYLOAD(100).TYPECAST_NVLIST_T(' = ', ' ^ ').VALUE("<标记>”,2)。注意:如果传递给VALUE()函数的第二个参数是n,该工具将提取(n+1)的值<一口> th > < /晚餐字段的实例,因为计数从零(0)开始。

下面是更多可用于配置持久性的规则示例。只有基于有效负载的表达式才能计算通过FIX协议传输的数据。其他表达式是更通用的表达式,用于基于较低的网络协议配置持久性。

  • CLIENT.TCP.PAYLOAD (100)
  • .HASH CLIENT.TCP.PAYLOAD (100)
  • CLIENT.TCP.PAYLOAD (100) .SUBSTR (5, 10)
  • CLIENT.TCP.SRCPORT
  • CLIENT.TCP.DSTPORT
  • CLIENT.IP.SRC
  • CLIENT.IP.DST
  • CLIENT.IP.SRC.GET4
  • CLIENT.IP.DST.GET4
  • CLIENT.ETHER.SRCMAC.GET6
  • CLIENT.ETHER.DSTMAC.GET5
  • CLIENT.VLAN.ID
用例2:基于TCP字节流中的名值对配置基于规则的持久性