トップ回答者
Windows 2003 Server でのTCPコネクションの保持時間は?

質問
-
サーバとクライアントの間でTCP接続を行う要件があります。
サーバとクライアントは以下の要件でコネクションを接続します
・サーバとクライアントはセキュリティ区分が異なるため、間にはファイアウォールを導入する予定です。
・クライアント側から接続要求があると、サーバはTCP接続を確立します
・サーバのアプリケーションはTCPのコネクションの保持時間を制御しておらず、FINパケットを受けない限りコネクションを保持続けます。
・サーバーのアプリケーションは保持しているTCPコネクションに対してKeepAliveのためのパケットを送信することはありません。
・サーバーはWindows 2003 Server Standard Edition R2 SP2 を利用しています。
・ファイアウォールは一定時間通信がないTCPコネクションはコネクションテーブルから削除します。
上記のような条件の場合、ファイアウォールは一定時間通信のないコネクションをコネクションテーブルから削除してしまうため、サーバのアプリケーションが「接続できている」と考えているコネクションが通信できなくなる、という事象が発生する可能性があります。
そこで、ファイアウォールのコネクション保持時間について適切な時間を設定したいと考えています。
サーバのアプリケーションではコネクション保持について一切関与していないため、
サーバのコネクション保持時間はOSであるWindows 2003 Serverの設定に依存すると考えています。
この時、参照すべき以下のレジストリに記載されている値であるという認識です。その上で、
・この認識が正しいかどうか
・コネクションを保持するにあたり、各レジストリの値がどのように動作するのか
以上についてご教示いただければ幸いです。
【対象となるレジストリキー】
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
・KeepAliveInterval :デフォルト値 2時間
・KeepAliveTime :デフォルト値 1秒
・TcpMaxDataRetransMissions :デフォルト値 5回
・TcpTimedWaitDelay : デフォルト値 120秒
【保持のための動作】
コネクションが保持された後、
1.KeepAliveInterval の時間経過すると、 クライアントに対してKeepAliveパケットが送信される
KeepAliveパケットは現在保持しているコネクションのポートに対して行われる。
サーバとクライアントがssh接続をしているなら、サーバの接続されているポートからクライアントのTCP 22ポートに対して、KeepAliveパケットが送信される。(パケットの種類はDataパケットであり、SynやAckではない)
2.KeepAliveパケットの応答がKeepAliveTime の時間内に返ってくれば、接続は保持される
KeepAliveパケットの応答がKeepAliveTime の時間内に返ってこない場合、TcpMaxDataRetransMissions 回数までKeepAliveパケットは再送される。
これ以降の再送について、1回目(KeepAliveTime以内に応答が返ってこなかった場合の次の再送時)の再送までの間隔は、このコネクションでの平均的なRTT値を基に算出される。以降、再送回数が1回増える度に、再送間隔は先の再送間隔の倍になっていく。
3.TcpMaxDataRetransMissions 回数まで再送が繰り返され、それでもKeepAliveパケットへの応答がない場合、コネクションは無効になる。
このとき、サーバのコネクションテーブルが該当のコネクションを無効にするだけで、クライアントに対してFINパケットは送信しない。
====== ここまで =====
以上、よろしくお願いいたします。
2010年6月25日 3:22
回答
-
カナデタツキ さん、こんにちは。
フォーラムのご利用ありがとうございます。下記の情報などが参考になりそうですので、ご紹介させていただきますね。
(KeepAliveInterval と KeepAliveTime が逆になりますね)- 参考情報
Windows XP での TCP/IP と NBT の構成パラメータ
http://support.microsoft.com/kb/314053/ja
なお、下記の資料によると、KeepAlive パケットが送信されるためには、(Winsock)アプリケーション側で TCP KeepAlive 機能が有効になっている必要があり、また、"HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" の KeepAliveTime 値はあくまでも OS の既定値となるので、アプリケーションによっては独自の KeepAliveTime 値を保持している場合があります。そのため、KeepAlive パケットが送信されるかどうかと、送信されるまでの間隔はアプリケーションの実装(通信の種類) により異なる可能性があります。
例えば、NetBT(NetBIOS over TCPIP) 接続の場合には、下記レジストリの値で制御可能です。
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters" の SessionKeepAlive 値。
- 参考情報
Microsoft Windows Server 2003 TCP/IP 実装詳細
http://technet.microsoft.com/ja-jp/library/cc758746(WS.10).aspx--- 「TCP Keep-alive メッセージ」 より抜粋 ---
TCP Keep-alive パケットは、シーケンス番号を接続の現在のシーケンス番号より 1 つ小さい番号に設定した ACK です。これらの ACK のいずれかを受信したホストは、現在のシーケンス番号を示す ACK で応答します。
Keep-alive は、接続のリモート エンドのコンピュータがまだ利用可能かどうかを確認する目的で使用できます。
TCP Keep-alive は、ほかのデータや高レベルの Keep-alive が TCP 接続を通じて転送されていない状態で "KeepAliveTime" に設定した時間が経過するたびに送信されます。このパラメータの既定値は、7,200,000 ミリ秒 (2 時間) です。Keep-alive への応答がなければ、"KeepAliveInterval" に設定した秒数が経過するたびに Keep-alive が再送信されます。"KeepAliveInterval" の既定値は 1 秒です。
多くの Microsoft ネットワーク コンポーネントで使用される NetBT 接続では、Keep-alive をもっと高い頻度で送信するので、通常は、NetBIOS 接続上で TCP Keep-alive が送信されることはありません。TCP Keep-alive は既定で無効になっていますが、Windows Sockets アプリケーションでは "setsockopt" 関数を使用して Keep-alive を有効にできます。
-----------
可能であれば、ネットワークトレースを使用してどのような通信が行われているかと、どのレジストリ値が有効かどうかを確認された方が良いかもしれませんね。
(詳細な動作については 弊社有償サポート へご相談下さい)
それでは、こちらの情報が少しでもお役にたてれば幸いです。
______________________________________
マイクロソフト株式会社 フォーラム オペレーター 三沢健二- 回答としてマーク 服部清次 2010年7月6日 5:27
2010年7月1日 5:54
すべての返信
-
カナデタツキ さん、こんにちは。
フォーラムのご利用ありがとうございます。下記の情報などが参考になりそうですので、ご紹介させていただきますね。
(KeepAliveInterval と KeepAliveTime が逆になりますね)- 参考情報
Windows XP での TCP/IP と NBT の構成パラメータ
http://support.microsoft.com/kb/314053/ja
なお、下記の資料によると、KeepAlive パケットが送信されるためには、(Winsock)アプリケーション側で TCP KeepAlive 機能が有効になっている必要があり、また、"HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" の KeepAliveTime 値はあくまでも OS の既定値となるので、アプリケーションによっては独自の KeepAliveTime 値を保持している場合があります。そのため、KeepAlive パケットが送信されるかどうかと、送信されるまでの間隔はアプリケーションの実装(通信の種類) により異なる可能性があります。
例えば、NetBT(NetBIOS over TCPIP) 接続の場合には、下記レジストリの値で制御可能です。
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters" の SessionKeepAlive 値。
- 参考情報
Microsoft Windows Server 2003 TCP/IP 実装詳細
http://technet.microsoft.com/ja-jp/library/cc758746(WS.10).aspx--- 「TCP Keep-alive メッセージ」 より抜粋 ---
TCP Keep-alive パケットは、シーケンス番号を接続の現在のシーケンス番号より 1 つ小さい番号に設定した ACK です。これらの ACK のいずれかを受信したホストは、現在のシーケンス番号を示す ACK で応答します。
Keep-alive は、接続のリモート エンドのコンピュータがまだ利用可能かどうかを確認する目的で使用できます。
TCP Keep-alive は、ほかのデータや高レベルの Keep-alive が TCP 接続を通じて転送されていない状態で "KeepAliveTime" に設定した時間が経過するたびに送信されます。このパラメータの既定値は、7,200,000 ミリ秒 (2 時間) です。Keep-alive への応答がなければ、"KeepAliveInterval" に設定した秒数が経過するたびに Keep-alive が再送信されます。"KeepAliveInterval" の既定値は 1 秒です。
多くの Microsoft ネットワーク コンポーネントで使用される NetBT 接続では、Keep-alive をもっと高い頻度で送信するので、通常は、NetBIOS 接続上で TCP Keep-alive が送信されることはありません。TCP Keep-alive は既定で無効になっていますが、Windows Sockets アプリケーションでは "setsockopt" 関数を使用して Keep-alive を有効にできます。
-----------
可能であれば、ネットワークトレースを使用してどのような通信が行われているかと、どのレジストリ値が有効かどうかを確認された方が良いかもしれませんね。
(詳細な動作については 弊社有償サポート へご相談下さい)
それでは、こちらの情報が少しでもお役にたてれば幸いです。
______________________________________
マイクロソフト株式会社 フォーラム オペレーター 三沢健二- 回答としてマーク 服部清次 2010年7月6日 5:27
2010年7月1日 5:54 -
カナデタツキ さん、
こんにちは。
フォーラム オペレーターの服部 清次です。カナデタツキ さんがこちらの質問を投稿されてから少し経ちましたが、
弊社の三沢健二の回答はご確認いただけましたでしょうか?今回、1つの参考情報として、弊社の三沢の回答を役立てていただけるのではないかと思いましたので、
勝手ながら、ひとまず私の方で [回答としてマーク] のチェックを付けさせていただきました。
もし カナデタツキ さんがどうしても詳細をご希望とのことであれば、
弊社のサポート窓口への問い合わせもご検討いただければと思います。また何か困ったことがありましたら、ぜひ TechNet フォーラムをご利用ください。
今後とも、よろしくお願いします。
それでは、また。
__________________________________________________
マイクロソフト株式会社 フォーラム オペレーター 服部 清次2010年7月6日 5:30