ADC

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

某些协议在 TCP 字节流中传输名称-值对。此示例中 TCP 字节流中的协议是财务信息交换 (FIX) 协议。在非 XML 实施中,FIX 协议允许两台主机通过网络进行通信,以名称值对列表(称为 “FIX 字段”)的形式交换业务或贸易相关信息。字段格式为<tag>=<value><delimiter>。这种传统的标记值格式使 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 连接。您希望根据 SenderCompID 字段的值为连接配置持久性,该字段标识发送消息的公司。此 FIX 字段的标记为 49(在前面的登录消息示例中显示)。

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

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

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

如果客户端发送的 FIX 消息包含早期登录消息示例中的名称-值列表,则表达式提取值 INVMGR,并且 Citrix ADC 设备基于此值创建持久性会话。

有效载荷 () 函数的参数可以与您认为需要的一样大,以便在函数提取的字符串中包含 SenderCompID 字段。或者,如果希望设备在提取字段值时忽略大小写,则可以使用 SET_TEXT_MODE (IGNORASE) 函数,也可以使用哈希函数根据提取值的哈希值创建持久性会话。以下表达式使用 SET_TEXT_MODE(IGNORECASE) 和 HASH 函数:

CLIENT.TCP.PAYLOAD(500).TYPECAST_NVLIST_T('=','^').SET_TEXT_MODE(IGNORECASE).VALUE("49").HASH

以下是可用于为 FIX 连接配置持久性的规则示例(<tag> 替换为要提取值的字段的标签):

  • 若要提取任何修复字段的值在 TCP 有效负载的前 300 字节中,您可以使用表达式 IENT.TCP.PAYLOAD(300).BEFORE_STR(“^”).AFTER_STR(“<tag>=”)。
  • 若要在偏移量 80 时提取长度为 20 个字节的字符串,将该字符串转换为名称值列表,然后提取所需字段的值,请使用表达式 CLIENT.TCP.PAYLOAD(100).SUBSTR(80,20).TYPECAST_NVLIST_T(‘=’,’^’).VALUE(“<tag>”)。
  • 若要提取 TCP 有效负载的前 100 个字节,将字符串转换为名称-值列表,并提取所需字段的第三次出现的值,请使用表达式 CLIENT.TCP.PAYLOAD(100).TYPECAST_NVLIST_T(‘=’,’^’).VALUE(“<tag>“,2)。 注意:如果传递给 VALOD () 函 数的第二个参数为 n,则设备将提取字段 (n+1) <sup>th</sup> 实例的值,因为计数从零 ( (0).

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

  • CLIENT.TCP.PAYLOAD(100)
  • CLIENT.TCP.PAYLOAD(100).HASH
  • 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 字节流中的名称-值对配置基于规则的持久性