web-dev-qa-db-ja.com

TCP Windowsで確立された接続のタイムアウト

次のような状況です。

  • クライアントコンピューター上のアプリケーション(Firebird DBクライアント)がポート3050でTCPサーバーへの接続を開く
  • クライアントでのアプリケーションのクラッシュ、アプリケーションの終了
  • サーバー上のnetstatは、クライアントIPアドレスに対してポート3050で確立されたTCP接続をまだ示しています。
  • 電源がオフのクライアント
  • サーバー上のnetstatは、クライアントIPアドレスに対してポート3050で確立されたTCP接続をまだ示しています。
  • 数分待った
  • サーバー上のnetstatは、クライアントIPアドレスに対してポート3050で確立されたTCP接続をまだ示しています。

Windows(この場合Win8.1)で確立された接続にタイムアウトはありますか?このタイムアウトを変更できますか?

私は this を見つけましたが、これは確立された接続に関する私の質問に答えていないようです。

4
Alois Heimer

デフォルトでは、確立されたTCP接続はタイムアウトしません( ただし、ハードウェアの制限により、タイムアウトする可能性があります )。

アプリケーションはTCPキープアライブメカニズムを使用して、接続の切断をチェックできます。 Firebirdの場合(> 1.5)TCPキープアライブが有効 .

キープアライブ「タイムアウト」はサーバーで設定する必要があります。デフォルトのTCP Windowsのキープアライブ時間間隔 2時間です(ただし5分を推奨) 。これは _HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime_で設定できます。 レジストリキー。

上記のリンクの詳細:

失敗したクライアント接続は、次の時間間隔の後に閉じられます:KEEPALIVE_TIME+ ( KEEPALIVE_PROBES+1)* KEEPALIVE_INTERVAL

Windowsで次の対応するレジストリ値を使用:

_KEEPALIVE_TIME = KeepAliveTime (default: 7200 seconds)
KEEPALIVE_INTERVAL = KeepAliveInterval (default: 1 second)
KEEPALIVE_PROBES = TCPMaxDataRetransmissions (default: 5)
_

だが:

キープアライブセグメントは、デフォルトでは2時間ごとに送信されます[...]。有効にした場合でも、NetBIOSなどの他の上位層プロトコルは独自のキープアライブ値を送信します。上位層プロトコルが使用するキープアライブ間隔がTCPキープアライブ間隔より短い場合、TCPキープアライブ値は送信されません。たとえば、NetBIOSセッションTCP/IPは60分ごとにNetBIOSキープアライブ要求を送信するため、TCP NetBIOSセッションで有効になっているキープアライブ値は使用されません。

6
Alois Heimer

TCP仕様にはタイムアウトまたはキープアライブメカニズムがありません。設定するように設定できるレジストリエントリがありますTCPキープアライブですが、キープアライブを使用するかどうかは実際のアプリケーション次第です。 。この質問の答えを見てください:

システム全体で有効にするTCPキープアライブ

1
joeqwerty