回答:
TCPソケットは、特定のTCP接続またはリスニング状態のコンテキストでIPアドレスとポートによって定義されるエンドポイントインスタンスです。
ポートは、サービスエンドポイントを定義する仮想化識別子です(サービスインスタンスエンドポイント、つまりセッション識別子とは異なります)。
TCPソケットは接続ではなく、特定の接続のエンドポイントです。
接続はローカルエンドポイントとリモートエンドポイントの両方で識別され、トラフィックを特定のサービスインスタンスにルーティングできるため、サービスエンドポイントへの同時接続が可能です。
特定のアドレスとポートの組み合わせに対してリスナーソケットは1つしか存在できません。
これは興味深い質問で、私が知っていると思っていた多くのことを裏返しに再検討する必要がありました。「ソケット」のような名前は一目瞭然だと思います。ネットワークケーブルを接続するエンドポイントの画像を呼び出すために選択されたのは明らかで、強力な機能的類似性があります。それにもかかわらず、ネットワーク用語では、「ソケット」という言葉は手荷物が多いため、慎重に再検討する必要があります。
可能な限り広い意味では、ポートは入口または出口のポイントです。ネットワーキングのコンテキストでは使用されていませんが、フランス語の単語のporteは文字通りドアまたはゲートウェイを意味し、データまたは大きな鋼製コンテナのどちらを出荷する場合でも、ポートは輸送のエンドポイントであるという事実をさらに強調します。
この説明の目的上、TCP-IPネットワークのコンテキストへの考慮を制限します。OSIモデルはすべて非常に良好ですが、完全に実装されたことはなく、高トラフィックの高ストレス条件ではあまり広く展開されていません。
IPアドレスとポートの組み合わせは、厳密にエンドポイントと呼ばれ、ソケットと呼ばれることもあります。この使用法は、元のTCP仕様であるRFC793に由来しています。
TCP 接続は、ソケットとも呼ばれる2つのエンドポイントによって定義されます。
エンドポイント(ソケット)は、ネットワークアドレスとポート識別子の組み合わせによって定義されます。アドレス/ポートはソケットを完全には識別しないことに注意してください(これについては後で詳しく説明します)。
ポートの目的は、特定のネットワークアドレス上の複数のエンドポイントを区別することです。ポートは仮想化されたエンドポイントであると言えます。この仮想化により、単一のネットワークインターフェイスで複数の同時接続が可能になります。
インターネットの各TCP接続を一意に識別する2つのエンドポイントを指定するのは、ソケットペア(クライアントIPアドレス、クライアントポート番号、サーバーIPアドレス、およびサーバーポート番号で構成される4タプル)です。(TCP-IP Illustrated Volume 1、W。Richard Stevens)
ほとんどのC派生言語では、TCP接続は、Socketクラスのインスタンスのメソッドを使用して確立および操作されます。上位レベルの抽象化(通常はNetworkStreamクラスのインスタンス)を操作するのが一般的ですが、これは一般にソケットオブジェクトへの参照を公開します。コーダーにとって、このソケットオブジェクトは、接続がソケットオブジェクトのメソッドを使用して作成および操作されるため、接続を表すように見えます。
C#では、(既存のリスナーへの)TCP接続を確立するために、まずTcpClientを作成します。TcpClientコンストラクタにエンドポイントを指定しない場合、デフォルトを使用します- 何らかの方法でローカルエンドポイントが定義されます。次に、 作成したインスタンスでConnectメソッドを呼び出します。このメソッドには、他のエンドポイントを説明するパラメーターが必要です。
これは少し混乱し、ソケットは接続であると信じるようになります。リチャードドーマンが質問するまで、私はこの誤解の下で働いていました。
多くの読み書きを行った結果、LocalEndpointとRemoteEndpointの 2つの引数をとるコンストラクタを持つクラスTcpConnectionを作成する方がはるかに理にかなっていると確信しました。ローカルエンドポイントでデフォルトが受け入れられる場合は、おそらく単一の引数RemoteEndpointをサポートできます。これはマルチホームコンピュータではあいまいですが、リモートエンドポイントへのルートが最短のインターフェイスを選択することにより、ルーティングテーブルを使用してあいまいさを解決できます。
他の点でも明快さが向上します。ソケットは、IPアドレスとポートの組み合わせでは識別されません。
[...] TCPは、ローカルアドレスと外部アドレスを構成する4つの値すべてを使用して、着信セグメントを逆多重化します。宛先IPアドレス、宛先ポート番号、送信元IPアドレス、および送信元ポート番号。TCPは、宛先ポートだけを見ても、着信セグメントを取得するプロセスを判別できません。また、着信接続要求を受信する[特定のポート番号]の[さまざまな]エンドポイントの1つだけが、listen状態のエンドポイントです。(p255、TCP-IP Illustrated Volume 1、W。Richard Stevens)
ご覧のように、ネットワークサービスが同じアドレス/ポートを持つ多数のソケットを持つことは可能ではありますが、可能性が高いですが、特定のアドレス/ポートの組み合わせで1つのリスナーソケットのみが存在します。典型的なライブラリ実装はソケットクラスを提供し、そのインスタンスは接続の作成と管理に使用されます。これは混乱を引き起こし、2つの概念の広範な融合につながっているため、非常に残念です。
Hagrawalは私を信じていません(コメントを参照)ので、これが実際のサンプルです。Webブラウザをhttp://dilbert.comに接続して実行しましたnetstat -an -p tcp
。出力の最後の6行には、ソケットを一意に識別するにはアドレスとポートでは不十分であるという2つの例が含まれています。192.168.1.3(私のワークステーション)と54.252.94.236:80(リモートHTTPサーバー)の間には2つの異なる接続があります。
TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED
ソケットは接続のエンドポイントであるため、アドレス/ポートの組み合わせ207.38.110.62:80
を持つ2つのソケットと、アドレス/ポートの組み合わせを持つ2つのソケットがあります54.252.94.236:80
。
ハグラワールの誤解は、「識別する」という言葉を非常に注意深く使用したことに起因すると思います。「完全に、明確に、一意に識別する」という意味です。上記のサンプルには、アドレスとポートの組み合わせを持つ2つのエンドポイントがあります54.252.94.236:80
。アドレスとポートしかない場合、これらのソケットを区別するのに十分な情報がありません。ソケットを識別するのに十分な情報ではありません。
RFC793のセクション2.7のパラグラフ2は言う
接続は、両端のソケットのペアによって完全に指定されます。ローカルソケットは、さまざまな外部ソケットへの多くの接続に参加できます。
このソケットの定義は、特定の接続のエンドポイントであるソケットオブジェクトとは異なるため、プログラミングの観点からは役に立ちません。プログラマーにとって、そしてこの質問の聴衆のほとんどはプログラマーであるので、これは重要な機能上の違いです。
ソケットは次の3つで構成されます。
ポートは、デバイスの論理ゲートを示す1〜65535の数値です。クライアントとサーバー間のすべての接続には、一意のソケットが必要です。
例えば:
ソケットは、2つのネットワークアプリケーション間の単一の接続を表します。これら2つのアプリケーションは、名目上は異なるコンピューター上で実行されますが、ソケットは単一のコンピューター上のプロセス間通信にも使用できます。アプリケーションは、相互に通信するための複数のソケットを作成できます。ソケットは双方向です。つまり、接続のどちらの側でもデータの送信と受信の両方が可能です。したがって、理論的には、OSIモデルの2つ以上の任意のレベルでソケットを作成できます。プログラマーは、間接的ではありますが、ネットワークプログラミングでソケットを使用することがよくあります。Winsockのようなプログラミングライブラリは、ソケットプログラミングの低レベルの詳細の多くを隠しています。ソケットは1980年代初頭から広く使用されています。
ポートは、ネットワーク通信のエンドポイントまたは「チャネル」を表します。ポート番号により、同じコンピューター上の異なるアプリケーションが相互に干渉することなくネットワークリソースを利用できます。ポート番号は、ネットワークプログラミング、特にソケットプログラミングで最もよく使用されます。ただし、通常のユーザーにはポート番号が表示されることがあります。たとえば、ユーザーがインターネット上でアクセスする一部のWebサイトは、次のようなURLを使用します。
http://www.mairie-metz.fr:8080/この例では、番号8080は、WebサーバーがWebサーバーに接続するために使用するポート番号を示しています。通常、Webサイトはポート番号80を使用し、この番号をURLに含める必要はありません(含めることもできます)。
IPネットワーキングでは、理論的に0〜65535の範囲のポート番号を使用できます。ただし、最も一般的なネットワークアプリケーションでは、範囲の下限(HTTPの80など)でポート番号を使用します。
注:ポートという用語は、ネットワーク技術の他のいくつかの側面も指します。ポートは、シリアル、パラレル、USBポートなどの周辺機器の物理的な接続ポイントを指します。ポートという用語は、ハブ、スイッチ、ルーターなどの特定のイーサネット接続ポイントも指します。
ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm
ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm
いくつかの類推で
ソケットについてはすでに多くの技術的なことを説明していますが、誰かがまだip、port、socketの違いを感じられなかった場合に備えて、私の答えを追加したいと思います。
サーバーSについて考えます。
そして、X、Y、Zの人がそのサーバーSからのサービス(たとえば、チャットサービス)を必要としていると言います。
その後
IPアドレスが示す -> 誰ですか?X、Y、Zが連絡したいチャットサーバー 'S'です。
さて、あなたは「サーバーは誰ですか」を得ました
しかし、サーバー「S」が他の人々にもいくつかの他のサービスを提供していると仮定します。「S」が人A、B、Cにストレージサービスを提供するとします
その後
ポートが伝える ---> どちらですか?あなた(X、Y、Z)が必要とするサービス、つまりチャットサービスであり、そのストレージサービスではない
大丈夫..、あなたは「チャットサービス」があなたが望むものであり、ストレージではないことをサーバーに知らせます
だが
あなたは3人で、サーバーは3つすべてを異なる方法で識別したい場合があります
ソケットがあります
今ソケットは教えます -> どれですか?特定の接続
つまり、
人Xのソケット1
人Yのソケット2
人Zのソケット3
それがまだ混乱している人を助けることを願っています:)
まず、AからBへのパケットの取得について、少し理解することから始めるべきだと思います。
ネットワークの一般的な定義は、目的に応じてネットワークをいくつかの層に分離するOSIモデルの使用です。ここでは、重要なものをいくつか取り上げます。
TCPには、特にポートの概念が含まれています。これらは、インターネットソケット(AF_INET
)がバインドできる同じIPアドレス上の事実上異なるデータエンドポイントです。
たまたま、UDPや他のトランスポート層プロトコルもそうです。技術的にポートを搭載する必要はありませんが、これらのポートは、上の層の複数のアプリケーションが同じコンピューターを使用して送信接続を受信する(実際に行う)方法を提供します。
これにより、TCPまたはUDP接続の構造がわかります。それぞれがソースポートとアドレス、およびターゲットポートとアドレスを備えています。これは、特定のセッションで、ターゲットアプリケーションがソースから応答および受信できるようにするためです。
したがって、ポートは本質的に、同じアドレスを共有する複数の同時接続を許可する仕様で義務付けられた方法です。
ここで、アプリケーションの観点から外の世界への通信方法を確認する必要があります。これを行うには、オペレーティングシステムに親切に質問する必要があります。ほとんどのOSはバークレーソケットの方法をサポートしているため、次のようなアプリケーションからポートを含むソケットを作成できます。
int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
すごい!したがって、sockaddr
構造では、ポートとBAMを指定します。仕事完了!まあ、ほとんど、以下を除いて:
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
も可能です。ああ、それは作品にスパナを投げました!
わかりました、実際にはそうではありません。私たちがする必要があるのは、いくつかの適切な定義を考え出すことです:
/var/run/database.sock
です。出来上がり!それは物事を片付けます。ですから私たちの計画では
したがって、実際にはポートはインターネットソケットを形成するための要件のサブセットです。残念ながら、たまたま、ソケットという言葉の意味がいくつかの異なるアイデアに適用されています。混乱を増すために、次のプロジェクトソケットに名前を付けることを強くお勧めします;)
ソケット= IPアドレス+ポート(数値アドレス)
一緒に、マシン上のネットワーク接続のエンドポイントを識別します。(ネットワーク101をフランクしただけですか?)
一般に、多くの理論がわかりますが、これら2つの概念を区別する最も簡単な方法の1つは次のとおりです。
サービスを受けるには、サービス番号が必要です。このサービス番号はポートと呼ばれます。そのような単純な。
たとえば、サービスとしてのHTTPはポート80で実行されています。
これで、多くの人がサービスをリクエストでき、クライアント/サーバーからの接続が確立されました。たくさんのつながりがあります。各接続はクライアントを表します。各接続を維持するために、サーバーは接続ごとにソケットを作成してクライアントを維持します。
ソケットを2台のPC間の接続と同等とする答えはたくさんあるようです。これは間違いです。ソケットは常に1台のPC のエンドポイントでしたが、接続されている場合と接続されていない場合があります-確かに、ある時点ですべてのリスナーまたはUDPソケット*を使用しました。重要な部分は、それがアドレス指定可能でアクティブであることです。1.1.1.1:1234にメッセージを送信しても、そのエンドポイントにソケットが定義されていないため、機能しない可能性があります。
ソケットはプロトコル固有です-そのため、TCP / IPとUDP / IPの両方が使用する一意性の実装*(ipaddress:port)は、IPX(ネットワーク、ノード、...など)とは異なりますが、ソケットは異なりますソケットは、一般的な「ソケット」という用語が意味します。IPXソケット番号は、IPポートと同等です)。しかし、それらはすべて、一意のアドレス可能なエンドポイントを提供します。
IPが主流のプロトコルになったため、ポート(ネットワーク用語で)は、ソケットアドレスの一部であるUDPまたはTCPポート番号と同じ意味になります。
短い簡単な答え。
ポートは、のように記述することができる内部アドレスプログラムまたはプロセスを特定のホスト内。
ソケットは、として記述することができるインタフェースプログラミングローカルインターネット上で、他のプログラムまたはプロセスと通信するためのプログラムを可能にする、または。
これらは2つの異なるドメインの用語です。「ポート」はTCP / IPネットワーキングの概念であり、「ソケット」はAPI(プログラミング)のことです。「ソケット」は、ポートとホスト名またはネットワークアダプターを取得し、それらをデータの送受信に使用できるデータ構造に結合することにより(コードで)作成されます。
これらは基本的なネットワーキングの概念なので、詳細を理解するための簡単かつ包括的な方法で説明します。
したがって、ネットワーキングのソケットは、ペア(ip、ポート)=(address、service)にバインドされた仮想通信デバイスです。
注意:
それがあなたの疑問を晴らしてくれることを願っています
優れた投票結果を読んだ後、ネットワークプログラミングの初心者である私にとって、次の点を強調する必要があることがわかりました。
TCP-IP接続は、あるアドレス:ポートの組み合わせを別のアドレス:ポートの組み合わせに接続する双方向の経路です。したがって、ローカルマシンからリモートサーバーのポート(www.google.com:80など)への接続を開くときは常に、マシンの新しいポート番号を接続に関連付けて、サーバーが送信できるようにします。物事をあなたに返します(例:127.0.0.1:65234)。マシンの接続を確認するには、netstatを使用すると便利です。
> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 192.168.0.6.49871 17.172.232.57.5223 ESTABLISHED
...
ソケットは、オペレーティングシステムからネットワークサービスを要求するためにプロセスによって使用される特殊なタイプのファイルハンドルです。ソケットアドレスは、トリプル:{プロトコル、ローカルアドレス、ローカルプロセス}であり、ローカルプロセスはポート番号で識別されます。
TCP / IPスイートでは、例えば:
{tcp、193.44.234.3、12345}
会話は、2つのプロセス間の通信リンクであり、したがって2つのプロセス間の関連付けを表します。関連付けは、接続を構成する2つのプロセスを完全に指定する5つのタプルです:{プロトコル、ローカルアドレス、ローカルプロセス、外部アドレス、外部プロセス}
TCP / IPスイートでは、例えば:
{tcp、193.44.234.3、1500、193.44.234.5、21}
有効な関連付けである可能性があります。
半関連付けは、次のいずれかです。{プロトコル、ローカルアドレス、ローカルプロセス}
または
{プロトコル、外部アドレス、外部プロセス}
接続の各半分を指定します。
半関連付けは、ソケットまたはトランスポートアドレスとも呼ばれます。つまり、ソケットは、ネットワークで名前を付けてアドレス指定できる通信のエンドポイントです。ソケットインターフェイスは、通信プロトコルに対するいくつかのアプリケーションプログラミングインターフェイス(API)の1つです。汎用の通信プログラミングインターフェイスとして設計され、4.2BSD UNIXシステムによって最初に導入されました。標準化されていませんが、事実上の業界標準になっています。
ソケットは通信エンドポイントです。ソケットは、TCP / IPプロトコルファミリとは直接関係ありません。システムがサポートする任意のプロトコルで使用できます。CソケットAPIは、最初にシステムから空のソケットオブジェクトを取得し、それをローカルソケットアドレスにバインドできることを想定しています(コネクションレスプロトコルの着信トラフィックを直接取得するか、コネクション型プロトコルの着信接続要求を受け入れます)。または、リモートソケットアドレスに接続できます(どちらの種類のプロトコルでも)。ソケットをバインドするローカルソケットアドレスとソケットが接続するリモートソケットアドレスの両方を制御する場合は、両方を実行することもできます。コネクションレスプロトコルの場合、ソケットの接続はオプションですが、それを行わない場合は、ソケットがこのデータの送信先を他にどのように知っているので、ソケット経由で送信するすべてのパケットで宛先アドレスも渡す必要がありますか?利点は、単一のソケットを使用して、異なるソケットアドレスにパケットを送信できることです。ソケットを構成し、場合によっては接続さえしたら、それを双方向通信パイプと見なします。これを使用して、ある宛先にデータを渡すことができます。また、一部の宛先は、それを使用してデータを返すことができます。ソケットに書き込むものは送信され、受信したものは読み取りに使用できます。これを使用して、ある宛先にデータを渡すことができます。また、一部の宛先は、それを使用してデータを返すことができます。ソケットに書き込むものは送信され、受信したものは読み取りに使用できます。これを使用して、ある宛先にデータを渡すことができます。また、一部の宛先は、それを使用してデータを返すことができます。ソケットに書き込むものは送信され、受信したものは読み取りに使用できます。
一方、ポートは、TCP / IPプロトコルスタックの特定のプロトコルのみが持つものです。TCPおよびUDPパケットにはポートがあります。ポートは単なる数字です。送信元ポートと宛先ポートの組み合わせにより、2つのホスト間の通信チャネルが識別されます。たとえば、単純なHTTPサーバーと単純なFTPサーバーの両方になるサーバーがあるとします。パケットがそのサーバーのアドレスに到着した場合、それがHTTPサーバー用かFTPサーバー用かをどのようにして知るのでしょうか?HTTPサーバーがポート80で実行され、FTPサーバーがポート21で実行されるため、パケットが宛先ポート80で到着する場合、HTTPサーバー用であり、FTPサーバー用ではありません。また、パケットには送信元ポートがあり、そのような送信元ポートがないと、サーバーは一度に1つのIPアドレスにしか接続できません。送信元ポートを使用すると、サーバーは他の点では同一の接続を区別できます。これらはすべて、同じ宛先ポート(ポート80など)、同じ宛先IP(サーバーのIP)、および同じ送信元IPを持ちます。同じクライアントですが、送信元ポートが異なるため、サーバーはそれらを互いに区別できます。そして、サーバーが応答を返すとき、それは要求が来たポートにそうします、それでクライアントは同じサーバーから受け取った異なる応答を区別することもできます。
ポートは最も簡単な部分でした。これは、ソケットの一意の識別子です。ソケットは、プロセスが接続を確立し、相互に通信するために使用できるものです。トール・ジェフは完璧な電話の類推をしていなかったので、修正することにしました。
netstat
ディスプレイを見てください。リスニングソケットから受け入れられたすべてのソケットは、同じポートを共有します。Ergoポートは、ソケットの一意の識別子ではありません。
アプリケーションは、ネットワークを介して通信するプロセスのペアで構成されます(クライアント/サーバーのペア)。これらのプロセスは、socketと呼ばれるソフトウェアインターフェイスを介して、ネットワークとの間でメッセージを送受信します。本「コンピュータネットワーキング:トップダウンアプローチ」で提示された類推を検討してください。他の家とコミュニケーションしたい家があります。ここでは、家はプロセスに、ドアはソケットに似ています。送信プロセスは、データを宛先に転送するインフラストラクチャがドアの反対側にあると想定しています。メッセージが反対側に到着すると、受信側のドア(ソケット)を通過して家(プロセス)に入ります。同じ本のこの図は、次のことに役立ちます。
ソケットはトランスポート層の一部であり、アプリケーションへの論理的な通信を提供します。これは、アプリケーションの観点から見ると、それらの間に多数のルーターやスイッチがある場合でも、両方のホストが互いに直接接続されていることを意味します。したがって、ソケットはそれ自体が接続ではなく、接続のエンドポイントです。トランスポート層プロトコルはホストにのみ実装され、中間ルーターには実装されません。
ポートマシンへの内部アドレス指定の手段を提供します。主な目的は、複数のプロセスが他のプロセス(データ)に干渉することなくネットワークを介してデータを送受信できるようにすることです。すべてのソケットにはポート番号が付いています。セグメントがホストに到着すると、トランスポート層はセグメントの宛先ポート番号を調べます。次に、セグメントを対応するソケットに転送します。トランスポート層セグメントのデータを正しいソケットに配信するこのジョブは、逆多重化と呼ばれます。セグメントのデータは、ソケットに接続されているプロセスに転送されます。
ソケットはソフトウェアの構造です。それは多かれ少なかれファイルです。読み取りや書き込みなどの操作があります。それは物理的なものではありません。ソフトウェアが物理的なものを参照する方法です。
ポートはデバイスのようなものです。各ホストには1つ以上のネットワークがあります(これらは物理的です)。ホストは各ネットワークにアドレスを持っています。各アドレスは数千のポートを持つことができます。
1つのソケットのみがアドレスでポートを使用している可能性があります。ソケットは、ファイルシステムI / O用のデバイスの割り当てとほぼ同じようにポートを割り当てます。ポートが割り当てられると、他のソケットはそのポートに接続できなくなります。ソケットが閉じられると、ポートは解放されます。
見てみましょうTCP / IPの用語。
ソケットは、ネットワーク上で実行されている2つのプログラム間の双方向通信リンクの1つのエンドポイントです。ソケットはポート番号にバインドされているため、TCP層はデータの送信先のアプリケーションを識別できます。
ポートとソケットは銀行支店と比較できます。
「銀行」の建物番号はIPアドレスに類似しています。銀行には、次のようなさまざまなセクションがあります。
つまり、1(普通預金部門)、2(個人ローン部門)、3(住宅ローン部門)、4(苦情部門)がポートです。
ここで、普通預金口座を開き、銀行(IPアドレス)に行き、次に「普通預金部門」(ポート番号1)に行き、「普通預金部門」の下で働いている従業員の1人に会ったとします。 」アカウントを開設するために彼をSAVINGACCOUNT_EMPLOYEE1と呼びましょう。
SAVINGACCOUNT_EMPLOYEE1はソケット記述子であるため、SAVINGACCOUNT_EMPLOYEE1からSAVINGACCOUNT_EMPLOYEENが存在する場合があります。これらはすべてソケット記述子です。
同様に、他の部門もその下で雇用者を雇うことになり、それらはソケットに似ています。
ソケットはデータI / Oメカニズムです。ポートは、通信プロトコルの契約上の概念です。ソケットはポートなしで存在できます。特定のソケットなしでポートが存在する場合があります(たとえば、同じポートで複数のソケットがアクティブで、一部のプロトコルで許可されている場合)。
ポートは、多くのプロトコルで、レシーバーがパケットをルーティングするソケットを決定するために使用されますが、必ずしも必要ではなく、受信ソケットの選択は他の方法で行うことができます-ポートは、完全にプロトコルハンドラーによって使用されるツールですネットワークサブシステム。たとえば、プロトコルがポートを使用しない場合、パケットはすべての待機ソケットまたは任意のソケットに送信できます。
私が想定している相対的なTCP / IP用語は、質問によって暗示されています。素人の言葉で:
PORTは、特定の郵便番号の特定の家の電話番号のようなものです。町の郵便番号は、町とその町のすべての家のIPアドレスと考えることができます。
一方、SOCKETは、互いに話し合っている2つの家の電話間で確立された電話のようなものです。これらの通話は、同じ町の家の間、または別の町の2つの家の間で確立できます。それは、SOCKETである、互いに通信している電話のペア間に一時的に確立された経路です。
広い意味で、ソケット-それはまさにあなたの電気、ケーブル、電話のソケットのようなソケットです。「必要なもの」(電力、信号、情報)が出入りできるポイント。「必要なもの」を使用するために必要とされない、多くの詳細なものを非表示にします。ソフトウェア用語では、2つのエンティティ間の通信メカニズムを定義する一般的な方法を提供します(これらのエンティティは、2つのアプリケーション、2つの物理的に別個のデバイス、OS内のユーザーとカーネルスペースなど、何でもかまいません)。
ポートはエンドポイント識別子です。エンドポイントを区別します。ネットワーキングレベルでは、1つのアプリケーションを別のアプリケーションと区別するため、ネットワークスタックは適切なアプリケーションに情報を渡すことができます。
この質問にはすでに理論的な答えが出されています。この質問の具体的な例を挙げれば、ソケットとポートに関する理解が深まります。
この例では、WileyなどのWebサイトに接続するプロセスについて説明します。Webブラウザー(Mozilla Firefoxなど)を開き、アドレスバーにwww.wiley.comと入力します。Webブラウザーは、ドメインネームシステム(DNS)サーバーを使用して、www.wiley.comという名前を検索し、そのIPアドレスを特定します。この例では、アドレスは192.0.2.100です。
Firefoxは、192.0.2.100アドレスと、アプリケーションレイヤーWebサーバーが動作しているポートへの接続を確立します。Firefoxは、よく知られたポートであるため、どのポートを予期するかを認識しています。Webサーバーの既知のポートはTCPポート80です。
Firefoxが接続を試みる宛先ソケットは、socket:port、またはこの例では192.0.2.100:80と記述されています。これは接続のサーバー側ですが、サーバーはMozilla Firefoxで表示するWebページの送信先を知っている必要があるため、接続のクライアント側にもソケットがあります。
クライアント側の接続は、192.168.1.25などのIPアドレスと、ランダムに選択された動的ポート番号で構成されます。Firefoxに関連付けられたソケットは、192.168.1.25:49175のようになります。WebサーバーはTCPポート80で動作するため、これらのソケットは両方ともTCPソケットですが、UDPポートで動作するサーバーに接続している場合、サーバーとクライアントのソケットは両方ともUDPソケットになります。
ソケットは、データI / Oのためにカーネルがユーザーアプリケーションに提供する抽象化です。ソケットタイプは、その処理、IPC通信などのプロトコルによって定義されます。したがって、誰かがTCPソケットを作成した場合、ソケットへのデータの読み取りや書き込みなどの操作を、TCP変換や下位レベルのネットワークプロトコルへのパケットの転送は、カーネルの特定のソケット実装によって行われます。利点は、ユーザーがプロトコル固有の軽微さを処理することを心配する必要がなく、通常のバッファーのようにデータをソケットに読み書きするだけでよいことです。IPCの場合も同様です。ユーザーはデータをソケットに読み書きするだけで、カーネルは作成されたソケットのタイプに基づいて、すべての下位レベルの詳細を処理します。
ポートとIPは、必ずしも必要ではありませんが、ソケットにアドレスを提供するようなものですが、ネットワーク通信には役立ちます。
単一のポートは、複数のコンセントのような異なる外部IPに接続された1つ以上のソケットを持つことができます。
TCP 192.168.100.2:9001 155.94.246.179:39255 ESTABLISHED 1312
TCP 192.168.100.2:9001 171.25.193.9:61832 ESTABLISHED 1312
TCP 192.168.100.2:9001 178.62.199.226:37912 ESTABLISHED 1312
TCP 192.168.100.2:9001 188.193.64.150:40900 ESTABLISHED 1312
TCP 192.168.100.2:9001 198.23.194.149:43970 ESTABLISHED 1312
TCP 192.168.100.2:9001 198.49.73.11:38842 ESTABLISHED 1312
ソケットは基本的にネットワーク通信のエンドポイントであり、少なくともIPアドレスとポートで構成されます。Java / C#では、ソケットは、双方向接続の一方のより高いレベルの実装です。
また、Javaドキュメントでの定義。
ポート:
ポートは、シリアル、パラレル、USBポートなどの周辺機器の物理的な接続ポイントを指します。ポートという用語は、ハブ、スイッチ、ルーターなどの特定のイーサネット接続ポイントも指します。
ソケット:
ソケットは、2つのネットワークアプリケーション間の単一の接続を表します。これら2つのアプリケーションは、名目上は異なるコンピューター上で実行されますが、ソケットは単一のコンピューター上のプロセス間通信にも使用できます。アプリケーションは、相互に通信するための複数のソケットを作成できます。ソケットは双方向です。つまり、接続のどちらの側でもデータの送信と受信の両方が可能です。
ポートは、IPネットワークプロトコルのTCPおよびUDPトランスポートの通信エンドポイントを示します。ソケットは、これらのプロトコル(ソケットAPI)の実装で一般的に使用される通信エンドポイントのソフトウェア抽象化です。別の実装はXTI / TLI APIです。
以下も参照してください。
Stevens、WR 1998、UNIXネットワークプログラミング:ネットワーキングAPI:ソケットとXTI。第1巻、プレンティスホール。
Stevens、WR、1994、TCP / IP Illustrated、Volume 1:The Protocols、Addison-Wesley。