6

NettyAPIドキュメントから

connectTimeoutMillis = "接続タイムアウト(ミリ秒単位)。無効の場合は0。"

ReadTimeoutHandler =特定の期間内にデータが読み取られなかった場合に、ReadTimeoutExceptionを発生させます。

クライアントの観点から、私は前述のことを次のように解釈するのは正しいですか?

クライアントは、最大「connectTimeoutMillis」の間ホストへの接続を試みます。接続が確立され、ReadTimeoutHandlerがパイプラインに追加されていない場合、チャネルは応答を無期限に待機できます。ReadTimeoutHandlerがパイプラインに追加された場合、timeoutSecondsが経過すると、ReadTimeoutExceptionが発生します。

一般的に、ホストへの接続は最大'x'秒だけ試みたいのですが、要求がネットワーク経由で送信された場合は、応答を最大'y'秒待ちたいと思います。それが答えを形作る/影響を与える場合、クライアントはNettyですが、サーバーはそうではありません。

フォローアップ:ReadTimeoutHandlerのtimeoutSecondsは、連続するバイト間のタイムアウトですか、それとも要求/応答全体のタイムアウトですか?例:timeoutSecondsが60で、1バイト(合計1024個のうち)が59秒ごとに読み取られた場合、応答全体が60416秒で正常に読み取られますか、それとも合計経過時間が60秒を超えたために失敗しますか?

4

2 に答える 2

2

ReadTimeoutHandlerは、応答の概念を理解していません。Netty 3のmessageReceivedイベント、またはNetty 4のinboundBufferUpdatedイベントのいずれかのみを理解します。NIOの観点から言えば、この動作の正確な影響は、ReadTimeoutHandlerがパイプラインのどこにあるかによって異なります。(私はOIOを使用したことがないので、動作がまったく同じかどうかはわかりません)。

ReadTimeoutHandlerがパイプライン内のフレームデコーダーの下にある場合(つまり、ネットワークに近い場合)、説明する動作は正しいです。1バイトの読み取りでタイマーがリセットされ、特定したように、応答に時間がかかる可能性があります。読むべき。サーバーを作成している場合、これを悪用して、攻撃者に代わってわずかな労力でサービス拒否攻撃を仕掛けることができます。

ReadTimeoutHandlerがフレームデコーダーの上にある場合、それは応答全体に適用されます。これがあなたが探している行動だと思います。

ReadTimeoutHandlerは、要求を送信したかどうかも認識しないことに注意してください。データがソケットから読み取られたかどうかのみを考慮します。接続が永続的であり、要求が送信されたときにのみ読み取りタイムアウトを発生させたい場合は、要求/応答対応のタイムアウトハンドラーを構築する必要があります。

于 2012-11-16T17:10:53.200 に答える
1
  1. はい、接続タイムアウトと読み取りタイムアウトの違いを正しく識別しました。ドキュメントに反対の記載がある場合でも、デフォルトまたはゼロの接続タイムアウトは、無限ではなく約60〜70秒を意味し、接続タイムアウトパラメータは、デフォルトを増やすのではなく、減らすためにのみ使用できることに注意してください。

  2. 読み取りタイムアウトは、read()を呼び出すと開始し、期限切れになるかデータが到着すると終了します。これは、read()が最初のバイトの到着を待機するのをブロックできる最大時間です。1回の呼び出しで2回目はブロックされません。

于 2012-11-15T02:14:21.077 に答える