ソケットが予期せず閉じられました
-
06-07-2019 - |
質問
サーバーのテストプログラムを書いています。テストアプリでは、多数のクライアントをサーバーに接続しようとしますが、しばらくすると、次のようなエラーが発生します。
Connection reset by peer: socket write error
または
java.net.SocketException: Connection reset
または
java.net.ConnectException: Connection refused: connect
サーバーに接続するすべてのクライアントに新しいソケットを使用します。
この奇妙な行動について誰かに教えてもらえますか?
解決
残念ながら、サーバーの性質に関する詳細は提供していません。典型的なTCPサーバーを書いていると思います。この回答では、Java固有の詳細については話さない。
簡単なアドバイスは、クライアント接続の間に遅延を挿入することです。これがないと、サーバーへのDoS攻撃を積極的にシミュレートしています。
長いものについては、以下をお読みください。
通常、TCPサーバーは、(美しいCインターフェイスで) int sockfd = socket(...)
関数を呼び出して結果を渡すことにより、 listening を1つだけ作成します( sockfd
の場合)から bind()
および listen()
関数へ。この準備の後、サーバーは accept()
を呼び出します。これにより、サーバーは眠りに落ちます(ソケットがブロッキングとしてマークされている場合)、そして地球の反対側のクライアントが connect()
関数、OSカーネルをサポートする accept()
(サーバー側)は、接続されたソケットを作成します。
実際に可能な保留中の接続の数は、 listen()
関数を調べることで知ることができます。 listen()
には、 OSカーネルがソケットにキューイングする接続の最大数を定義する backlog パラメーターがあります(これは基本的に SYN_RCVD
および ESTABLISHED
状態のすべての接続)。歴史的に1980年代の backlog の推奨値は5のようなものでしたが、これは私たちの時代には明らかに悲惨でした。たとえば、FreeBSD 7.2では、 backlog の hard limit は次のように入力することで推測できます。
% sysctl kern.ipc.somaxconn kern.ipc.somaxconn: 128
およびFedora 10の場合:
% cat /proc/sys/net/core/somaxconn 128
P.S。
ひどい英語でごめんなさい。
他のヒント
ウェブ/アプリサーバーは、一度に有限量のクライアントにのみサービスを提供できます。
この制限に達すると、接続が拒否/リセットされます。
質問に答える希望。
乾杯
OSとWebサーバーには、開始/承認できる接続の速度と数に制限があります。サーバーでパフォーマンステストを実行する場合は、これらの制限に対する解決策があるため、Apache JMeterを試してください。