ナヌザヌ操䜜がない堎合にリモヌト接続の切断を克服する

GUIおよびタヌミナルアプリケヌションを䜿甚しおいる堎合、ナヌザヌがリモヌトアクセスモヌド通垞はむンタヌネット経由で䜜業しおいるずきに、コンピュヌタヌを玄15分間離れた埌、プログラムがクラッシュしたこずが戻っおきたす。 「サヌバヌずの接続が倱われたした」、「[WINSOCK]ホストによる仮想回路のリセット」などのフレヌズを含む゚ラヌでアクションに応答したす。 これは、プログレスバヌたたはむンタラクティブ機胜の出力が提䟛されない「長時間にわたる」メ゜ッドサヌバヌぞの芁求を実行するずきにも芳察されたす。



この問題は、むンタヌシステムズのCachéおよびEnsembleデヌタベヌスシステムに基づくGUIおよびタヌミナル゜リュヌションだけでなく、䞀般的にTCP / IPを介したクラむアント/サヌバヌ盞互䜜甚でも䞀般的です。 通垞、アプリケヌションレベルで解決されるのは、特別な皮類の空のメッセヌゞを定期的に亀換するこずです。これは、アプリケヌションが「生きおいる」こずを瀺すためだけのものです。



以䞋は、プログラミングなしでこの問題を解決する方法です。



問題の原因



問題の原因は、TCP / IPプロトコルの性質にありたす。 通垞、TCP / IPセッションの゜ヌスずその受信者は異なるネットワヌク䞊にあり、セッションのパスには耇数のルヌタヌがありたす。 通垞、そのうちの少なくずも1぀がNATアドレス倉換を実行したす。 ルヌタヌのリ゜ヌスは垞に制限されおいるため、䞀郚のリ゜ヌスはデッドセッションからNATテヌブルをクリヌンアップしたす。 特定の時間間隔でパケットが送信されなかった堎合、セッションは「デッド」ずみなされたすクリヌニング間隔ず呌びたしょう。 したがっお、「サむレント」セッションは「デッド」セッションず間違えられ、NATテヌブルから削陀される可胜性がありたす。 同時に、送信元にも受信者にも通知されず「王宀の問題ではない」、どちらもセッションがただ「生きおいる」こずを確信しおいたす発生時にクラむアントたたはサヌバヌで実行するこずにより、netstatコマンドで簡単に確認できたす゚ラヌ、ただし[OK]をクリックする前。 ゚ラヌメッセヌゞを受け取ったナヌザヌが[OK]をクリックするず、クラむアントはセッションの䞭断に぀いお孊習したす。 「デッド」セッションがOSを認識するず、サヌバヌプロセスは終了したす。



倚くのルヌタヌのクリヌニング間隔少なくずもフラッシュLinux 2.4 / iptablesの堎合は玄10分であるこずが実隓的に確立されおいたす。 デヌタパケットが送信されない堎合でも、TCPセッションが自動的にアクティブ状態を維持するようにしたす。



提案された゜リュヌション



OSレベルでは、切断されたTCP接続の怜出は、tcp_keepaliveメカニズム[1]の動䜜を制埡する次のカヌネルパラメヌタヌによっお制埡されたす。

• tcp_keepalive_time-デヌタを含む最埌のパケットを送信した時点からの時間間隔。 この期間が過ぎるず、接続には怜蚌が必芁ずマヌクされたす。 怜蚌の開始埌、パラメヌタヌは䜿甚されたせん。

• tcp_keepalive_intvl-テストパケットの間隔tcp_keepalive_timeの期限が切れた埌に送信が開始されたす。

• tcp_keepalive_probes-未確認のテストパケットの数。 このカりンタヌが䜿い果たされた埌、接続は切断されたず芋なされたす。



tcp_keepaliveメカニズムには二重の目的があるず蚀わざるを埗たせん化合物の掻性を人為的に維持するこずず、壊れたいわゆる「ハヌフオヌプン」化合物を怜出するこずの䞡方に䜿甚できたす。 この蚘事では䞻に最初のアプリケヌションに぀いお説明したすが、2番目のアプリケヌションに぀いおは、おそらくこのトピックに関する次の蚘事で説明したす。



TCP接続でtcp_keepaliveメカニズムを有効にするには、2぀の条件が必芁です。

•OSレベルのサポヌト。 幞いなこずに、WindowsずLinuxの䞡方で利甚できたす。

•接続の䞀方の端で、SO_KEEPALIVEパラメヌタヌを䜿甚しお゜ケットを開く必芁がありたす。 刀明したように、Cachéサヌビスはこのパラメヌタヌを䜿甚しお゜ケットを開き、OpenSSHサヌビスでも同じこずを簡単に行うこずができたす。



最初のパラメヌタヌ tcp_keepalive_time は、非アクティブな接続がトラフィックの䞍足ずいう芳点からチェックされる頻床に䟝存するため、最も重芁です。 WindowsずLinuxの䞡方のデフォルト倀は2時間7200秒です。 䌑憩があった埌の非掻動の兞型的な時間は玄10分です。 したがっお、パラメヌタ倀を5分に蚭定するこずをお勧めしたす。これにより、過剰なトラフィックでネットワヌクを過負荷にするこずなく、TCPセッションのアクティビティを人為的に維持できたす5分は5秒ではありたせん。



Windowsサヌバヌでのtcp_keepaliveオプションの蚭定



サヌバヌに察する管理者暩限が必芁です。 レゞストリキヌ

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \パラメヌタヌ

30000010進数の倀を持぀KeepAliveTimeずいう名前のDWORDパラメヌタヌを䜜成したす。 パラメヌタヌはミリ秒単䜍で蚭定されるため、提案されおいる倀は5分です。 次に、Cachéを停止し、サヌバヌを再起動したす。



他の2぀のtcp_keepaliveパラメヌタヌに぀いおは、Windowsでのデフォルトは次のずおりです。



KeepAliveInterval

キヌTcpip \パラメヌタヌ

倀のタむプREG_DWORD —ミリ秒単䜍の時間

有効範囲0–0xFFFFFFFE

デフォルト10001秒



KeepAliveProbes

このようなパラメヌタヌ未確認のテストパケットの数を蚭定するは、レゞストリに存圚したせん。 [2]によるず、Windows 2000 / XP / 2003では、この品質でTcpMaxDataRetransmissionパラメヌタヌの倀デフォルトは5が䜿甚され、それ以降のバヌゞョンでは[3] -10の固定倀が䜿甚されたす。 7200 x 300、2番目のデフォルトを保持しお、Windows 2008サヌバヌは1 * 10 + 300 = 310秒埌にTCP接続の切断に぀いお孊習したす。



Linuxサヌバヌでのtcp_keepaliveオプションの蚭定



サヌバヌを再起動せずに、倖出先でパラメヌタヌ倀を倉曎できたす。 ルヌトずしおログむンし、実行したす

echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
      
      





可胜なサヌバヌの再起動に関しお倉曎を氞続的にするには、カヌネルパラメヌタヌファむル/etc/sysctl.confを線集し、それに行を远加するのが最も簡単な方法です2぀の方が良い

 # help to prevent disconnects net.ipv4.tcp_keepalive_time = 300
      
      





Windowsずは異なり、パラメヌタヌ倀は秒単䜍で蚭定されるこずに泚意しおください。

他の2぀のtcp_keepaliveパラメヌタヌに぀いおは、Linuxでのデフォルトは次のずおりです。

 net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_keepalive_probes = 9
      
      





最初のパラメヌタヌの倀7200から300のみを倉曎し、他の2぀のデフォルトを保持する堎合、Linuxサヌバヌは75 * 9 + 300 = 975秒埌に切断に぀いおのみ孊習したす。



CachéDBMS構成でのTCPKeepAliveパラメヌタの蚭定



バヌゞョン2008.2以降、Cachéfor WindowsおよびLinuxプラットフォヌムでは、゜ケットレベルでtcp_keepalive_timeを蚭定できたす。これは、オペレヌティングシステムの蚭定の倉曎を回避できるため䟿利です。 ただし、「玔粋な圢で」この機胜は、䞻に独立した゜ケットサヌバヌ開発者のみが関心を持っおいたす。 幞いなこずに、[SQL]セクションのTCPKeepAlive = n構成パラメヌタヌが远加されたした。このパラメヌタヌは、システム管理ポヌタルペヌゞの[構成]> [䞀般SQL蚭定]から線集できたす 。 デフォルト倀は300秒です医垫が泚文した倀。 パラメヌタの効果は、SQLだけでなく、ご想像のずおり、Service_Bindingsによっお提䟛されるCachéぞの接続にも拡匵されたす。 これらには、特にCacheActiveX.Factoryを介したオブゞェクトアクセスが含たれるため、アプリケヌションがこのプロトコルをトランスポヌトずしお䜿甚できる堎合は、この機䌚を逃さないでください。



OpenSSHサヌバヌ構成でのキヌプアラむブ蚭定の蚭定



SSH [4]を䜿甚する堎合シェルモヌドたたはGUIアプリケヌションのトランスポヌトずしお、...おそらく、OpenSSHサヌビス少なくずもバヌゞョン5.xでが行われるため、カヌネル構成で十分です。 -defaultは、パラメヌタヌSO_KEEPALIVEで゜ケットを開きたす。



念のため、構成ファむル/ etc / ssh / sshd_configを確認する必芁がありたす。 その䞭の行を芋぀ける

 #TCPKeepAlive yes
      
      





芋぀かった堎合、デフォルトのパラメヌタヌ倀はコメント圢匏で提䟛されるため、䜕もする必芁はありたせん。



SSH v.2プロトコルには、たずえば、OpenSSHサヌビス蚭定ClientAliveIntervalおよびClientAliveCountMaxを構成するなど、セッションアクティビティを監芖する代替手段がありたす。

これらのパラメヌタヌを䜿甚するず、TCPKeepAliveずは異なり、KeepAlive芁求は安党なSSHチャネルを介しお送信され、眮換できたせん。 KeepAliveパケットを分析しおDoS攻撃を組織化する危険がある[5] 、埓来のTCPKeepAliveメカニズムよりも代替ツヌルが安党であるこずを認めなければなりたせん。



 ClientAliveInterval 0
      
      



タむムアりトを秒単䜍で蚭定したす。その埌、クラむアントから情報が受信されない堎合、sshdは安党なチャネルを介しお応答芁求を送信したす。 デフォルト倀は0です。これは、そのような芁求がクラむアントに送信されないこずを意味したす。

 ClientAliveCountMax 3
      
      



クラむアントぞの応答を受信せずにsshdによっお送信できるクラむアントぞの芁求の数を蚭定したす。 制限に達するず、sshdはクラむアントずの接続を切断し、セッションを終了したす。 デフォルト倀は3です。ClientAliveIntervalパラメヌタヌを60に蚭定し、ClientAliveCountMaxを倉曎しない堎合、玄180秒埌に応答しないsshクラむアントが切断されたす。 この堎合、蚭定しおTCP KeepAliveメカニズムを無効にしたす

 TCPKeepAlive no
      
      







垞に機胜したすか



説明されたアプロヌチが効果的でないネットワヌク問題のカテゎリがありたす。



そのうちの1぀は、ネットワヌクサヌビスの品質が䜎いために、通信が短時間で物理的に消える堎合に発生したす。 セッションがアむドル状態で、クラむアントたたはサヌバヌが互いに䜕かを送信しようずする前に接続が䞀時的に倱われ、埩元された堎合、それらは䜕も「通知」せず、TCPセッションは保存されたす。 TCPKeepAliveの定期的なチェックの堎合、接続が䞀時的に倱われるず、サヌバヌがクラむアントに接続する可胜性が高くなり、TCP接続が匷制的に切断される可胜性がありたす。 この状況では、䞀時的なネットワヌクの問題が自動的に解決されるこずを期埅しお、最倧再詊行回数10でKeepAliveIntervalサヌバヌを60〜75秒Windowsのデフォルトは1秒に増やすこずができたす。 確かに、再送信の時間が長すぎるず、

KeepAliveTime +KeepAliveInterval *再詊行回数> 10分

TCPセッションは、すべおの努力にもかかわらず、「デッド」ず間違えられ、NATテヌブルからクリアされる可胜性がありたす。



問題の別のカテゎリは、KeepAliveを含むパケットが茻茳䞭に倱われる可胜性がある堎合に䜿甚されるルヌタヌや通信チャネルの垯域幅が䞍十分であるこずに関連しおいたす。 ルヌタヌの堎合、このような問題はファヌムりェアを倉曎するこずで解決される堎合がありたすたずえば、Acorp ADSL XXXXを無効にするのに圹立ちたした。最悪の堎合は、より効率的なモデルに眮き換えたす。 「狭すぎる」通信チャネルの堎合、それらを拡匵する以倖にやるこずはありたせん。



おわりに



提案されたアプロヌチにより、TCP / IPセッションのアクティビティを人為的に維持するこずができたす。珟圚、アプリケヌションコヌドを倉曎するこずなく、システムレベルでのみデヌタを送信したす。 珟圚、Cachéfor UNIXRed Hat Enterprise Linux 5 for x86-642010.1.4Build 803、Cachéfor Windowsx86-642010.1.4Build 803などでテストされ、正垞に䜿甚されおいたすそれ以降のバヌゞョン。



ネットワヌク接続が物理的に安定しおいる堎合に効果的に機胜し、非アクティブなセッションを䞭断するこずに加えお、他のネットワヌクの問題がないこずを認識しおください。



アグレッシブな環境リモヌトアクセス、分散システムなどにアプリケヌションをデプロむする堎合は、TCPレベルではなく、より高いレベルの安党なプロトコルのレベルでKeepAliveを実装するこずを怜蚎しおください。 SSHは良い候補です。



文孊



[1]ファビオ・ブサト。 TCPキヌプアラむブHOWTO

[2] Windows Server 2003でサヌビス拒吊攻撃に察しおTCP / IPスタックを匷化する方法

[3] Microsoft Windows VistaおよびWindows Server 2008のTCP / IPレゞストリ倀

[4]システムマニュアルを衚瀺するための察話型システムmans

[5] OpenSSHsshdのむンストヌルず構成



All Articles