TCPソケットが4タプルで識別されるのはなぜですか?


8

ここでネットワーキングの初心者。私はコンピュータネットワーキング(第3版)の本を読んでおり、セクション3.2では、UDPとTCPの両方の多重化/逆多重化について説明しています。

UDPプロトコルでは、ソケットは送信元IPと送信元ポートによって一意に識別されます。

TCPプロトコルでは、ソケットは送信元IP、送信元ポート、宛先IP、および宛先ポートによって一意に識別されます。TCPプロトコルがセグメントを正しく逆多重化して正しいプロセスに送信するために、受信ホストが2つの追加情報を必要とするのはなぜですか?

これが必要な理由を私が考えることができる唯一の理由は、クライアントが常にTCPセグメントを接続要求セグメントと同じポートに送信する場合です。たとえば、サーバーが別のポートでそのセッション専用のTCPソケットを確立していても、ブラウザは常にデータをサーバーのポート80に送信します。その場合、TCPは送信元IPと送信元ポートの情報を使用して、正しいソケットに逆多重化する必要があります。単一のホストが複数のセッションを確立できるため、ソースIP情報だけに依存することはできませんが、各セッションは異なるポート上にある必要があります。

UDPにこの問題がない理由は、UDPには要求に対する複数の新しいソケットの「発生」がないため、宛先IP /ポートコンボが要求を処理するプロセスが接続されているソケットを識別するためです。

これは正しいですか、それとも間違った結論に達しましたか?


スティーブンこんにちは、ようこそ。第3版には「コンピュータネットワーキング」と呼ばれるさまざまな本があります。どれを読んでいますか?
ジョナサン

TCPのRFCがソケットと接続について説明しているものについては、この回答を参照してください。
Ron Maupin

Stack Overflowに関するこの回答は、質問に対するプログラミングの回答です。このサイトの正しい答えは、TCPの定義であるRFC 793にあります。いずれにせよ、ネットワークエンジニアリングの答えは、TCPソケットは「4タプル」によってTCPソケットを識別せ、1つのIPアドレスとTCPアドレスの組み合わせによってのみ識別されるということです。間違ったネットワークエンジニアリングの答えを受け入れたと思います。
Ron Maupin

回答:


3

残念ながら、ソケットには2つの異なる定義があるため、混乱が生じます。TCP rfcはアドレスとポートの組み合わせを指すためにソケットという用語を使用しますが、バーカーリーソケットとその派生物(今日使用されているIPのほとんどすべての実用的な実装で使用されるAPI)は、オペレーティングタイプを指すためにソケットという用語を使用しますシステム通信オブジェクト。

TCPプロトコルがセグメントを正しく逆多重化して正しいプロセスに送信するために、受信ホストが2つの追加情報を必要とするのはなぜですか?

それは正しいプロセスの問題だけでなく、正しい通信オブジェクトでもあります。

これが必要な理由を私が考えることができる唯一の理由は、クライアントが常にTCPセグメントを接続要求セグメントと同じポートに送信する場合です。たとえば、私のブラウザは常にデータをポート80に送信します

彼らはします。

サーバーが別のポートでそのセッション専用のTCPソケットを確立している場合でも。

これは一般的な誤解のようであり、おそらくソケットの定義が異なるために発生します。接続を受け入れると、サーバーに新しい通信オブジェクト(Berkerlyソケットの意味でのソケット)が作成されますが、新しいIP /ポートの組み合わせ(TCP RFCの意味でのソケット)は割り当てられません。

UDPにこの問題がない理由は、UDPには要求に対する複数の新しいソケットの「発生」がないため、宛先IP /ポートコンボが要求を処理するプロセスが接続されているソケットを識別するためです。

正解です(段落がバーカーリーソケットの意味で「ソケット」を使用していると仮定します)。


7

UDPプロトコルでは、ソケットは送信元IPと送信元ポートによって一意に識別されます。

TCPプロトコルでは、ソケットは送信元IP、送信元ポート、宛先IP、および宛先ポートによって一意に識別されます。TCPプロトコルに2つの追加情報が必要な理由

注意:TCP用語では、ソケットはアドレスとポートのペアです。ソケットのペアが接続を定義します。(RFC 793 p5に従って)

UDPについて誤解しているようですが、実際には「ソケット」はありませんが、バークレーソケットライブラリがUDPを呼び出していても、アドレスとポートのペアを呼び出すのは合理的です。基本的にはTCPと同じです。

これを確認できる典型的な状況は、1つのホストから同じDNSサーバーへの複数のDNS解決が同時に行われる場合で、送信元ポート番号だけが明らかに異なるだけです。これは、1つのクライアントから単一のWebサーバーへの複数の同時TCP接続とまったく同じ状況であることがわかります。

UDPにはコネクションレス型のデータグラムがあります。ホストAは、Bのアドレスとポートのペアに向けられたアドレスとポートのペアからデータグラムを送信します。Bのアドレスとポートのペアは、通常、ミラーリングの方法で応答します。「通信」といえば、TCP接続とまったく同じ4タプルで動作します。

5つのタプル(プロトコル、送信元アドレス、送信元ポート、宛先アドレス、宛先ポート)への参照が表示される場合があります。プロトコルはUDPの場合は17、TCPの場合は6です。これは、ほとんどのファイアウォール、ルーターなどで使用されます。この通信ペアを識別するためのNATおよび類似の操作。

サーバーが別のポートでそのセッション専用のTCPソケットを確立した場合でも

TCPについても誤っていると思います。おそらく、TCPプロトコル(RFC 793)の定義とその最も一般的な実用的な実装であるBerkeley Sockets Library(Unixで使用されているもの)と、それ。

プロトコルに焦点を当てれば、より明確になります。「異なるポート」はありません。Webサーバーは、たとえば1.1.1.1ポート80でのみリッスンしています。クライアントは、図2.2.2.2ポート56789からのみ送信します。すべてのパケットは1.1.1.1:80から2.2.2.2:56789へ、またはその逆になります; tcpdump / wireshark / etcでパケットを調べることで簡単に確認できます。

(バークレー実装を少し簡単に説明すると、TCP 接続は通常、混乱を招くように呼び出される整数で表されsockfdます。TCP ソケットはで表されますstruct sockaddraccept()システムコールは、 "新しい接続ソケット"の作成について非常に混乱しています。新しい接続接続状態の構造。この結果のタプルは、例(1.1.1.1、80、2.2.2.2、56789)になります。UDPに関して、ライブラリはUDPを接続されていると見なすことを可能にします。これは、2つのプロセス間のUDPデータグラム交換を説明する完全に間違った方法である場合に便利であり、構造が遠いアドレスとポートのペアを記憶することを意味します。 「接続」はTCPのように見えます。BerkeleyライブラリはIPのためだけのものではなく、いくつかの異なる基盤となるネットワークシステムを一般化したものであることを思い出してください。これらのネットワークプログラミング用語をフォロ​​ーしたい場合は、非常に有能なネットワークプログラマーが多いStack Overflowをお勧めします。


1

UDPプロトコルでは、ソケットは送信元IPと送信元ポートによって一意に識別されます。

ネットワークプログラミング(ソケット)とネットワークプロトコルを混在させないでください。

ただし、UDPの場合は、この4タプルもあります。

TCPとUDPの違いは、UDPは固定接続を使用しないため、1つのソケットを使用して異なるコンピューターや異なる宛先ポートにデータを送信できることです。

このため、OSは4タプルの2つの要素(ローカルポートのIPアドレスとポート番号)のみを保存しますが、他の2つの要素(他のコンピューターのIPアドレスとポート番号)は、アプリケーション(sendto()機能)。

一方、TCPは接続指向であり、ソケットは2台のコンピューター間の接続を表します。したがって、1つのソケットは、(send()関数を使用して)特定のコンピューターの特定のTCPポートにデータを送信するためにのみ使用できます。

つまり、4タプルの4つの要素すべて(2つだけではない)がソケットに固定されているため、OSは4つの要素すべてを格納でき、アプリケーションは4つの要素のうち2つを提供する必要がありません。


0

あなたが読んでいる本が黒瀬ジムの「コンピュータネットワーキング-トップダウンアプローチ」である場合、あなたと私は同じ本を読んでいます。:-)参考までに、本は実際にはUDPソケットが宛先(ソースではなく)IPとポートに基づいていることを識別する2タプルを述べています。少なくとも、それは第7版で述べられていることです。

あなたの質問に答えるために、TCPはコネクション型ですが、UDPはコネクションレスです。したがって、ホストとサーバー間でTCP要求が確立されると、その接続の両側で、後続の要求が同じ接続を使用することを確認する必要があります(そうでない場合、TCPなどの接続指向プロトコルを使用する意味は何ですか?)。また、宛先IPとポートは同じであるが発信元IPとポートが異なる 2つのデータセグメントは、サーバー側で2つの個別のソケットを使用するため、後続のリクエストが元のリクエストと同じソケットを使用するようにする唯一の方法は、両方のソースを使用することです。データセグメントを正しいソケットと照合するときの宛先IP /ポート。

対照的に、UDPは、個別の要求ごとに新しい接続(つまり、新しいソケット)をセットアップするものと考えることができます。以前のリクエストと同じソケットを使用することを心配する必要がないため、セグメントをルーティングするUDPソケットを識別するときに、ソースIP /ポートを含める必要はありません。したがって、2タプルで十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.