2つのホスト(A & B)間でTCP接続が確立されていて、ホストAがホストBに5オクテットを送信し、ホストBがクラッシュしたとします(原因不明のため)。 ホストAは肯定応答を待つが、それを取得しないと、オクテットを再送し、送信者ウィンドウのサイズも小さくする。 これは、パケット損失のためにウィンドウサイズがゼロになるまで数回繰り返します。私の質問は、次に何が起こるかです。マシンの1つが停止した場合、TCP接続はどのように終了しますか?
答えて
この場合、TCPは最終的にackを待ってタイムアウトし、アプリケーションにエラーを返します。アプリケーションは、そのエラーについて知るためにTCPソケットからread/recvする必要があります。その後のwrite/send呼び出しも失敗します。 TCPが接続がなくなったと判断するまで、書き込み/送信呼び出しは失敗しません。ソケットバッファがいっぱいであれば、アプリケーションやブロックから見て成功するでしょう。
ホストBがACKを送信した後にホストBが消滅した場合、ホストAは何かをBに送信するまでそのことを知りません。結果的にタイムアウトになるか、ICMPエラーになります。 (通常、最初の書き込み/送信コールは失敗しません。なぜなら、TCPは接続にすぐに失敗しないため、書き込み/送信コールは完了するまでACKを待たないということです)。
再送信によってウィンドウサイズが縮小されないことにも注意してください。
このlink
が今私の見解では、あなたの質問に非常に単純な答えは、接続がタイムアウトされていると閉鎖されるに従ってください。別の可能性としては、応答の遅いマシンのためにICMPエラーが発生する可能性があります。
また、クラッシュしたマシンが再びオンラインになっている場合は、上記で貼り付けたリンクiで説明した手順が実行されます。
OSの実装によって異なります。つまり、ACKを待ち、タイムアウトするまでパケットを再送します。その後、接続が切断されます。 Linuxで何が起こるかを正確に見るためには、hereの他のOSも同様のアルゴリズムに従ってください。
あなたのケースでは、残存ノードによってFINが生成され、最終的に接続はCLOSED状態に移行します。宛先IPアドレスでnetstat出力をgrepingし続けると、ESTABLISHED状態からTIMED_WAITへの移行を監視し、最後に消滅します。
あなたのケースでは、TCPは送信したパケットのACKを取得するタイマーを保持しているため、このようなことが起こります。このタイマーは十分に長くないので、検出はかなり早く行われます。
しかし、マシンAがACKを取得した後にAが何も送信しない場合、上記のタイマーは同じイベントを検出できませんが、別のタイマー(アイドルタイムアウトを呼び出す)がその条件を検出し、接続が終了します。このタイムアウト期間は、デフォルトでは高く設定されています。しかし、通常これはそうではありません。マシンAは間に物事を送信しようとし、送信パスのエラー状態を検出します。
要するに、TCPは、1つのケース(アイドルタイムアウト:デフォルトでは非常に高い)を除いて、接続自体を閉じて(アプリケーションに知らせるのに十分なほど)スマートです。通常のケースで
cforfun
、各側は、FIN(仕上げ)ビットが設定された特別なメッセージを送信することによって、接続の終わりに終了します。 このFINを受信したデバイスは、受信したことを示すFINに対する確認応答を返します。 FINを送信して肯定応答を受信することによって、両方のデバイスがシャットダウン手順を完了するまで、接続全体が終了したとはみなされません。
- 1. どの場合、TCP接続を終了する必要がありますか?
- 2. eclipseでTomcatを終了する(停止しない)場合のデータベース接続リーク
- 3. TCP接続が終了する
- 4. ノードが停止してTCP接続が確立されました
- 5. waitpidの場合、子プロセスが終了したかどうかはどのようにわかりますか?
- 6. TCP接続を「終了」するにはどうすればいいですか?
- 7. Angular2で作成されたHTTP接続はどのように接続を終了しますか?
- 8. iperfサーバーが終了したらどうやって停止できますか?
- 9. handle_callが完了する前に監視対象プロセスが停止した場合はどうなりますか?
- 10. ファイルがない場合、どのようにssisパッケージを停止しますか?
- 11. nodejsでajaxコールが異常終了した場合のバックエンドプロセスを停止する方法はありますか?
- 12. プロセスが終了した後、Linuxカーネルはどこで処理を行い、TCP接続をクリーンアップしますか?
- 13. nc接続がbashで成功した場合にスクリプトを停止する
- 14. Javascriptの機能を防止、停止、または終了するにはどうすればよいですか?
- 15. プラグイン接続がパイプラインを終了した後はどうなりますか?
- 16. 強制終了の場合のアンドロイドサービスの停止
- 17. プロセスが終了するとWCF tcp接続が開いたままになる
- 18. TCP/IP接続があるかどうかをチェックし、WiFiまたは3Gの場合 - Windows Mobile 6.5 - C/C++
- 19. OAuthトークンミドルウェアスリムバージョン3停止または終了
- 20. Visual Studio 2017が停止してドッキングを終了しました
- 21. CountDownTimerを一時停止し、もう1つはAndroid Studioで実行していて、もう1つが終了したら再開しますか?
- 22. アプリケーションが終了すると、DB接続はすぐに終了しますか?
- 23. httpリクエスト間に一時停止があると接続が終了しますか?
- 24. TCP接続あたりのリクエスト数が最大の場合は
- 25. Upstartがステータス1で終了し、シェフが中止するようにします。
- 26. アプリケーションが終了するとスレッドが停止しますか?
- 27. NPM rimraf - フォルダがないときに実行を続行します(終了コード1を停止します)。
- 28. TCPソケットを突然終了して再接続する方法
- 29. アプリが終了した後にAndroidサービスが停止する
- 30. 接続がspring jpaで終了した場合、データベースを再接続する方法は?
これはsyn floodingですか? –