ADC

TCP 优化

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

拥塞控制策略

TCP 长期以来一直用于建立和管理互联网连接、处理传输错误以及平稳地将 Web 应用程序与客户端设备连接。但是网络流量变得越来越难以控制,因为数据包丢失不仅取决于网络的拥塞,而且拥塞不一定会导致数据包丢失。因此,要测量拥塞,TCP 算法应同时关注数据包丢失和带宽。

比例速率恢复 (PRR) 算法

TCP 快速恢复机制减少了数据包丢失导致的 Web 延迟。新的比例速率恢复 (PRR) 算法是一种快速恢复算法,可在损失恢复期间评估 TCP 数据。它以 Rate-Halving 为模式,使用与拥塞控制算法选择的目标窗口相适应的分数。它最大限度地减少了窗口调整,恢复结束时的实际窗口大小接近慢启动阈值 (ssthresh)。

TCP 快速打开 (TFO)

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

TFO 的工作原理

当客户端尝试建立 TFO 连接时,它会包含一个带有初始 SYN 分段的 TCP Fast Open Cookie,用于进行自我验证。如果身份验证成功,NetScaler 设备上的虚拟服务器可以在 SYN-ACK 分段中包含数据,即使它尚未收到三向握手的最后 ACK 分段。与普通的 TCP 连接相比,这最多可以节省一次完整的往返时间,后者需要在交换任何数据之前进行三次握手。

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

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

注意:

如果客户端身份验证失败,服务器将丢弃数据并仅使用表示会话超时的 SYN 来确认事件。

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

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

配置 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
<!--NeedCopy-->

在命令提示符下,键入:

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

使用 GUI 配置 TCP 快速打开

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

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

TCP HyStar

新的 TCP 配置文件参数 HyStart 启用了 HyStart 算法,这是一种慢启动算法,可以动态确定终止的安全点 (ssthresh)。它可以在不丢失大量数据包的情况下过渡到拥塞避免。默认情况下,此新参数处于禁用状态。

如果检测到拥塞,HyStart 将进入拥塞避免阶段。启用它可以在丢包率高的高速网络中提供更好的吞吐量。该算法有助于在处理交易时保持接近最大带宽。因此,它可以提高吞吐量。

配置 TCP HyStart

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

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

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

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

示例:

    add tcpprofile profile1 -hystart ENABLED
    set tcpprofile profile1 -hystart ENABLED
    unset tcprofile profile1 -hystart
<!--NeedCopy-->

使用 GUI 配置 HyStart 支持

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

TCP 突发速率控制

据观察,TCP 控制机制可能导致高速移动网络上的突发流量,对整体网络效率产生负面影响。由于诸如拥塞或第 2 层数据重传之类的移动网络状况,TCP 确认会聚集在发送方处,触发突发传输。这些以较短的数据包间隔发送的连续数据包称为 TCP 数据包爆发。为了克服流量突发问题,NetScaler 设备使用 TCP 突发速率控制技术。这种技术在整个往返时间内均匀地将数据分隔到网络中,这样数据就不会突发发送。通过使用这种突发速率控制技术,您可以实现更高的吞吐量和更低的数据包丢弃率。

TCP 突发速率控制的工作原理

在 NetScaler 设备中,此技术将数据包的传输均匀分布在往返时间 (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
<!--NeedCopy-->

其中,

已禁用 — 如果禁用突发速率控制,则 NetScaler 设备不会执行除 maxBurst 设置以外的突发管理。

已修复 — 如果 TCP 突发速率控制为“固定”,则设备使用 TCP 配置文件中提到的 TCP 连接负载发送速率值。

动态 — 如果突发速率控制为“动态”,则连接将根据各种网络条件进行调节,以减少 TCP 突发。此模式仅在 TCP 连接处于 ENDPOINT 模式时有效。启用动态突发速率控制时,TCP 配置文件的 maxBurst 参数无效。

add tcpProfile  profile1 -burstRateControl Disabled

set tcpProfile profile1 -burstRateControl Dynamic

unset tcpProfile profile1 -burstRateControl Fixed
<!--NeedCopy-->

使用命令行界面设置 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
<!--NeedCopy-->

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

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

防范封装序列 (PAWS) 算法

如果您在默认 TCP 配置文件中启用 TCP 时间戳选项,NetScaler 设备将使用封装序列防护 (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 中所述)并丢弃数据包。注意:发送 ACK 分段是保留 TCP 检测半开连接并从中恢复的机制所必需的。
  2. 如果数据包在窗口外:PAWS 会拒绝数据包,就像正常的 TCP 处理一样。
  3. 如果 SEG.TSval > Ts.recent: PAWS 接受数据包并对其进行处理。
  4. 如果 SEG.TSval <= Last.ACK.sent(到达的区段满足):PAWS 将 SEG.TSval 值复制到 Ts.recent
  5. 如果数据包按顺序排列:PAWS 接受数据包。
  6. 如果数据包未按顺序排列:该数据包被视为正常的窗口内、无序的 TCP 分段。例如,它可能会排队等待稍后交付。
  7. 如果 Ts.recent 值空闲超过 24 天:如果 PAWS 时间戳检查失败,则检查 Ts.recent 的有效性。如果发现 ts.recent 值无效,则接受该分段,PAWS rule 使用新分段中的 TSval 值更新 Ts.recent

使用命令行界面启用或禁用 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 策略,NetScaler 可以使用这些策略来区分连接并将正确的 AppQoE 操作绑定到每个策略。
  • 将 AppQoE 策略绑定到虚拟服务器。配置 AppQoE 策略后,必须将其绑定到一个或多个负载平衡、内容交换或缓存重定向虚拟服务器。

使用命令行接口配置

使用命令行界面启用 AppQoE

在命令提示符处,键入以下命令以启用该功能并验证其是否已启用:

  • enable ns feature appqoe
  • show ns feature

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

在命令提示符处,键入以下 AppQoE 操作命令和选项。 tcpprofiletobind

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
<!--NeedCopy-->

使用 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. 优先级-优先级
    4. 策略队列深度—polqDepth
    5. 队列深度— priqDepth
    6. DOS 操作—dosAction
  6. 单击创建

使用 GUI 绑定 AppQoE 策略

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

SACK 区块生成

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

如果无序数据包适合重组队列块,则在块中插入数据包信息,并将完整的区块信息设置为 SACK-0。如果无序数据包不适合重组块,请以 SACK-0 的形式发送该数据包,然后重复之前的 SACK 区块。如果无序数据包是重复数据包且数据包信息设置为 SACK-0,则对方块进行 D-SACK。

注意: 如果数据包是已确认的数据包或已收到的乱序数据包,则将其视为 D-SACK。

客户违约

在基于 SACK 的恢复期间,NetScaler 设备可以处理客户端违约。

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

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

由于缺少 SACK 区块而导致不必要的重传

在非端点模式下,当您发送 DUPACKS 时,如果少量乱序的数据包缺少 SACK 块,则会触发来自服务器的更多重传。

由于过载,用于连接的 SNMP 绕过了优化

以下 SNMP ID 已添加到 NetScaler 设备中,用于跟踪因过载而绕过 TCP 优化的连接数量。

  1. 1.3.6.1.4.1.5951.4.1.1.46.131(启用 tcpoPtimization)。跟踪通过 TCP 优化启用的连接总数。
  2. 1.3.6.1.4.1.5951.4.1.1.46.132 (tcpOptimizationBypassed)。要跟踪连接总数,请绕过 TCP 优化。

动态接收缓冲区

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

失尾探测算法

重传超时 (RTO) 是指在事务结束时丢失分段。如果存在应用程序延迟问题,尤其是在短时间的 Web 事务中,就会出现 RTO。为了恢复交易结束时丢失的分段,TCP 使用尾部丢失探测 (TLP) 算法。 TLP 是仅限发件人的算法。如果 TCP 连接在一段时间内未收到任何确认,TLP 将传输最后一个未确认的数据包(丢失探测)。如果在原始传输中出现尾部丢失,来自丢失探测器的确认会触发 SACK 或 FACK 恢复。

配置失尾探测器

要使用 Tail Loss Probe (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

使用 NetScaler GUI 配置 Tail Loss Probe 算法

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