web-dev-qa-db-ja.com

TCPセッションとIPの変更

クライアントのIPが変更されると、TCPセッションはどうなりますか?

Netcatにポートをリッスンさせ、クライアントマシンからそのポートに接続するという簡単なテストを行いました。次に、そのncセッションが開いているときにクライアントのIPを変更してデータを送信しましたが、IPを変更した後、サーバーがデータを受信しませんでした。

  1. それらが異なるレイヤーであることは知っていますが、TCPはセッションを区別する方法の一部にIPを使用しますか?
  2. 私の例は、アプリケーションがそれを処理する方法が原因で機能しませんか、それともTCP/IP /イーサネット層で何かが起こっているために機能しませんか?
  3. これはOSの実装に依存しますか? (私は現時点でLinuxに最も興味があります)
4
Kyle Brandt

私の理解では、TCPソケットはIP +ポート番号で構成されているため、IPを変更するとその接続が切断されます。ncはIPが変更されたことを知る方法がないため、元のデータにデータを送信し続けます。セッションがタイムアウトするまでIP。

RFC 79 (Transmission Control Protocol)、特にセクション2.7を参照してください。

2.7。接続の確立とクリア

a TCPが処理できる個別のデータストリームを識別するために、TCPはポート識別子を提供します。ポート識別子は独立して選択されるためそれぞれによってTCPそれらは一意ではない可能性があります。各TCP内で一意のアドレスを提供するために、TCPを作成するポート識別子と識別するインターネットアドレスを連結します相互に接続されたすべてのネットワーク全体で一意になるソケット。

Wiresharkまたは別のパケットスニファを使用してトラフィックを自分で監視し、実際の動作を確認することをお勧めします。

9
romandas

以前の回答では、IPアドレスが変更されたときにTCP接続を維持することはできません。これは、これらの回答が書き込まれた2009年に正しかったことを示しています。

ただし、2013年1月に RFC 6824 が公開され、IPアドレスが変更されたときにTCP接続を維持する方法が導入されました。2014年6月の時点では、まだ広く普及していません。サポートされています。特に、リファレンス実装はLinuxのパッチとして存在し、iOS7はデフォルトでMPTCPをサポートしています。Wikipediaには合計 5つの実装 がリストされています。

3
kasperd

セッションは終了します。 TCPソケットはdstポート、dst ip、srcポート、src ipです。これらのいずれかが変更された場合、接続を切断する必要があります(少なくとも、Stevensによると)。

編集:これはRFC準拠の実装に当てはまります。 RFC 793、セクション2.7

2
Cian

他の人は、IP +ポートペアによって識別される接続の観点から回答しました。層状構造でどのように機能するかについて少しお話ししましょう。

TCPは、信頼性の低いパケット層(IP)の上に信頼性の高いストリームの「錯覚」を提供する層です。そのためには、ストリームを管理するためにいくつかの変数を考慮に入れる必要があり、また、関連するパラメーターを下のレイヤーに提供する必要があります。

したがって、TCPにストリームを開くように要求すると、宛先のIP +ポートが与えられます。IP番号が保持され、何かを転送する必要があるたびに、IPパケットが組み立てられます。そして、元のIP番号によってのみ識別される目的のマシンに送信するようにIP層に指示します。

一方のマシンのIP番号を変更した場合、もう一方のマシンのTCPレイヤーは、何が起こったのかを知る意味がありません。元のIP番号に送信されたIPパケットがないことを確認するだけです。応答が長くなります(そのIP番号のマシンがないことを示すICMPメッセージが表示される可能性があります)。また、そのIP番号のパケットはこれ以上取得されません。明らかに、タイムアウト後に接続が切断されます。

さらに悪いことに、別のオリジン(新しいIP番号)から無関係なパケットを取得し始める可能性がありますが、それらは接続がすでに確立されていることを前提としています!もちろん、マシンが(もしあれば)得るかもしれない唯一の答えは、それを即座に停止させて停止させるためのRSTパケットです。

2
Javier

TCPセッションは、接続の両側のIPアドレスとポート番号によって識別されます。一方のIPアドレスを変更すると、そのセッションが中断されます。

1
joeqwerty

(送信元アドレス、送信元ポート、宛先アドレス、宛先ポート)の組み合わせは、 ソケットペア と呼ばれます。 TCPスタックが接続を識別するために使用します。確立されると、TCPはこれらを更新する方法がありません。

[〜#〜] sctp [〜#〜] エンドポイントはその場でアドレスを変更できますが、広く展開されていません(とにかくまだ)。

1
Gerald Combs