1. ホーム

[解決済み】最新のLinuxボックスが持つことができるオープンTCP接続の理論上の最大数は何ですか?

2022-05-01 14:39:02

質問

ハードウェアの性能が無限大であるとして、Linuxは65536個のTCPコネクションを開くことができますか?

エフェメラルポートの数(<65536)が、1ローカルIPから1リモートIPの1ポートへの接続数を制限していることは理解しています。

タプル(ローカルIP、ローカルポート、リモートIP、リモートポート)はTCP接続を一意に定義するものです。これは、これらのパラメータのうち1つ以上が自由であれば、65K以上の接続をサポートできることを意味しますか。

他に16ビットの制限があるのでしょうか? ファイルディスクリプタの数でしょうか?

解決方法は?

1つのリスニングポートで複数の接続を同時に受け付けることができます。

よく引き合いに出される「64K」という制限がありますが、これは 1クライアント1サーバーポートあたり ということで、明確にする必要があります。

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程度が現実的な限界と言われています。