TCPの秘密兵器:ネットワークフロー制御とネットワークの混雑制御

TCP信頼性輸送
私たちは皆、信頼できる輸送プロトコルとしてTCPプロトコルに精通していますが、輸送の信頼性をどのように保証しますか?

信頼できる送信を実現するには、データの腐敗、損失、複製、秩序外の破片など、多くの要因を考慮する必要があります。これらの問題を解決できない場合、信頼できる送信を達成できません。

したがって、TCPは、シーケンス番号、確認応答、再送信制御、接続管理、ウィンドウコントロールなどのメカニズムを使用して、信頼できる伝送を実現します。

このホワイトペーパーでは、TCPのスライドウィンドウ、フロー制御、輻輳制御に焦点を当てます。再送信メカニズムは、次のセクションで別々にカバーされています。

ネットワークフロー制御
ネットワークフロー制御またはネットワークトラフィックコントロールは、実際には生産者と消費者の間の微妙な関係の現れです。おそらく、このシナリオに職場やインタビューで多くのシナリオに出くわします。生産者の生産能力が消費者の消費能力を大きく超えた場合、キューは無期限に成長します。より深刻なケースでは、RabbitMQメッセージが積み上げられすぎると、MQサーバー全体のパフォーマンス劣化を引き起こす可能性があることがわかるかもしれません。同じことがTCPにも当てはまります。チェックされていないままにすると、あまりにも多くのメッセージがネットワークに配置され、消費者は容量を超えていますが、プロデューサーは引き続き重複したメッセージを送信します。これはネットワークのパフォーマンスに大きく影響します。

この現象に対処するために、TCPは、フロー制御として知られているレシーバーの実際の受信容量に基づいて送信されるデータの量を制御するメカニズムを提供します。受信者は受信ウィンドウを維持し、送信者は送信ウィンドウを維持します。これらのウィンドウは単一のTCP接続のみであり、すべての接続がウィンドウを共有するわけではないことに注意する必要があります。

TCPは、受信ウィンドウに変数を使用してフロー制御を提供します。受信ウィンドウは、送信者にキャッシュスペースの量を示しています。送信者は、受信者の実際の受け入れ能力に従って送信されるデータの量を制御します。

受信機のホストは、送信者に受信できるデータのサイズを通知し、送信者はこの制限まで送信します。この制限はウィンドウサイズです。TCPヘッダーを覚えていますか?受信ウィンドウフィールドがあります。これは、受信機が受け取ることができる、または喜んで受け取ることができるバイト数を示すために使用されます。

送信者ホストは、レシーバーホストがまだデータを受け入れることができるかどうかを検出するために使用されるウィンドウプローブパケットを定期的に送信します。受信者のバッファがあふれる危険にさらされている場合、ウィンドウサイズは、送信者に送信されるデータの量を制御するように送信者に指示するために、より小さな値に設定されます。

ネットワークフロー制御図は次のとおりです。

トラフィックコントロール

ネットワーク輻輳制御
輻輳制御を導入する前に、受信ウィンドウと送信ウィンドウに加えて、送信者が受信ウィンドウにデータの送信を開始するレートの問題を解決するために主に使用される混雑ウィンドウもあることを理解する必要があります。したがって、輻輳ウィンドウは、TCP送信者によっても維持されます。データを送信するのに適したデータの量を決定するためにアルゴリズムが必要です。これは、データを送信しすぎたり、多すぎたりすることは理想的ではないため、輻輳ウィンドウの概念です。

以前のネットワークフロー制御では、私たちが避けたのは、送信者がレシーバーのキャッシュをデータで埋めることでしたが、ネットワークで何が起こっているのかわかりませんでした。通常、コンピューターネットワークは共有環境にあります。その結果、他のホスト間の通信により、ネットワークの輻輳が発生する可能性があります。

ネットワークが混雑している場合、多数のパケットが送信され続けると、パケットの遅延や損失などの問題が発生する可能性があります。この時点で、TCPはデータを再送信しますが、再送信によりネットワークの負担が増加し、より大きな遅延とパケット損失が増えます。これは悪循環に陥り、大きくなり続けることができます。

したがって、TCPはネットワーク上で起こっていることを無視することはできません。ネットワークが混雑すると、TCPは送信するデータの量を減らすことで犠牲になります。

したがって、混雑制御が提案されています。これは、送信者からのデータでネットワーク全体を埋めることを避けることを目的としています。送信者が送信するデータの量を調整するために、TCPは輻輳ウィンドウと呼ばれる概念を定義します。輻輳制御アルゴリズムは、送信者から送信されたデータの量を制御するために、ネットワークの輻輳度に応じて輻輳ウィンドウのサイズを調整します。

輻輳窓とは何ですか?これは送信ウィンドウと何の関係がありますか?

輻輳ウィンドウは、送信者が送信できるデータの量を決定する送信者によって維持される状態変数です。輻輳ウィンドウは、ネットワークの混雑レベルに応じて動的に変化します。

送信ウィンドウは、受信者が受信できるデータの量を示す送信者と受信機の間の合意されたウィンドウサイズです。輻輳ウィンドウと送信ウィンドウが関連しています。送信ウィンドウは通常、渋滞と受信ウィンドウの最小値に等しくなります。つまり、swnd = min(cwnd、rwnd)です。

混雑ウィンドウCWNDは次のように変更されます。

ネットワークに混雑がない場合、つまり、再送信タイムアウトが発生しないと、輻輳ウィンドウが増加します。

ネットワークに輻輳がある場合、うっ血ウィンドウが減少します。

送信者は、ACK認定パケットが指定された時間内に受信されるかどうかを観察することにより、ネットワークが混雑しているかどうかを決定します。送信者が指定された時間内にACK確認パケットを受け取らない場合、ネットワークは混雑していると見なされます。

輻輳ウィンドウに加えて、TCP輻輳制御アルゴリズムについて議論する時が来ました。 TCP混雑制御アルゴリズムは、3つの主要な部分で構成されています。

スロースタート:当初、CWNDの輻輳ウィンドウは比較的小さく、送信者は輻輳ウィンドウを指数関数的に増加させて、ネットワークの容量に迅速に適応します。
混雑回避:輻輳ウィンドウが特定のしきい値を超えた後、送信者はうっ血ウィンドウを直線的に増やして、うっ血ウィンドウの成長率を遅くし、ネットワークの過負荷を避けます。
迅速な回復:輻輳が発生した場合、送信者は輻輳ウィンドウを半分にし、速い回復状態に入り、受信した重複ACKを介したネットワーク回復の位置を決定し、その後、輻輳ウィンドウの増加を続けます。

スロースタート
TCP接続が確立されると、輻輳ウィンドウCWNDが最初に最小MSS(最大セグメントサイズ)値に設定されます。これにより、初期送信率はMSS/RTTバイト/秒についてです。実際に利用可能な帯域幅は通常、MSS/RTTよりもはるかに大きいため、TCPは最適な送信速度を見つけたいと考えています。これは、スロースタートによって達成できます。

スロースタートプロセスでは、CWNDの輻輳ウィンドウの値は1ミリ秒に初期化され、送信されたパケットセグメントが認められるたびに、CWNDの値が1つのMSS、つまりCWNDの値が2ミリ秒になります。その後、パケットセグメントの送信が成功するたびに、CWNDの値は2倍になります。特定の成長プロセスを次の図に示します。

 ネットワーク輻輳制御

ただし、送信率は常に成長することはできません。成長はいつか終わらなければなりません。では、送信率はいつ終了しますか?スロースタートは通常、いくつかの方法のいずれかで送信率の増加を終了します。

最初の方法は、スロースタートの送信プロセス中のパケット損失の場合です。パケットの損失が発生すると、TCPは送信者の輻輳ウィンドウCWNDを1に設定し、スロースタートプロセスを再起動します。この時点で、スロースタートしきい値SSTHRESHの概念が導入され、その初期値はパケット損失を生成するCWNDの値の半分です。つまり、うっ血が検出されると、SSthreshの値はウィンドウ値の半分です。

2番目の方法は、スロースタートしきい値ssthreshの値と直接相関することです。 ssthreshの値は、輻輳が検出されたときにウィンドウ値の半分であるため、CWNDがSSthreshよりも大きい場合、各倍増でパケットの損失が発生する可能性があります。したがって、CWNDをSSTHRESHに設定することが最善です。これにより、TCPが混雑制御モードに切り替えてスロースタートを終了することが最善です。

スロースタートが終了する最後の方法は、3つの冗長ACKが検出された場合、TCPが迅速な再送信を実行し、回復状態に入ることです。 (3つのACKパケットがある理由が明らかでない場合、再送信メカニズムで個別に説明されます。)

混雑回避
TCPが輻輳制御状態に入ると、CWNDはうっ血しきい値SSTHRESHの半分に設定されます。これは、パケットセグメントを受信するたびにCWNDの値を2倍にすることができないことを意味します。代わりに、各伝送が完了した後、CWNDの値が1つのMSS(最大パケットセグメント長)のみ増加する比較的保守的なアプローチが採用されます。たとえば、10個のパケットセグメントが認められていても、CWNDの値は1つのMSSによってのみ増加します。これは線形成長モデルであり、成長にも上限があります。パケットの損失が発生すると、CWNDの値がMSSに変更され、SSthreshの値はCWNDの半分に設定されます。または、3つの冗長ACK応答を受信すると、MSSの成長も停止します。 CWNDの値を半分にした後も3つの冗長ACKが受信されている場合、SSthreshの値はCWNDの値の半分として記録され、高速回復状態が入力されます。

迅速な回復
速い回復状態では、CWNDの輻輳ウィンドウの値は、受信した各ACK、つまり順番に到着しないACKに対して1つのMSSによって増加します。これは、可能な限り送信効率を改善するために、ネットワーク内で正常に送信されたパケットセグメントを利用するためです。

失われたパケットセグメントのACKが到着すると、TCPはCWNDの値を減少させ、その後、うっ血回避状態に入ります。これは、輻輳ウィンドウのサイズを制御し、ネットワークの混雑をさらに増やすことを避けるためです。

混雑制御状態の後にタイムアウトが発生した場合、ネットワーク条件はより深刻になり、TCPは輻輳回避状態からスロースタート状態に移動します。この場合、輻輳ウィンドウCWNDの値は1 MSSに設定され、最大パケットセグメントの長さ、スロースタートしきい値SSTHRESHの値はCWNDの半分に設定されます。これの目的は、ネットワークが回転速度とネットワーク輻輳の程度のバランスをとるために回復した後、輻輳ウィンドウのサイズを再等級的に増やすことです。

まとめ
信頼できる輸送プロトコルとして、TCPは、シーケンス番号、謝辞、再送信制御、接続管理、ウィンドウコントロールによる信頼できる輸送を実装します。その中で、フロー制御メカニズムは、レシーバーの実際の受信能力に応じて送信者が送信したデータの量を制御し、ネットワークの混雑とパフォーマンスの劣化の問題を回避します。輻輳制御メカニズムは、送信者から送信されたデータの量を調整することにより、ネットワーク輻輳の発生を回避します。輻輳ウィンドウと送信ウィンドウの概念は互いに関連しており、送信者のデータの量は、輻輳ウィンドウのサイズを動的に調整することにより制御されます。スロースタート、混雑回避、迅速な回復は、TCP混雑制御アルゴリズムの3つの主要部分であり、ネットワークの容量と輻輳度に適応するためにさまざまな戦略を通じて輻輳ウィンドウのサイズを調整します。

次のセクションでは、TCPの再送信メカニズムを詳細に調べます。再送信メカニズムは、信頼できる送信を実現するためのTCPの重要な部分です。紛失、破損、または遅延データを再送信することにより、データの信頼できる送信が保証されます。再送信メカニズムの実装原則と戦略を次のセクションで詳細に紹介および分析します。乞うご期待!


投稿時間:2月24日 - 2025年