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