Citrix ADC

TCP Nileを使用した TCP パフォーマンスの最適化

TCP は、次の最適化手法と輻輳制御戦略(またはアルゴリズム)を使用して、データ伝送におけるネットワークの輻輳を回避します。

輻輳制御方針

TCP(伝送制御プロトコル)は、インターネット接続の確立と管理、送信エラーの処理、およびクライアントデバイスとのWebアプリケーションのスムーズな接続のために長い間使用されてきました。しかし、パケット損失はネットワークの輻輳だけに依存せず、輻輳が必ずしもパケット損失を引き起こすわけではないため、ネットワークトラフィックの制御が困難になっています。したがって、輻輳を測定するには、TCP アルゴリズムはパケット損失と帯域幅の両方に焦点を当てる必要があります。

NILEアルゴリズム

Citrix システムズは、新しい輻輳制御アルゴリズム、NILE、LTE、LTEなどの高速ネットワーク用に設計されたTCP最適化アルゴリズムを開発しました。Nileは、フェーディング、ランダムまたは輻輳損失、リンク層の再送信、およびキャリア集約によって生じる固有の課題に対処します。

NILE アルゴリズム:

  • ラウンドトリップ時間測定に基づいてキュー遅延推定を行います。
  • 測定されたキュー遅延に反比例する輻輳ウィンドウ増加関数を使用します。この方法では、標準の TCP 方式よりもネットワーク輻輳ポイントに近づくのが遅くなり、輻輳時のパケット損失が減少します。
  • 推定キュー遅延を使用して、ネットワーク上のランダム損失と輻輳ベースの損失を区別できます。

通信サービスプロバイダーは、TCP インフラストラクチャで NILE アルゴリズムを使用して、次の操作を実行できます。

  • モバイルおよび長距離ネットワークの最適化:NILE アルゴリズムは、標準の TCP よりも高いスループットを達成します。この機能は、モバイルネットワークや長距離ネットワークで特に重要です。
  • アプリケーション認識遅延を低減し、加入者エクスペリエンスを向上させる:Nileアルゴリズムは、パケット損失情報を使用して送信ウィンドウサイズを増減するかどうかを決定し、キューイング遅延情報を使用して増分または減少のサイズを決定します。この送信ウィンドウサイズの動的な設定により、ネットワーク上のアプリケーション遅延が減少します。

コマンドラインインターフェイスを使用して NILE サポートを設定するには

コマンドプロンプトで、次のように入力します。

set ns tcpProfile <name> [-flavor NILE]

設定ユーティリティを使用した NILE サポートの設定

  1. [システム] > [プロファイル] > [TCP プロファイル] に移動し、[TCP プロファイル] をクリックします。
  2. [TCP フレーバー] ドロップダウンリストから、[NILE] を選択します。

例:

set ns tcpProfile tcpprofile1 -flavor NILE

比例レート回復(PRR)アルゴリズム

TCP 高速回復メカニズムは、パケット損失に起因する Web 遅延を低減します。新しい比例速度回復(PRR)アルゴリズムは、損失回復中に TCP データを評価する高速回復アルゴリズムです。輻輳制御アルゴリズムによって選択されたターゲットウィンドウに適した分数を使用して、Rate-Halving の後にパターン化されます。これにより、ウィンドウの調整が最小限に抑えられ、リカバリ終了時の実際のウィンドウ・サイズはSlow-Startしきい値(ssthresh)に近い値になります。

TCPファスト・オープン(TFO)

TCP ファストオープン (TFO) は、TCP の最初のハンドシェイク中に、クライアントとサーバー間で迅速かつ安全なデータ交換を可能にする TCP メカニズムです。この機能は、Citrix ADCアプライアンスの仮想サーバーにバインドされたTCPプロファイルでTCPオプションとして使用できます。TFOは、Citrix ADCアプライアンスが生成するTCP高速オープンクッキー(セキュリティクッキー)を使用して、仮想サーバーへのTFO接続を開始するクライアントを検証および認証します。TFO メカニズムを使用すると、1 回のフルラウンドトリップに必要な時間だけアプリケーションのネットワーク遅延を減らすことができます。これにより、短い TCP 転送で発生する遅延が大幅に削減されます。

TFOの仕組み

クライアントが TFO 接続を確立しようとすると、それ自体を認証する最初の SYN セグメントで TCP ファストオープン Cookie が含まれます。認証が成功すると、Citrix ADCアプライアンスの仮想サーバーがスリーウェイハンドシェイクの最終ACKセグメントを受信していなくても、SYN-ACKセグメントにデータを含めることができます。これにより、通常の TCP 接続と比較して最大 1 回のラウンドトリップが節約されます。この場合、データを交換する前に 3 ウェイハンドシェイクが必要になります。

クライアントとバックエンドサーバーは、次の手順を実行して TFO 接続を確立し、初期 TCP ハンドシェイク中にデータを安全に交換します。

  1. クライアントが自身を認証するためのTCPファスト・オープンCookieを持っていない場合、SYNパケット内のファスト・オープンCookie要求をCitrix ADCアプライアンス上の仮想サーバーに送信します。
  2. 仮想サーバーにバインドされたTCPプロファイルでTFOオプションが有効になっている場合、アプライアンスはクッキーを生成し(シークレットキーでクライアントのIPアドレスを暗号化して)、生成された高速オープンCookieをTCPオプションフィールドに含むSYN-ACKでクライアントに応答します。
  3. クライアントは、アプライアンス上の同じ仮想サーバーへの将来の TFO 接続用に Cookie をキャッシュします。
  4. クライアントは、同じ仮想サーバーへの TFO 接続を確立しようとすると、HTTP データと共に (TCP オプションとして) キャッシュされた高速オープン Cookie を含む SYN を送信します。
  5. Citrix ADCアプライアンスはクッキーを検証し、認証に成功すると、サーバーはSYNパケット内のデータを受け入れ、SYN-ACK、TFOクッキー、HTTPレスポンスでイベントを確認します。

注: クライアント認証が失敗した場合、サーバーはデータを削除し、セッションのタイムアウトを示す SYN のみでイベントを確認します。

  1. サーバー側では、サービスにバインドされたTCPプロファイルでTFOオプションが有効になっている場合、Citrix ADCアプライアンスは、接続しようとしているサービスにTCP高速オープンCookieが存在するかどうかを決定します。
  2. TCPファスト・オープン・クッキーが存在しない場合、アプライアンスはSYNパケットでクッキー要求を送信します。
  3. バックエンドサーバーがCookieを送信すると、アプライアンスはCookieをサーバー情報キャッシュに保存します。
  4. アプライアンスが所定の宛先 IP ペアのクッキーをすでに持っている場合、古いクッキーを新しいものと置き換えます。
  5. 仮想サーバが同じ SNIP アドレスを使用して同じバックエンドサーバに再接続しようとしたときに、サーバ情報キャッシュで cookie が使用可能な場合、アプライアンスは SYN パケット内のデータを cookie と結合し、バックエンドサーバに送信します。
  6. バックエンドサーバーは、データと SYN の両方でイベントを確認します。

注: サーバーがSYNセグメントのみでイベントを確認した場合、Citrix ADCアプライアンスは、元のパケットからSYNセグメントとTCPオプションを削除した後、直ちにデータパケットを再送信します。

TCP ファストオープンの設定

TCP ファストオープン(TFO)機能を使用するには、関連する TCP プロファイルで TCP ファストオープンオプションを有効にし、TFO Cookie タイムアウトパラメータにそのプロファイルのセキュリティ要件に適した値を設定します。

コマンドラインを使用して TFO を有効または無効にするには

コマンドプロンプトで、次のコマンドのいずれかを入力して、新規または既存のプロファイルで TFO を有効または無効にします。

注: デフォルト値は DABLED です。

add tcpprofile <TCP Profile Name> - tcpFastOpen ENABLED | DISABLED
set tcpprofile <TCP Profile Name> - tcpFastOpen ENABLED | DISABLED
unset tcpprofile <TCP Profile Name> - tcpFastOpen

例:

add tcpprofile Profile1 – tcpFastOpen Set tcpprofile Profile1 – tcpFastOpen Enabled unset tcpprofile Profile1 – tcpFastOpen

コマンドプロンプトで、次のように入力します。

set tcpparam –tcpfastOpenCookieTimeout <Timeout Value>

例:

set tcpprofile –tcpfastOpenCookieTimeout 30secs

GUI を使用して TCP ファストオープンを構成するには

  1. [設定] > [システム] > [プロファイル] に移動し、[編集] をクリックして TCP プロファイルを変更します。
  2. [TCP プロファイルの設定] ページで、[TCP 高速オープン] チェックボックスを選択します。
  3. [OK] をクリックし、[完了] をクリックします。

GUI を使用して TCP ファストクッキーのタイムアウト値を設定するには

[設定] > [システム**] > [設定] > [TCP パラメータの変更] に移動し、 [TCP パラメータの構成] ページに移動して、TCP ファストオープン Cookie タイムアウト値を設定します。**

TCP Hystart

新しい TCP プロファイルパラメータ hystart を使用すると、ハイスタートアルゴリズムが有効になります。ハイスタートアルゴリズムは、終了するセーフポイント(ssthresh)を動的に決定するスロースタートアルゴリズムです。これにより、大量のパケット損失を伴わずに、輻輳回避への移行が可能になります。この新しいパラメータは、デフォルトでは無効になっています。

輻輳が検出されると、Hystart は輻輳回避フェーズに入ります。これを有効にすると、パケット損失が大きい高速ネットワークのスループットが向上します。このアルゴリズムは、トランザクションの処理中に最大帯域幅に近い状態を維持するのに役立ちます。したがって、スループットを向上させることができます。

TCP ハイスタートの設定

ハイスタート機能を使用するには、関連する TCP プロファイルで [キュービックハイスタート] オプションを有効にします。

コマンドラインインターフェイス(CLI)を使用して Hystart を構成するには

コマンドプロンプトで、次のコマンドのいずれかを入力して、新規または既存の TCP プロファイルで Hystart を有効または無効にします。

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

例:

add tcpprofile Profile1 – tcpFastOpen
Set tcpprofile Profile1 – tcpFastOpen Enabled
unset tcpprofile Profile1 – tcpFastOpen

GUI を使用して Hystart サポートを構成するには

  1. [設定] > [システム] > [プロファイル] に移動し、[編集] をクリックして TCP プロファイルを変更します。
  2. [TCP プロファイルの設定] ページで、[キュービックハイスタート] チェックボックスをオンにします。
  3. [OK] をクリックし、[完了] をクリックします。

最適化テクニック

TCP は、フロー制御を最適化するために、次の最適化手法と方法を使用します。

ポリシーベースの TCP プロファイルの選択

今日のネットワークトラフィックは、かつてないほど多様で帯域幅が集中しています。トラフィックが増加すると、サービス品質(QoS)が TCP パフォーマンスに与える影響が大きくなります。QoS を強化するために、ネットワークトラフィックのクラスごとに異なる TCP プロファイルを使用して AppQoE ポリシーを構成できるようになりました。AppQoEポリシーは、仮想サーバーのトラフィックを分類して、3G、4G、LAN、WANなどの特定のタイプのトラフィックに最適化されたTCPプロファイルを関連付けます。

この機能を使用するには、TCP プロファイルごとにポリシーアクションを作成し、AppQoE ポリシーにアクションを関連付け、負荷分散仮想サーバーにポリシーをバインドします。

ポリシーベースの TCP プロファイル選択の設定

ポリシーベースの TCP プロファイル選択の設定は、次の作業で構成されます。

  • AppQoEを有効にします。TCP プロファイル機能を設定する前に、AppQoE 機能を有効にする必要があります。
  • AppQoEアクションを追加しています。AppQoE 機能を有効にした後、TCP プロファイルを使用して AppQoE アクションを設定します。
  • AppQoE ベースの TCP プロファイル選択の設定。異なるクラスのトラフィックに対してTCPプロファイル選択を実装するには、Citrix ADCアプライアンスが接続を区別し、正しいAppQoEアクションを各ポリシーにバインドできるAppQoEポリシーを構成する必要があります。
  • 仮想サーバーへの AppQoE ポリシーのバインド。AppQoEポリシーを構成したら、1つまたは複数の負荷分散、コンテンツスイッチング、またはキャッシュリダイレクト仮想サーバーにポリシーをバインドする必要があります。

コマンドラインインターフェイスを使用した構成

コマンドラインインターフェイスを使用してAppQoEを有効にするには:

コマンドプロンプトで次のコマンドを入力して、機能を有効にし、有効になっていることを確認します。

enable ns feature appqoe

show ns feature

コマンドラインインターフェイスを使用して AppQoE アクションの作成中に TCP プロファイルをバインドするには

コマンドプロンプトで、tcpprofiletobind オプションを指定して、次の AppQoE アクションコマンドを入力します。

TCP プロファイルのバインド:

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. [OK] をクリックします。

GUI を使用して AppQoE ポリシーを構成するには

  1. 「アプリ エキスパート 」>「 AppQoE」>「アクション」 に移動します。
  2. 詳細ウィンドウで、次のいずれかの操作を行います。
  3. 新しいアクションを作成するには、[追加] をクリックします。
  4. 既存のアクションを変更するには、アクションを選択し、[編集] をクリックします。
  5. AppQoE アクションの作成」 または「 AppQoE アクションの設定 」画面で、パラメーターの値を入力または選択します。ダイアログ・ボックスの内容は、「AppQoEアクションを構成するためのパラメータ」で説明されているパラメータに対応しています(アスタリスクは必須パラメータを示します)。

    1. 名前-名前
    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. [完了] をクリックします。

SACK ブロック生成

1 つのデータウィンドウで複数のパケットが失われると、TCP のパフォーマンスが低下します。このようなシナリオでは、選択的確認応答(SACK)メカニズムと選択的繰り返し再送信ポリシーを組み合わせると、この制限が克服されます。着信順不同パケットごとに、SACK ブロックを生成する必要があります。

順序外パケットが再構成キューブロックに収まる場合は、ブロックにパケット情報を挿入し、完全なブロック情報を SACK-0 に設定します。順序外パケットが再構成ブロックに収まらない場合は、パケットを SACK-0 として送信し、以前の SACK ブロックを繰り返します。順序外パケットが重複していて、パケット情報が SACK-0 に設定されている場合は、ブロックを D-SACK します。

注: パケットは、受信確認されたパケット、またはすでに受信された順序どおりのパケットである場合、D-SACK と見なされます。

クライアントの再作成

Citrix ADCアプライアンスは、SACKベースのリカバリ中にクライアントの再接続を処理できます。

PCB上のエンドポイントをマーキングするためのメモリチェックは、使用可能な合計メモリを考慮していません

Citrix ADCアプライアンスでは、メモリ使用量のしきい値が、使用可能なメモリの合計を使用する代わりに 75% に設定されている場合、新しいTCP接続はTCP最適化をバイパスします。

SACKブロックが欠落しているため、不必要な再送信

非エンドポイントモードでは、DUPACKS を送信するときに、順序どおりのパケットが少ない場合に SACK ブロックが欠落すると、サーバからの追加の再送信がトリガーされます。

過負荷のために最適化をバイパスした接続数の SNMP

過負荷が原因でTCP最適化をバイパスした接続数を追跡するために、Citrix ADCアプライアンスに次のSNMP IDが追加されました。

  1. 1.3.6.1.4.1.5951.4.1.1.46.13 (tcpOptimizationEnabled). TCP 最適化で有効にされた接続の合計数を追跡します。
  2. 1.3.6.1.4.1.5951.4.1.1.46.132 (tcpOptimizationBypassed). 接続の総数を追跡するには、TCP 最適化をバイパスします。

動的受信バッファ

TCPパフォーマンスを最大化するために、Citrix ADCアプライアンスはTCP受信バッファサイズを動的に調整できるようになりました。