278

ハードウェアからの無限のパフォーマンスを想定すると、Linuxボックスは> 65536のオープンTCP接続をサポートできますか?

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

タプル(ローカルIP、ローカルポート、リモートIP、リモートポート)は、TCP接続を一意に定義するものです。これは、これらのパラメーターが複数空いている場合に、65Kを超える接続をサポートできることを意味しますか。たとえば、複数のローカルIPから複数のリモートホスト上の単一のポート番号への接続。

システムに別の16ビット制限はありますか?おそらくファイル記述子の数?

4

3 に答える 3

419

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です。

于 2010-02-25T09:01:45.817 に答える
20

サーバーを実行して、1台のマシンから提供できる接続の数を決定しようとしている場合は、C10k問題 と、多数のクライアントに同時にサービスを提供することに伴う潜在的な問題について読むことをお勧めします。

于 2010-09-07T18:30:14.940 に答える
13

rawソケット(SOCK_RAW)を使用し、ユーザーランドでTCPを再実装した場合、この場合の答えは(local address, source port, destination address, destination port)タプルの数(ローカルアドレスあたり〜2 ^ 64)によってのみ制限されると思います。

もちろん、これらすべての接続の状態を維持するには多くのメモリが必要です。カーネルTCPスタックが混乱したり、ユーザーに代わって応答したりしないように、いくつかのiptablesルールを設定する必要があると思います。

于 2013-11-11T19:44:10.630 に答える