2017-07-05 31 views
1

HTTPクライアントが接続タイムアウトにどのように反応するか、つまりポート上でリッスンしているサーバーがどこにあるのかを確認したいのですが、接続を設定するプロセスは非常に遅く、クライアントはあきらめて接続タイムアウトを返します。接続は拒否されるべきではなく、受け入れられずにソケットのタイムアウトが続くべきです。ローカルポートのネットワーク遅延をシミュレートする方法は?

これまでのところ、私はこのような何かを書くことができるだろうと想像し、 ServerSocketをオーバーライドすることによって、ネットワークの遅延を導入しようとしてきました

...

public SlowServerSocket extends ServerSocket { 
    // (This method doesn't actually exist). 
    @Override 
    public void processBytesPassedOnByOperatingSystem(byte[] bytes) { 
     Thread.sleep(delay); 
     // Client has already returned a connection timeout. 
     super.processBytesPassedOnByOperatingSystem(bytes); 
    } 
} 

...しかし、私は行き止まりにぶつかります私が抽象化のレベルに達すると(それはネイティブメソッドで隠されているようです)。私の偽のサーバーは接続を受け入れてから何もせず、ソケットのタイムアウトを引き起こします。

私はまた解決策をオンラインで探しましたが、私はSlowSocketをJMeterライブラリから見つけましたが、クライアント側で使用されているようです(クライアントを無効にすることはできませんその結果、SlowSocketが使用されます)。

提案がありますか?

+0

ノートの著者です:私は、この答えを見つけましたhttps://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout- 「10.255.255.1」などのルーティング不可能なアドレスに接続することを示唆しています。しかし、私はそれが最も信頼できる/ポータブルな解決策であるとは確信していません。 – Pig

+0

'SecurityManager'をサブクラス化し、' checkAccept() 'メソッドをオーバーライドしてスリープ状態にしてから、System.setSecurityManager(overridenSecurityManager)を呼び出すこともできます。ここからアイデアが得られます:https://stackoverflow.com/questions/7800960/java-socket-listen-before-accept?rq=1 – Pig

答えて

0

私はHTTPクライアントがポートで待機サーバーがあります接続タイムアウト、すなわちにどのように反応するかを見てみたいが、接続の設定プロセスは、クライアントがあきらめるほど遅く、接続タイムアウトを返します。 。

お客様の要件には、矛盾があります。接続タイムアウトは、ピアホストがまったく応答しないときに発生します。通常はファイアウォールが原因です。それは遅いサーバーアプリケーションとは関係ありません。サーバーは「接続を設定する」ことはありません。つまり、TCPスタックが行います。

接続は、以下を除き、

リスニングプロセスがある場合、それはできませんが拒否されるべきではありません。

これを受け入れてから、ソケットのタイムアウトを行うべきではありません。

これはまさにあなたが書いたコードが生成するものです。

しかし、およびサーバープラットフォームは、Windowsではないとだけ場合場合、接続タイムアウトを製造するための別の方法があります:バックログキューがいっぱいにしましょう。これを行うには、サーバーにすべての通常のソケット設定手順を実行させますが、accept()を呼び出すことは決してせず、クライアントに多数の接続試行を実行させます。しかし、サーバープラットフォームがWindowsの場合、接続拒否が発生します。

+0

「TCPスタック」の時に接続が拒否される(申し訳ありませんが、そのポートでリッスンするプロセスがないため、宛先ポートへの接続に失敗しますか。そして、TCPパケットが目的地に到達していないときの接続タイムアウト/応答は時間内に戻っていませんか? – Pig

+0

@ Pigリスニングプロセスがない場合、またはバックログキューがいっぱいで、サーバープラットフォームがWindowsの場合、接続は拒否されます。私はすでにそれを言った。ピアが時間内に応答しない場合、またはまったく応答しない場合、接続はタイムアウトします。私はすでにそれを言った。 – EJP

-1

また、私はJMeterライブラリからSlowSocketを見つけましたが、クライアント側で使用されているようです(オーバーライドすることはできませんクライアントはSlowSocketを使用するようにします)。

ネットワークレイテンシをシミュレートするのに、Sniffyを使用できます。これは、Java TCPスタックとシームレスに統合され、アプリケーション側からの変更を必要としません。 documentation on emulating network issuesを参照してください。demo.sniffy.ioでご利用いただけます

オンラインデモ - 「ネットワーク接続」タブに移動し、右下の隅にウィジェットをクリックするとen.wikipedia.orgのための1000ミリ秒を言うために遅延を設定します。ブラウザのページを更新すると、ページの読み込みに1秒以上かかることがわかります。 javaagent integrationは、ウェブ以外のアプリケーションでも利用できます。

enter image description here

免責事項:私はSniffy

+0

しかし、それは遅い接続フェーズをシミュレートしますか?そしてもしそうなら、どうですか? – EJP

+0

TCPの接続フェーズは基本的に最初のパケットに追加のラウンドトリップを追加します(SYNおよびSYN-ACKパケットはアプリケーションデータを持ちません; ACKパケットでのみ送信されます)。 Javaアプリケーションでは、SniffyはIPパケットにアクセスできないため、ここで説明するように遅延を追加するヒューリスティックを使用します。指定された遅延がクライアント側のSocket.connect()メソッドに追加されます – bedrin

+0

これは要求されたものではありません。彼は*既存の*クライアントが接続タイムアウトにどのように反応するかを見たいと思っています。 – EJP

関連する問題