クライアントのIPが変更されると、TCPセッションはどうなりますか?
Netcatにポートをリッスンさせ、クライアントマシンからそのポートに接続するという簡単なテストを行いました。次に、そのncセッションが開いているときにクライアントのIPを変更してデータを送信しましたが、IPを変更した後、サーバーがデータを受信しませんでした。
私の理解では、TCPソケットはIP +ポート番号で構成されているため、IPを変更するとその接続が切断されます。ncはIPが変更されたことを知る方法がないため、元のデータにデータを送信し続けます。セッションがタイムアウトするまでIP。
RFC 79 (Transmission Control Protocol)、特にセクション2.7を参照してください。
2.7。接続の確立とクリア
a TCPが処理できる個別のデータストリームを識別するために、TCPはポート識別子を提供します。ポート識別子は独立して選択されるためそれぞれによってTCPそれらは一意ではない可能性があります。各TCP内で一意のアドレスを提供するために、TCPを作成するポート識別子と識別するインターネットアドレスを連結します相互に接続されたすべてのネットワーク全体で一意になるソケット。
Wiresharkまたは別のパケットスニファを使用してトラフィックを自分で監視し、実際の動作を確認することをお勧めします。
セッションは終了します。 TCPソケットはdstポート、dst ip、srcポート、src ipです。これらのいずれかが変更された場合、接続を切断する必要があります(少なくとも、Stevensによると)。
編集:これはRFC準拠の実装に当てはまります。 RFC 793、セクション2.7
他の人は、IP +ポートペアによって識別される接続の観点から回答しました。層状構造でどのように機能するかについて少しお話ししましょう。
TCPは、信頼性の低いパケット層(IP)の上に信頼性の高いストリームの「錯覚」を提供する層です。そのためには、ストリームを管理するためにいくつかの変数を考慮に入れる必要があり、また、関連するパラメーターを下のレイヤーに提供する必要があります。
したがって、TCPにストリームを開くように要求すると、宛先のIP +ポートが与えられます。IP番号が保持され、何かを転送する必要があるたびに、IPパケットが組み立てられます。そして、元のIP番号によってのみ識別される目的のマシンに送信するようにIP層に指示します。
一方のマシンのIP番号を変更した場合、もう一方のマシンのTCPレイヤーは、何が起こったのかを知る意味がありません。元のIP番号に送信されたIPパケットがないことを確認するだけです。応答が長くなります(そのIP番号のマシンがないことを示すICMPメッセージが表示される可能性があります)。また、そのIP番号のパケットはこれ以上取得されません。明らかに、タイムアウト後に接続が切断されます。
さらに悪いことに、別のオリジン(新しいIP番号)から無関係なパケットを取得し始める可能性がありますが、それらは接続がすでに確立されていることを前提としています!もちろん、マシンが(もしあれば)得るかもしれない唯一の答えは、それを即座に停止させて停止させるためのRSTパケットです。
TCPセッションは、接続の両側のIPアドレスとポート番号によって識別されます。一方のIPアドレスを変更すると、そのセッションが中断されます。
(送信元アドレス、送信元ポート、宛先アドレス、宛先ポート)の組み合わせは、 ソケットペア と呼ばれます。 TCPスタックが接続を識別するために使用します。確立されると、TCPはこれらを更新する方法がありません。
[〜#〜] sctp [〜#〜] エンドポイントはその場でアドレスを変更できますが、広く展開されていません(とにかくまだ)。