web-dev-qa-db-ja.com

トラフィックの多いサイトは、どのようにして65535以上の接続にサービスを提供しますかTCP接続?

1つのマシンが持つことができるポートの数に制限があり、ソケットが未使用のポート番号にしかバインドできない場合、リクエストが非常に多い(最大ポート番号を超える)場合、サーバーはこれをどのように処理しますか?それは、システムを分散させることによって、つまり、多くのマシン上の多くのサーバーによって行われるだけですか?

39
alh

ポート番号を非常に誤解している:サーバーは1つのポートでのみリッスンし、その1つのポートに接続しているクライアントからの多数のオープンソケットを持つことができます。

TCPレベルでは、タプル(ソースIP、ソースポート、宛先IP、宛先ポート)は、同時接続ごとに一意である必要があります。つまり、1つのクライアントがサーバーに対して65535を超える同時接続を開くことはできません。しかし、サーバーは(理論的には)サーバー65535の同時接続クライアントごとを実行できます。

したがって、実際には、サーバーは、サーバーへのTCP接続の数ではなく、要求に対応するために必要なCPU能力、メモリなどの量によってのみ制限されます。

66

あなたは間違っています-ソケットの一意性は4つの要因によって決定されます:

  1. ローカルIPアドレス
  2. ローカルポート番号
  3. リモートIPアドレス
  4. リモートポート番号

ネットワークサービスを提供する場合、1。と2.は通常静的です(IP 10.0.0.1、ポート80など)が、何千もの接続が想定されていない限り単一のクライアントから(または単一のNATゲートウェイ)、ローカルリソースが不足する前に、3と4の可能な組み合わせの境界をプッシュしません。

そのため、実際には、クライアントは接続に既に使用されているポートを使用して別の宛先IPアドレスへの接続を開くことはありませんが、ポート番号の枯渇は、ほとんどすべてのアプリケーションで問題が最も少ないことになります。クライアント側。

問題は非常に現実的なもので、NATゲートウェイ(ルーター)が多数のオープンアウトバウンド接続(トレントなど)を開いているクライアントにサービスを提供している)です。 NATが空になっています。この場合、NATゲートウェイは追加の関連付けを作成できないため、クライアントをインターネットから効果的に切断します。

16
the-wabbit

問題は、大量(> 64k)の接続数を処理する方法でした。最も一般的な2つの方法は次のとおりです。

  • サーバーを追加すると、src/dstアドレスとポート番号のタプルの数が増えます。複数のサーバー間で負荷を共有する方法は複数あります。 DNSラウンドロビンは1つです。他にあります

  • 「キャリアグレードのNAT」を展開します(私の見解では、友人はあざけるように正しく正しく「ミドル級のNAT」と呼んでいます)。これは、本質的にはNATのNAT=です。これは、アプリケーションに非常に悪い影響を与えますが、一部の大規模プロバイダーがIPv4スペースやポート番号、および/またはIPv6に移行したくない。

2
user8162