ローカルコンピュータからリモートサーバーのデータベースに接続するSSHトンネルがあるとします。
トンネルにクエリを送信すると、もう一方の端に出ますが、クエリを送信したり結果を受け取ったりする間、データベースはTCP RSTをトリガします。 SSHはこれをどのように処理しますか?
できる:
- エンドポイントでACKを受信するまで、どちらの側でもACKパケットを待ちますか?
- アプリケーションレベルのデータをバッファリングし、成功するまで再送信しますか?
- 他の?
私の関心事は、トンネルACKがもう一方の端ACKよりも先に発生し、もう一方の端がRSTを送信した場合、そのRSTを再度伝播できないことです。両側がぶら下がります。
答え1
なぜ「両方ともぶら下がっている」のですか?本当に観察しましたか?
TCP/IP Illustrated, Volume 1, 2nd Edition の 14 ページで引用されました。 628:
リセットセグメントにはシーケンス番号と承認番号が含まれます。また、セグメントをリセットしても相手からの応答はなく、まったく承認されません。リセット受信機は接続を中断し、接続がリセットされたことをアプリケーションに通知します。これは通常、「ピアによる接続のリセット」または同様のメッセージを示すエラーを引き起こします。
前のページから:
接続の中断は2つの機能を提供します。キュー内のすべてのデータは削除され、リセットセグメントはすぐに送信されます。リセット受信者は、相手が通常のシャットダウンではなく中断を行ったことを知ることができる。
SO_LINGER
(アプリケーションのリスニングソケットが使用できるソケットオプションを確認することもできます。)