[解決済み】最新のLinuxボックスが持つことができるオープンTCP接続の理論上の最大数は何ですか?
質問
ハードウェアの性能が無限大であるとして、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程度が現実的な限界と言われています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン