ハードウェアのパフォーマンスが無限であると仮定すると、Linuxボックスは65536を超えるTCP接続をサポートできますか?
一時ポートの数(<65536)は、1つのローカルIPから1つのリモートIP上の1つのポートへの接続数を制限することを理解しています。
タプル(ローカルIP、ローカルポート、リモートIP、リモートポート)は、TCP接続を一意に定義するものです。これは、これらのパラメーターが複数ある場合に65K以上の接続をサポートできることを意味します。例えば複数のローカルIPから複数のリモートホスト上の単一のポート番号への接続。
システムに別の16ビット制限はありますか?おそらくファイル記述子の数?
単一のリスニングポートは、複数の接続を同時に受け入れることができます。
しばしば引用される「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です。
サーバーの実行を考えており、1台のマシンから提供できる接続の数を決定しようとする場合は、 C10kの問題 と、多数のクライアントに同時にサービスを提供することに関連する潜在的な問題についてお読みください。
生のソケット(SOCK_RAW
)を使用し、ユーザーランドでTCPを再実装した場合、この場合の答えは(local address, source port, destination address, destination port)
タプルの数(ローカルアドレスあたり〜2 ^ 64)だけに制限されると思います。
もちろん、これらすべての接続の状態を保持するには多くのメモリが必要になります。また、カーネルTCPスタックが動揺したり応答したりしないようにiptablesルールを設定する必要があると思いますあなたに代わって。