ハードウェアのパフォーマンスが無限であると仮定した場合、Linux ボックスは 65536 を超えるオープン TCP 接続をサポートできますか?
エフェメラル ポートの数 (<65536) によって、1 つのローカル IP から 1 つのリモート IP 上の 1 つのポートへの接続数が制限されることを理解しています。
タプル (ローカル IP、ローカル ポート、リモート IP、リモート ポート) は、TCP 接続を一意に定義するものです。つまり、これらのパラメータの 1 つ以上が空いていれば、65,000 を超える接続をサポートできるということです。たとえば、複数のローカル IP から複数のリモート ホスト上の単一のポート番号への接続などです。
システムには別の 16 ビット制限がありますか? ファイル記述子の数でしょうか?
ベストアンサー1
1 つのリスニング ポートは、複数の接続を同時に受け入れることができます。
よく引用される「64K」の制限がありますが、これはクライアントごと、サーバー ポートごとの制限であり、明確にする必要があります。
各 TCP/IP パケットには基本的に、アドレス指定用の 4 つのフィールドがあります。これらは次のとおりです。
source_ip source_port destination_ip destination_port
<----- client ------> <--------- server ------------>
TCP スタック内では、これらの 4 つのフィールドは、パケットを接続 (ファイル記述子など) に一致させるための複合キーとして使用されます。
クライアントが同じ宛先の同じポートに多数の接続を持つ場合、これらのフィールドのうち 3 つは同じになり、source_port
異なる接続を区別するためだけに変化します。ポートは 16 ビットの数値であるため、特定のクライアントが特定のホスト ポートに接続できる最大数は 64K です。
ただし、複数のクライアントはそれぞれ、サーバーのポートに最大 64K の接続を持つことができ、サーバーに複数のポートがある場合や、どちらかがマルチホームの場合は、さらに接続数を増やすことができます。
したがって、実際の制限はファイル記述子です。各ソケット接続にはファイル記述子が割り当てられるため、制限は実際にはシステムが許可するように構成されているファイル記述子の数と処理するリソースの数です。最大制限は通常300Kを超えますが、次のように構成できます。sysctl。
通常のボックスで自慢されている現実的な制限は、たとえばシングル スレッドの Jabber メッセージング サーバーの場合、約 80K です。