TCP プロトコル Wiki をチェックアウトしましたが、長期間データが転送されない場合にソケット接続がタイムアウトするかどうかはわかりませんでした。つまり、物理的な問題は発生しませんが、2 台のコンピューターは、しばらくの間、互いに送信するデータがありません。どのように接続がまだ存在しますか?壊れていないことを理解するのに役立つ低レベルのデータ転送はありますか?
ありがとうございました!質問がばかげている場合は申し訳ありません..
TCP プロトコル Wiki をチェックアウトしましたが、長期間データが転送されない場合にソケット接続がタイムアウトするかどうかはわかりませんでした。つまり、物理的な問題は発生しませんが、2 台のコンピューターは、しばらくの間、互いに送信するデータがありません。どのように接続がまだ存在しますか?壊れていないことを理解するのに役立つ低レベルのデータ転送はありますか?
ありがとうございました!質問がばかげている場合は申し訳ありません..
TCP接続を維持するために、ネットワークを介してデータが送信されることはありません。いずれかのピアからゼロバイトパケットをsend()するか、ソケットオプションを有効にして、オペレーティングシステムに定期的にパケットを送信させるだけで、ネットワーク層のキープアライブを送信できます。私の意見では、アプリケーション層のキープアライブ(アプリケーションプロトコルがそれを管理します)は、トランスポート層の機械よりも優れた設計/信頼性を提供します。
信頼性を最大化するためにTCPの上に階層化されたアプリケーションプロトコルを設計する場合、通常、プロトコル設計に何らかの非動作(NOOP)、ping、ハートビートを組み込む必要があります。
これは非常に重要です。たとえば、サーバーがクライアントからの要求をリッスンしていて、接続が確立された後にクライアントがオフになっている場合、TCPセッションは本質的に孤立し、サーバーは永久にリッスンする可能性があります。データの送受信がない場合、接続の中断を検出できません!!
サーバーが少なくとも定期的にnoop/ping / heartbeatsを送信した場合、発信要求はTCP層の再トランス/タイムアウトマシンをトリガーし、サーバーは接続の切断を検出できるようになります。代わりに、アプリケーションがアプリケーション層に「ping」または「こんにちは、お元気ですか?」を送信する場合。メッセージをさらに進めて、基になる接続だけでなく、ピアの状態について問い合わせることができます。
たとえば、ピアが無限ループでスタックしている場合、またはそのディスクドライブがオンになっている場合、TCPキープアライブだけでは、根本的な問題を理解して対処するのに役立ちません。
TCP 接続は、両端が閉じるまで開いたままになります。
ただし、ファイアウォール、特に NAT ゲートウェイは TCP 接続エントリをタイムアウトすることが多いことに注意してください。つまり、接続が 1 つを通過する場合、ゲートウェイがその TCP 接続のマッピングを削除すると、データの送信がエラーになる可能性があります。アプリケーション プロトコルに何らかのハートビートがあるか、tcp キープアライブを有効にしない限り、ゲートウェイがタイムアウトした TCP 接続からの読み取りのみが検出されません。
多くの場合、キープアライブを使用して接続を開いたままにします。
いいえ、そうではありません。データが転送されていないか、いずれかの側を切断する必要がある場合は、ある種の「キープアライブ」メカニズムを使用して、自分で実装する必要があります。