TCP 优化

TCP 使用以下优化技术和拥塞控制策略(或算法)来避免数据传输中的网络拥堵。

拥塞控制策略

传输控制协议 (TCP) 早已用于建立和管理 Internet 连接、处理传输错误以及顺利地将 Web 应用程序与客户端设备连接。但网络流量已变得更加难以控制,因为丢包并不仅仅依赖于网络中的拥塞,而且拥塞不一定会导致丢包。因此,为了测量拥塞,TCP 算法应该专注于数据包丢失和带宽。

比例速率恢复 (PRR) 算法

TCP 快速恢复机制可减少由数据包丢失造成的 Web 延迟。新的比例速率恢复 (PRR) 算法是一种快速恢复算法,用于在丢失恢复期间评估 TCP 数据。通过使用适合于拥塞控制算法选择的目标窗口的分数,在速率减半之后进行图案化。它最大限度地减少窗口调整,并且恢复结束时的实际窗口大小接近慢启动阈值 (ssthreshold)。

TCP 快速打开 (TFO)

TCP 快速打开 (TFO) 是一种 TCP 机制,可在 TCP 的初始握手期间,在客户端和服务器之间实现快速和安全的数据交换。此功能可作为 TCP 选项在绑定到 Citrix ADC 设备的虚拟服务器的 TCP 配置文件中使用。TFO 使用 Citrix ADC 设备生成的 TCP 快速打开 Cookie(安全 Cookie)来验证和验证启动与虚拟服务器的 TFO 连接的客户端。通过使用此 TFO 机制,您可以将应用程序的网络延迟减少一次完整往返所需的时间,从而显著减少短时间 TCP 传输的延迟。

TFO 的工作原理

当客户端尝试建立 TFO 连接时,它包括一个 TCP 快速打开 Cookie 和初始 SYN 段来验证自己。如果身份验证成功,Citrix ADC 设备上的虚拟服务器可以在 SYN-ACK 段中包含数据,即使它尚未收到三向握手的最终 ACK 段。与正常的 TCP 连接相比,这样可以节省多达一次完整的往返,而正常的 TCP 连接需要三向握手才能交换任何数据。

客户端和后端服务器执行以下步骤来建立 TFO 连接并在初始 TCP 握手期间安全地交换数据。

  1. 如果客户端没有用于对自身进行身份验证的 TCP 快速打开 Cookie,则会将 SYN 数据包中的快速打开 Cookie 请求发送到 Citrix ADC 设备上的虚拟服务器。
  2. 如果在绑定到虚拟服务器的 TCP 配置文件中启用了 TFO 选项,设备将生成一个 cookie(通过在私有密钥下加密客户端的 IP 地址),并使用包含 TCP 选项字段中生成的快速打开 Cookie 的 SYN-ACK 响应客户端。
  3. 客户端将 Cookie 缓存到设备上的同一虚拟服务器的未来 TFO 连接。
  4. 当客户端尝试建立到同一虚拟服务器的 TFO 连接时,它会发送 SYN,其中包括缓存的快速打开 Cookie(作为 TCP 选项)以及 HTTP 数据。
  5. Citrix ADC 设备验证 cookie,如果身份验证成功,服务器将接受 SYN 数据包中的数据,并通过 SYN-ACK、TFO Cookie 和 HTTP 响应确认事件。

注意:

如果客户端身份验证失败,服务器将删除数据并仅通过 SYN 确认事件,指示会话超时。

  1. 在服务器端,如果在绑定到服务的 TCP 配置文件中启用了 TFO 选项,Citrix ADC 设备将确定其尝试连接的服务中是否存在 TCP 快速打开 Cookie。
  2. 如果 TCP 快速打开 Cookie 不存在,设备将在 SYN 数据包中发送 cookie 请求。
  3. 当后端服务器发送 Cookie 时,设备将 Cookie 存储在服务器信息缓存中。
  4. 如果设备已为给定的目标 IP 对提供 Cookie,则会将旧的 Cookie 替换为新的 cookie。
  5. 如果当虚拟服务器尝试通过使用相同 SNIP 地址重新连接到同一后端服务器时,该 cookie 在服务器信息缓存中可用,则设备将 SYN 数据包中的数据与 cookie 合并并并将其发送到后端服务器。
  6. 后端服务器通过数据和 SYN 确认事件。

注意: 如果服务器仅通过 SYN 段确认事件,Citrix ADC 设备会在从原始数据包中删除 SYN 段和 TCP 选项后立即重新发送数据包。

配置 TCP 快速打开

要使用 TCP 快速打开 (TFO) 功能,请在相关 TCP 配置文件中启用 TCP 快速打开选项,并将 TFO Cookie 超时参数设置为符合该配置文件的安全要求的值。

使用 CLI 启用或禁用 TFO

在命令提示窗口中,键入以下命令之一以在新配置文件或现有配置文件中启用或禁用 TFO。

注意: 默认值为“禁用”。

    add tcpprofile <TCP Profile Name> - tcpFastOpen ENABLED | DISABLED
    set tcpprofile <TCP Profile Name> - tcpFastOpen ENABLED | DISABLED
    unset tcpprofile <TCP Profile Name> - tcpFastOpen
    Examples
    add tcpprofile Profile1 – tcpFastOpen
    Set tcpprofile Profile1 – tcpFastOpen Enabled
    unset tcpprofile Profile1 – tcpFastOpen

在命令提示窗口中,键入:

    set tcpparam –tcpfastOpenCookieTimeout <Timeout Value>
    Example
    set tcpprofile –tcpfastOpenCookieTimeout 30secs

使用 GUI 配置 TCP 快速打开

  1. 导航到配置 > 系统 > 配置文件,然后单击编辑以修改 TCP 配置文件。
  2. 配置 TCP 配置文件页上,选中 TCP 快速打开复选框。
  3. 单击确定,然后单击完成

导航到“配置”>“系统”>“设置”>“更改 TCP 参数”,然后“配置 TCP 参数”页以设置 TCP 快速打开 Cookie 超时值。

TCP Hystart

新的 TCP 配置文件参数 hystart 启用 Hystart 算法,这是一种慢启动算法,可动态地确定要终止的安全点 (ss阈值)。它可以实现向避免拥塞过渡,而不会造成大量数据包丢失。默认情况下,此新参数处于禁用状态。

如果检测到拥堵,Hystart 进入避免拥堵阶段。启用它可以在高数据包丢失高的高速网络中提供更好的吞吐量。此算法有助于在处理事务时保持接近最大带宽。因此,它可以提高吞吐量。

配置 TCP Hystart

要使用 Hystart 功能,请在相关 TCP 配置文件中启用立方 Hystart 选项。

使用命令行界面 (CLI) 配置 Hystart

在命令提示窗口中,键入以下命令之一以在新的或现有的 TCP 配置文件中启用或禁用 Hystart。

add tcpprofile <profileName> -hystart ENABLED
set tcpprofile <profileName> -hystart ENABLED
unset tcprofile <profileName> -hystart

示例:

    add tcpprofile profile1 -hystart ENABLED
    set tcpprofile profile1 -hystart ENABLED
    unset tcprofile profile1 -hystart

使用 GUI 配置 Hystart 支持

  1. 导航到“配置”>“系统”>“配置文件”>“编辑”以修改 TCP 配置文件。
  2. 在“配置 TCP 配置文件”页上,选中“Cubic Hystart”复选框。
  3. 单击确定,然后单击完成

TCP 突发速率控制

据观察,TCP 控制机制可能会导致高速移动网络流量爆炸,对整体网络效率产生负面影响。由于移动网络条件(如拥塞或第 2 层重新传输数据),TCP 确认到达发件人时会成堆,触发传输突发。这些连续数据包发送一个短的数据包间隙,它被称为 TCP 数据包突发。为了克服流量突发,Citrix ADC 设备使用 TCP 突发速率控制技术。此技术将数据均匀地分布到网络中,以便数据不会发送到突发状态。通过使用这种突发速率控制技术,您可以实现更好的吞吐量和更低的数据包丢失率。

TCP 突发率控制的工作原理

在 Citrix ADC 设备中,此技术将数据包的传输均匀分布在整个循环时间 (RTT) 的持续时间内。这是通过使用 TCP 堆栈和网络数据包调度程序来实现的,该程序标识各种网络条件,以便为正在进行的 TCP 会话输出数据包,以减少突发。  

在发件人,发件人不是在收到确认后立即传输数据包,而是可以延迟传输数据包,以按计划程序(动态配置)或 TCP 配置文件(固定配置)定义的速率分散它们。

配置 TCP 突发速率控制

使用相关 TCP 配置文件中的 TCP 突发速率控制选项并设置突发速率控制参数。

使用命令行设置 TCP 突发速率控制

在命令提示窗口中,设置以下 TCP 突发速率控制命令之一在新配置文件或现有配置文件中配置。

注意:默认值为“禁用”。

add tcpprofile <TCP Profile Name> -burstRateControl Disabled | Dynamic | Fixed

set tcpprofile <TCP Profile Name> -burstRateControl Disabled | Dynamic | Fixed

unset tcpprofile <TCP Profile Name> -burstRateControl Disabled | Dynamic | Fixed

其中,

禁用 — 如果禁用突发速率控制,则 Citrix ADC 设备不执行超出 maxBurst 设置的突发管理。

固定 — 如果 TCP 突发速率控件是固定的,则设备使用 TCP 配置文件中提到的 TCP 连接有效负载发送速率值。

动态 — 如果突发速率控制为“动态”,则根据各种网络条件对连接进行调节,以减少 TCP 突发。仅当 TCP 连接处于端点模式时,此模式才起作用。启用动态突发速率控制时,TCP 配置文件的 maxBurst 参数不生效。

add tcpProfile  profile1 -burstRateControl Disabled

set tcpProfile profile1 -burstRateControl Dynamic

unset tcpProfile profile1 -burstRateControl Fixed

使用命令行界面设置 TCP 突发速率控制参数

在命令提示窗口中,键入:

    set ns tcpprofile nstcp_default_profile –burstRateControl <type of burst rate control> –tcprate <TCP rate> -rateqmax <maximum bytes in queue>

    T1300-10-2> show ns tcpprofile nstcp_default_profile
            Name: nstcp_default_profile
            Window Scaling status:  ENABLED
            Window Scaling factor: 8
            SACK status: ENABLED
            MSS: 1460
            MaxBurst setting: 30 MSS
            Initial cwnd setting: 16 MSS
            TCP Delayed-ACK Timer: 100 millisec
            Nagle's Algorithm: DISABLED
            Maximum out-of-order packets to queue: 15000
            Immediate ACK on PUSH packet: ENABLED
            Maximum packets per MSS: 0
            Maximum packets per retransmission: 1
            TCP minimum RTO in millisec: 1000
            TCP Slow start increment: 1
            TCP Buffer Size: 8000000 bytes
            TCP Send Buffer Size: 8000000 bytes
            TCP Syncookie: ENABLED
            Update Last activity on KA Probes: ENABLED
            TCP flavor: BIC
            TCP Dynamic Receive Buffering: DISABLED
            Keep-alive probes: ENABLED
            Connection idle time before starting keep-alive probes: 900 seconds
            Keep-alive probe interval: 75 seconds
            Maximum keep-alive probes to be missed before dropping connection: 3
            Establishing Client Connection: AUTOMATIC
            TCP Segmentation Offload: AUTOMATIC
            TCP Timestamp Option: DISABLED
            RST window attenuation (spoof protection): ENABLED
            Accept RST with last acknowledged sequence number: ENABLED
            SYN spoof protection: ENABLED
            TCP Explicit Congestion Notification: DISABLED
            Multipath TCP: DISABLED
            Multipath TCP drop data on pre-established subflow: DISABLED
            Multipath TCP fastopen: DISABLED
            Multipath TCP session timeout: 0 seconds
            DSACK: ENABLED
            ACK Aggregation: DISABLED
            FRTO: ENABLED
            TCP Max CWND : 4000000 bytes
            FACK: ENABLED
            TCP Optimization mode: ENDPOINT
            TCP Fastopen: DISABLED
            HYSTART: DISABLED
            TCP dupack threshold: 3
            Burst Rate Control: Dynamic
            TCP Rate: 0
            TCP Rate Maximum Queue: 0

使用 GUI 配置 TCP 突发速率控制

  1. 导航到配置 > 系统 > 配置文件,然后单击编辑以修改 TCP 配置文件。
  2. 在“配置 TCP 配置文件”页上,从下拉列表中选择 TCP 突发控制选项:
    1. BurstRateCntrl
    2. CreditBytePrms
    3. RateBytePerms
    4. RateSchedulerQ
  3. 单击确定,然后单击完成

防止打包序列 (PAWS) 算法

如果在默认 TCP 配置文件中启用 TCP 时间戳选项,Citrix ADC 设备将使用防止包裹序列 (PAWS) 算法来识别和拒绝序列号位于当前 TCP 连接的接收窗口内的旧数据包,因为序列已“包裹”(达到其最大值并从 0 重新启动)。

如果网络拥塞延迟非 SYN 数据包,并且您在数据包到达之前打开新连接,则序列号换行可能会导致新连接接受该数据包为有效,从而导致数据损坏。但是,如果启用了 TCP 时间戳选项,则丢弃数据包。

默认情况下,TCP 时间戳选项处于禁用状态。如果启用它,设备会将数据包标头中的 TCP 时间戳 (SEG.TSval) 与最近的时间戳 (Ts.recent) 值进行比较。如果 SEG.TSval 等于或大于 Ts.recent,则处理数据包。否则,设备会删除数据包并发送纠正确认。

PAWS 的工作原理

PAWS 算法处理同步连接的所有传入 TCP 数据包,如下所示:

  1. 如果 SEG.TSval < Ts.recent:传入的数据包是不可接受的。PAWS 发送确认(如 RFC-793 中指定的)并删除数据包。注意:为了保留 TCP 检测和从半打开的连接中恢复的机制,发送 ACK 段是必要的。
  2. 如果数据包在窗口之外:PAWS 拒绝数据包,就像正常的 TCP 处理一样。
  3. 如果 SEG.TSval > Ts.recent:PAWS 接受数据包并处理它。
  4. 如果 SEG.TSval <= Last.ACK.sent(到达的段满足):PAWS 必须将 SEG.TSval 值复制到 Ts.recent(它是否复制到数据库中的 Ts.Recent 字段?
  5. 如果数据包按顺序排列:PAWS 接受数据包。
  6. 如果数据包未按顺序排列:数据包被视为正常的窗口内、序列外 TCP 段。例如,它可能会排队等待以后的交付。
  7. 如果 Ts.U近值闲置超过 24 天:如果 PAWS 时间戳检查失败,则检查 Ts.U近的有效性。如果发现 TS.U近值无效,则接受该段,并且 PAWS 规则将使用新段中的 TSval 值更新 TS.U近。

使用命令行界面启用或禁用 TCP 时间戳

在命令提示窗口中,键入:

`set nstcpprofile nstcp_default_profile -TimeStamp (ENABLED | DISABLED)`

使用 GUI 启用或禁用 TCP 时间戳

导航到“系统”>“配置文件”>“TCP 配置文件”,选择默认 TCP 配置文件,单击“编辑”,然后选中或清除“TCP 时间戳”复选框。

优化技术

TCP 使用以下优化技术和方法优化流控制。

基于策略的 TCP 配置文件选择

如今的网络流量比以往任何时候都更加多样化和带宽密集型。随着流量的增加,服务质量 (QoS) 对 TCP 性能的影响是显著的。要增强 QoS,您现在可以为不同类别的网络流量配置不同的 TCP 配置文件的 AppQoE 策略。AppQoE 策略对虚拟服务器的流量进行分类,以关联针对特定类型的流量(如 3G、4G、LAN 或 WAN)优化的 TCP 配置文件。

要使用此功能,请为每个 TCP 配置文件创建策略操作,将操作与 AppQoE 策略关联,并将策略绑定到负载平衡虚拟服务器。

有关使用订阅者属性执行 TCP 优化的信息,请参阅基于策略的 TCP 配置文件

配置基于策略的 TCP 配置文件选择

配置基于策略的 TCP 配置文件选择包括以下任务:

  • 启用 AppQoE。在配置 TCP 配置文件功能之前,必须启用 AppQoE 功能。
  • 添加 AppQoE 操作。启用 AppQoE 功能后,使用 TCP 配置文件配置 AppQoE 操作。
  • 配置基于 AppQoE 的 TCP 配置文件选择。要为不同类别的流量实施 TCP 配置文件选择,您必须配置 AppQoE 策略,使 Citrix ADC ADC 能够区分连接并将正确的 AppQoE 操作绑定到每个策略。
  • 将 AppQoE 策略绑定到虚拟服务器。配置 AppQoE 策略后,必须将它们绑定到一个或多个负载平衡、内容交换或缓存重定向虚拟服务器。

使用命令行接口配置

使用命令行界面启用 AppQoE

在命令提示窗口中,键入以下命令以启用该功能并验证该功能已启用:

  • enable ns feature appqoe
  • show ns feature

使用命令行界面创建 AppQoE 操作时绑定 TCP 配置文件

在命令提示窗口中,键入带 tcpprofiletobind 选项的以下 AppQoE 操作命令。

add appqoe action <name> [-priority <priority>] [-respondWith ( ACS | NS ) [<CustomFile>] [-altContentSvcName <string>] [-altContentPath <string>] [-maxConn <positive_integer>] [-delay <usecs>]] [-polqDepth <positive_integer>] [-priqDepth <positive_integer>] [-dosTrigExpression <expression>] [-dosAction ( SimpleResponse |HICResponse )] [-tcpprofiletobind <string>] show appqoe action

使用命令行界面配置 AppQoE 策略

在命令提示窗口中,键入:

add appqoe policy <name> -rule <expression> -action <string>

使用命令行界面将 AppQoE 策略绑定到负载平衡、缓存重定向或内容切换虚拟服务器

在命令提示窗口中,键入:

bind cs vserver cs1 -policyName <appqoe_policy_name> -priority <priority> bind lb vserver <name> - policyName <appqoe_policy_name> -priority <priority> bind cr vserver <name> -policyName <appqoe_policy_name> -priority <priority>

示例

    add ns tcpProfile tcp1 -WS ENABLED -SACK ENABLED -WSVal 8 -nagle ENABLED -maxBurst 30 -initialCwnd 16 -oooQSize 15000 -minRTO 500 -slowStartIncr 1 -bufferSize 4194304 -flavor BIC -KA ENABLED -sendBuffsize 4194304 -rstWindowAttenuate ENABLED -spoofSynDrop ENABLED -dsack enabled -frto ENABLED -maxcwnd 4000000 -fack ENABLED -tcpmode ENDPOINT
    add appqoe action appact1 -priority HIGH -tcpprofile tcp1
    add appqoe policy apppol1 -rule "client.ip.src.eq(10.102.71.31)" -action appact1
    bind lb vserver lb2 -policyName apppol1 -priority 1 -gotoPriorityExpression END -type REQUEST
    bind cs vserver cs1 -policyName apppol1 -priority 1 -gotoPriorityExpression END -type REQUEST

使用 GUI 配置基于策略的 TCP 分析

使用 GUI 启用 AppQoE

  1. 导航到“系统”>“设置”。
  2. 在详细信息窗格中,单击配置高级功能。
  3. 配置高级功能对话框中,选中 AppQoE 复选框。
  4. 单击确定

使用 GUI 配置 AppQoE 策略的步骤

  1. 导航至 App-Expert > AppQoE > 操作
  2. 在详细信息窗格中,执行以下操作之一:
  3. 要创建新操作,请单击“添加”。
  4. 若要修改现有操作,请选择该操作,然后单击“编辑”。
  5. 创建 AppQoE 操作配置 AppQoE 操作屏幕中,键入或选择参数的值。对话框的内容对应于“用于配置 AppQoE 操作的参数”中描述的参数,如下所示(星号表示必填参数):
    1. 名称- name
    2. 操作类型- respondWith
    3. 优先级 — priority
    4. 策略队列深度 — polqDepth
    5. 队列深度- priqDepth
    6. DOS 操作 — dosAction
  6. 单击创建

使用 GUI 绑定 AppQoE 策略

  1. 导航到“流量管理”>“负载平衡”>“虚拟服务器”,选择一个服务器,然后单击“编辑”。
  2. 策略部分中,单击 (+) 以绑定 AppQoE 策略。
  3. 在“策略”滑块中,执行以下操作:
    1. 从下拉列表中选择一个策略类型作为 AppQoE。
    2. 从下拉列表中选择流量类型。
  4. 策略绑定部分中,执行以下操作:
    1. 单击新建以创建新的 AppQoE 策略。
    2. 单击现有策略以从下拉列表中选择 AppQoE 策略。
  5. 设置绑定优先级,然后单击将策略绑定到虚拟服务器。
  6. 单击完成

SACK 块生成

当一个数据窗口中丢失多个数据包时,TCP 性能会降低。在这种情况下,选择性确认 (SACK) 机制与选择性重复传输策略相结合可克服此限制。对于每个传入的无序数据包,您必须生成 SACK 块。

如果不顺序的数据包适合重新组装队列块,请在块中插入数据包信息,并将完整的数据包设置为 SACK-0。如果不顺序的数据包不适合重新组装块,请将数据包作为 SACK-0 发送,然后重复早期的 SACK 块。如果一个不顺序的数据包是重复的,并且数据包信息被设置为 SACK-0,那么 D-SACK 就是块。

注意: 如果数据包是已确认的数据包,或者已经收到的不顺序的数据包,则被视为 D-SACK。

客户端更新

 Citrix ADC 设备可以在基于 SACK 的恢复期间处理客户端续约。

在 PCB 上标记 end_point 的内存检查不考虑总可用内存

在 Citrix ADC 设备中,如果内存使用阈值设置为 75%,而不是使用总可用内存,则会导致新的 TCP 连接绕过 TCP 优化。

由于缺少 SACK 块,不必要的重新传输

在非端点模式下,当您发送 DUPACK 时,如果缺少少量不顺序的数据包 SACK 块,则会触发来自服务器的其他重新传输。

SNMP 用于由于过载而绕过优化的连接数

以下 SNMP ID 已添加到 Citrix ADC 设备,以跟踪由于过载而绕过 TCP 优化的连接数。

  1. 1.3.6.1.4.1.5951.4.1.1.46.131 (tcpOptimizationEnabled)。跟踪 TCP 优化启用的连接总数。
  2. 1.3.6.1.4.1.5951.4.1.1.46.132 (tcpOptimizationBypassed). 跟踪绕过 TCP 优化的连接总数。

动态接收缓冲区

为了最大限度地提高 TCP 性能,Citrix ADC 设备现在可以动态调整 TCP 接收缓冲区大小。

尾部损失探针算法

重新传输超时 (RTO) 是在事务的尾端丢失段。如果存在应用程序延迟问题,特别是在短期 Web 事务中,则会发生 RTO。为了在事务结束时恢复段丢失,TCP 使用尾部损失探测 (TLP) 算法。 TLP 是一种只有发件人的算法。如果 TCP 连接在一段时间内没有收到任何确认,TLP 会传输最后一个未确认的数据包(丢失探测器)。在原始传输中发生尾部丢失的情况下,从丢失探头确认会触发 SACK 或 FACK 恢复。

配置尾部损失探头

若要使用尾部丢失探测 (TLP) 算法,必须在 TCP 配置文件中启用 TLP 选项,并将参数设置为符合该配置文件安全要求的值。

使用命令行启用 TLP

在命令提示窗口中,键入以下命令之一以在新配置文件或现有配置文件中启用或禁用 TLP。

注意

默认值为“禁用”。

add tcpprofile <TCP Profile Name> - taillossprobe ENABLED | DISABLED

set tcpprofile <TCP Profile Name> - taillossprobe ENABLED | DISABLED

unset tcpprofile <TCP Profile Name> - taillossprobe

示例:

add tcpprofile nstcp_default_profile – taillossprobe

set tcpprofile nstcp_default_profile –taillossprobe Enabled

unset tcpprofile nstcp_default_profile –taillossprobe

使用 Citrix ADC GUI 配置尾部损失探测算法

  1. 导航到配置 > 系统 > 配置文件,然后单击编辑以修改 TCP 配置文件。
  2. 在“配置 TCP 配置文件”页上,选中尾部丢失探测器复选框。
  3. 单击确定,然后单击完成