これは私の組織のソフトウェアエンジニアの一人が提起した質問です。私は最も広い定義に興味があります。
A TCPソケットはエンドポイントinstanceであり、IPアドレスと特定のTCP接続またはリスニング状態のコンテキストでのポート。
ポートは、サービスエンドポイントを定義する仮想化識別子です(サービスインスタンスエンドポイント別名セッションとは異なります)識別子)。
A TCPソケットはnot接続ではありません、それはエンドポイントです特定の接続。
サービスエンドポイントへの同時接続が存在する可能性があります。接続はローカルとリモートの両方でによって識別されるためですエンドポイント。トラフィックを特定のサービスインスタンスにルーティングできます。
特定のアドレス/ポートの組み合わせに対して、リスナーソケットは1つしか存在できません。
これは興味深い質問であり、私は自分が裏返しに知っていると思った多くのことを再検討することを余儀なくされました。 「ソケット」のような名前は一目瞭然だと思います。ネットワークケーブルを接続するエンドポイントの画像を呼び起こすために選択されたのは明らかで、強力な機能的類似点があります。それにもかかわらず、ネットワーク用語では、「ソケット」という言葉は非常に多くの荷物を運ぶので、慎重な再検査が必要です。
最も広い意味で、ポートは入力または出力のポイントです。ネットワーキングコンテキストでは使用されませんが、フランス語porteは文字通りdoorまたはgatewayを意味し、ポートが輸送されているという事実をさらに強調していますデータまたは大型の鉄製コンテナを出荷するかどうかのエンドポイント。
この議論のために、TCP-IPネットワークのコンテキストへの考慮を制限します。 OSIモデルはすべて非常に優れていますが、完全に実装されたことはなく、トラフィックが多くストレスの多い状況ではそれほど広く普及していません。
IPアドレスとポートの組み合わせは、厳密にはエンドポイントと呼ばれ、ソケットとも呼ばれます。この使用法は、元のTCP仕様であるRFC793に由来します。
TCPconnectionは、2つのエンドポイント、別名socketsによって定義されます。
エンドポイント(ソケット)は、ネットワークアドレスとport識別子の組み合わせによって定義されます。アドレス/ポートはソケットを完全に識別するnotであることに注意してください(これについては後で説明します)。
ポートの目的は、特定のネットワークアドレス上の複数のエンドポイントを区別することです。ポートは仮想化されたエンドポイントであると言えます。この仮想化により、単一のネットワークインターフェイスで複数の同時接続が可能になります。
インターネットの各TCP接続を一意に識別する2つのエンドポイントを指定するのは、ソケットペア(クライアントIPアドレス、クライアントポート番号、サーバーIPアドレス、サーバーポート番号で構成される4組)です。 。 (TCP-IP Illustrated Volume 1、W。Richard Stevens)
ほとんどのC派生言語では、TCP接続が確立され、Socketクラスのインスタンスのメソッドを使用して操作されます。通常はNetworkStreamクラスのインスタンスである、より高いレベルの抽象化で動作するのが一般的ですが、これは一般にソケットオブジェクトへの参照を公開します。接続はソケットオブジェクトのメソッドを使用して作成および操作されるため、コーダーにとってこのソケットオブジェクトは接続を表すように見えます。
C#では、(既存のリスナーへの)TCP接続を確立するには、最初にTcpClientを作成します。 TcpClientコンストラクターにエンドポイントを指定しない場合、デフォルトを使用します-何らかの方法でローカルエンドポイントが定義されます。次に、作成したインスタンスでConnectメソッドを呼び出します。このメソッドには、他のエンドポイントを記述するパラメーターが必要です。
これは少し混乱を招き、ソケットは接続であり、ブロックであると考えるようになります。リチャード・ドーマンが質問するまで、私はこの誤解の下で働きました。
多くの読書と思考を行ったので、2つの引数をとるコンストラクターTcpConnectionを使用する方がはるかに理にかなっていると確信していますLocalEndpointおよびRemoteEndpoint。ローカルエンドポイントでデフォルトが受け入れられる場合、おそらく単一の引数RemoteEndpointをサポートできます。これはマルチホームコンピューターではあいまいですが、リモートエンドポイントへの最短ルートを持つインターフェイスを選択することにより、ルーティングテーブルを使用してあいまいさを解決できます。
他の点でも明瞭さが向上します。ソケットはnotIPアドレスとポートの組み合わせによって識別されます:
[...] 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つのソケットと、アドレス/ポートの組み合わせ54.252.94.236:80
を持つ2つのソケットがあります。
ハグラワルの誤解は、「特定する」という言葉を非常に慎重に使用したことから生じると思います。 「完全に、明確に、一意に識別する」ことを意味します。上記のサンプルには、アドレス/ポートの組み合わせ54.252.94.236:80
を持つ2つのエンドポイントがあります。アドレスとポートしか持っていない場合、これらのソケットを区別するのに十分な情報がありません。ソケットを識別するには十分な情報ではありません。
RFC793のセクション2.7のパラグラフ2には、
接続は、両端のソケットのペアによって完全に指定されます。ローカルソケットは、異なる外部ソケットへの多くの接続に参加できます。
このソケットの定義は、特定の接続のエンドポイントであるソケットobjectとは異なるため、プログラミングの観点からは役に立ちません。プログラマーにとって、この質問の聴衆のほとんどはプログラマーです。これは重要な機能の違いです。
ソケットは3つのことで構成されています。
ポートは、1から65535までの数字で、デバイス内の論理ゲートを表します。クライアントとサーバー間のすべての接続には固有のソケットが必要です。
例えば:
ソケット は、2つのネットワークアプリケーション間の単一接続を表します。これら2つのアプリケーションは公称上異なるコンピュータ上で動作しますが、ソケットは単一のコンピュータ上のプロセス間通信にも使用できます。アプリケーションは互いに通信するために複数のソケットを作成できます。ソケットは双方向です。つまり、接続のどちら側でもデータの送受信が可能です。したがって、ソケットは2以上のOSIモデルの任意のレベルで理論的に作成できます。間接的ではありますが、プログラマはネットワークプログラミングでソケットを使用することがよくあります。 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
アナロジーを使用
sockets ...については既に多くの技術的なものが上に与えられていますが、念のために答えを追加したいと思いますもし誰かがまだip、portとソケット
サーバーSの検討、
person X、Y、Zと言うサービス(チャットサービスなど)が必要server S
それから
IPアドレスが伝える-> who?is X、Y、Zが連絡したいチャットサーバー「S」
大丈夫、あなたは「誰がサーバーか」を得た
ただし、サーバー「S」が他の人にも他のサービスを提供しているとします。たとえば、「S」は人A、B、Cにストレージサービスを提供します
then
ポートが伝える ---> which? service you(X、Y、Z)needつまり、チャットサービスではなく、そのストレージサービス
大丈夫..、あなたは「チャットサービス」があなたが望むものであり、ストレージではないことを知るようにサーバーを作る
しかし
あなたは3人で、サーバーは3つすべてを別々に識別したいかもしれません
ソケットがあります
今ソケットが伝える-> どちらですか?特定の接続
つまり、
X人用のソケット1
Y人用のソケット2
および人Zのソケット3
私はそれがまだ混乱していた誰かを助けることを願っています:)
まず、AからBへのパケットの取得を構成する要素について少し理解することから始めます。
ネットワークの一般的な定義は OSIモデル の使用です。これは、目的に応じてネットワークをいくつかの層に分けます。いくつか重要なものがありますが、ここでカバーします。
TCPは、とりわけ、 ports の概念を含んでいます。これらは、インターネットソケット(AF_INET
)がバインドできる、同じIPアドレス上の事実上異なるデータエンドポイントです。
それが起こるように、 UDPも そして他のトランスポート層プロトコルもそうです。技術的にはポートを機能させるために need を使用することはありませんが、これらのポートは上の層の複数のアプリケーションが同じコンピュータを使用して発信接続を受け取る方法を提供します。
これにより、TCPまたはUDP接続の構造がわかります。それぞれに送信元ポートとアドレス、およびターゲットポートとアドレスがあります。これは、どのセッションでも、ターゲットアプリケーションがソースからの応答だけでなく応答もできるようにするためです。
そのため、ポートは、本質的に、同じアドレスを共有する複数の同時接続を許可するための仕様が規定された方法です。
今、私たちはあなたがアプリケーションの観点から外の世界へどのように通信するかを見てみる必要があります。これを行うには、オペレーティングシステムに親切に尋ねる必要があります。ほとんどのOSはBerkeley Socketsのやり方をサポートしているため、次のようなアプリケーションからポートを含むソケットを作成できます。
int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
すばらしいです! sockaddr
構造体では、portとbamを指定します。仕事は終わった!まあ、ほとんどの場合を除いて、
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
も可能です。うーん、それは作品の中でスパナをスローされます!
わかりました、実際にはそうではありません。私たちがする必要があるのは、いくつかの適切な定義を思いつくことです。
/var/run/database.sock
。ほら!それは物事を片付ける。だから私たちの計画では、
だから実際にポートはインターネットソケットを形成するための要件のサブセットです。残念ながら、Wordソケットの意味がいくつかの異なるアイデアに適用されているのはまさにその通りです。ですから、混乱を招くだけなので、次のプロジェクトソケットに名前を付けてください。
ソケット= IPアドレス+ポート(数値アドレス)
一緒に彼らはマシン上のネットワーク接続のためのエンドポイントを識別します。 (私はただネットワーク101を軽蔑したのですか?)
一般に、多くの理論的な知識がありますが、これら2つの概念を区別する最も簡単な方法の1つは次のとおりです。
サービスを受けるためには、サービス番号が必要です。このサービス番号はポートと呼ばれます。そのような単純な。
たとえば、サービスとしてのHTTPはポート80で実行されています。
今、多くの人々がサービスを要求することができ、クライアント - サーバーからの接続が確立されました。たくさんのつながりがあるでしょう。各接続はクライアントを表します。各接続を維持するために、サーバーはクライアントを維持するために接続ごとにソケットを作成します。
簡単な答え.
port は、プログラムまたはプロセスを識別するHost内の 内部アドレス として記述できます。
socket は プログラミングインタフェースとして記述することができます プログラムが他のプログラムやプロセスと、インターネット上で、またはローカルで通信できるようにします。
ソケットを2台のPC間の接続と同一視する答えはたくさんあるようです。私は絶対に間違っていると思います。ソケットは常に1 = PC上では endpoint となっていますが、接続されているかどうかは関係ありません。確かに、ある時点ですべてのユーザーがリスナーソケットまたはUDPソケットを使用しています。重要なのは、それがアドレス可能でアクティブだということです。そのエンドポイントにはソケットが定義されていないため、1.1.1.1:1234にメッセージを送信してもうまくいきません。
ソケットはプロトコル固有のものなので、 TCP / IP と UDP / IP という一意性の実装_は*(ipaddress:port)を使用します。例: IPX (Network、Node、... ahem、socket - ただし、一般的な「ソケット」とは異なるソケットIPXソケット番号はIPポートと同じです。しかし、それらはすべて固有のアドレス可能なエンドポイントを提供します。
IPが支配的なプロトコルになったので、ポートは(ネットワーキングの観点から)UDPまたはTCPポート番号のどちらかと同義になりました。これはソケットアドレスの一部です。
それらは2つの異なるドメインからの用語です: 'port'はTCP/IPネットワーキングからの概念であり、 'socket'はAPI(プログラミング)ものです。 「ソケット」は、ポートとホスト名またはネットワークアダプタを取得し、それらをデータの送受信に使用できるデータ構造に組み合わせることによって(コードで)作成されます。
優れた投票の答えを読んだ後、私は次の点を強調する必要があることに気付きました。ネットワークプログラミングの新参者です。
TCP-IP接続は、1つのアドレス:ポートの組み合わせと別のアドレス:ポートの組み合わせを接続する双方向経路です。したがって、ローカルコンピュータからリモートサーバーのポートへの接続を開くたびに(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
...
123.132.213.231 # IP address
:1234 # port number
123.132.213.231:1234 # socket address
2つのソケットが一緒にバインドされているときに接続が発生します。
ソケットは、オペレーティングシステムにネットワークサービスを要求するためにプロセスによって使用される特別な種類のファイルハンドルです。ソケットアドレスはトリプルです:{protocol、local-address、local-process}ここでローカルプロセスはポート番号で識別されます。
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}
有効な関連付けである可能性があります。
ハーフアソシエーションは、{protocol、local-address、local-process}のいずれかです。
または
{プロトコル、外部アドレス、外部プロセス}
これは接続の各半分を指定します。
ハーフアソシエーションはソケットまたはトランスポートアドレスとも呼ばれます。つまり、ソケットは、ネットワーク内で名前を付けてアドレス指定できる通信のエンドポイントです。ソケットインタフェースは、通信プロトコルへのいくつかのアプリケーションプログラミングインタフェース(API)の1つです。一般的な通信プログラミングインタフェースとして設計された、それは4.2BSD UNIXシステムによって最初に導入されました。標準化されていませんが、事実上の業界標準となっています。
ポートは最も簡単な部分でした、それは単にソケットのためのユニークな識別子です。ソケットは、プロセスが接続を確立し、互いに通信するために使用できるものです。 Tall Jeffは、完璧ではない素晴らしい電話アナロジーを持っていたので、それを修正することにしました。
from Oracle Javaチュートリアル :
ソケットは、ネットワーク上で実行されている2つのプログラム間の双方向通信リンクの1つのエンドポイントです。ソケットはポート番号にバインドされているため、TCPレイヤは、データの送信先となるアプリケーションを識別できます。
ソケットはあなたのソフトウェアの構造です。多かれ少なかれファイルです。読み取りや書き込みなどの操作があります。それは物理的なことではありません。ソフトウェアが物理的なものを参照する方法です。
ポートはデバイスのようなものです。各ホストには1つ以上のネットワークがあります(それらは物理的です)。ホストは各ネットワークにアドレスを持ちます。各アドレスは何千ものポートを持つことができます。
1つのソケットだけがアドレスでポートを使用している可能性があります。ソケットは、ファイルシステムI/O用にデバイスを割り当てるのとほぼ同じようにポートを割り当てます。ポートが割り当てられると、他のソケットはそのポートに接続できなくなります。ソケットを閉じるとポートは解放されます。
TCP/IPの専門用語 を見てください。
アプリケーションは、ネットワークを介して通信するプロセスのペア(クライアントとサーバーのペア)で構成されています。これらのプロセスは、 socket と呼ばれるソフトウェアインタフェースを介してネットワークとの間でメッセージを送受信します。 「コンピュータネットワーキング:トップダウンアプローチ」という本に提示されている類推を考察する。他の家とコミュニケーションをとりたい家があります。ここでは、家はプロセスに似ており、ソケットへの扉です。送信プロセスでは、データを宛先に転送するインフラストラクチャがドアの向こう側にあると想定しています。メッセージが反対側に到着すると、受信者のドア(ソケット)を通って家に入ります(プロセス)。同じ本からのこのイラストはあなたを助けることができます:
ソケットはトランスポート層の一部であり、アプリケーションへの論理的な通信を提供します。これは、アプリケーションの観点からは、それらの間に多数のルーターやスイッチが存在していても、両方のホストが互いに直接接続されていることを意味します。したがって、ソケットはそれ自体が接続ではなく、接続の終点です。トランスポート層プロトコルはホストにのみ実装され、中間ルーターには実装されません。
ポート 内部アドレス指定の手段をマシンに提供します。主な目的は、複数のプロセスが他のプロセス(それらのデータ)に干渉することなくネットワークを介してデータを送受信できるようにすることです。すべてのソケットにポート番号が付いています。セグメントがホストに到着すると、トランスポート層はそのセグメントの宛先ポート番号を調べます。その後、セグメントを対応するソケットに転送します。トランスポート層セグメント内のデータを正しいソケットに配信するこの作業は、 逆多重化 と呼ばれます。その後、セグメントのデータはソケットに接続されているプロセスに転送されます。
ポートとソケットは銀行支店と比較することができます。
「銀行」のビル番号はIPアドレスに似ています。銀行は以下のようなさまざまなセクションを持っています。
つまり、1(普通預金部門)、2(個人ローン部門)、3(住宅ローン部門)、4(苦情部門)がポートです。
普通預金口座を開設し、銀行(IPアドレス)に行き、次に「普通預金口座部門」(ポート番号1)に行き、次に「普通預金口座部門」で働いている従業員の1人に会います"口座開設のためにSAVINGACCOUNT_EMPLOYEE1と呼びましょう。
SAVINGACCOUNT_EMPLOYEE1はソケット記述子なので、SAVINGACCOUNT_EMPLOYEE1からSAVINGACCOUNT_EMPLOYEENまであります。これらはすべてソケット記述子です。
同様に、他の部署も彼らの下で働く従業員を持つことになり、それらはソケットに似ています。
ソケットは通信エンドポイントです。ソケットは、TCP/IPプロトコルファミリと直接の関係はありません。システムがサポートする任意のプロトコルと一緒に使用できます。 CソケットAPIは、最初にシステムから空のソケットオブジェクトを取得し、それをローカルソケットアドレスにバインドできるようにすることを期待しています(コネクションレス型プロトコルの着信トラフィックを直接取得する、またはコネクション型プロトコルの着信接続要求を受け入れる)または(どちらの種類のプロトコルでも)リモートソケットアドレスに接続できます。ソケットがバインドされているローカルソケットアドレスとソケットが接続されているリモートソケットアドレスの両方を制御する場合でも、両方を実行できます。ソケットを接続しないコネクションレスプロトコルの場合でもオプションですが、そうしない場合は、ソケットがどこに送信すればよいかを知るために、ソケットを介して送信したいパケットごとに宛先アドレスを渡す必要があります。このデータは?利点は、単一のソケットを使用してパケットをさまざまなソケットアドレスに送信できることです。ソケットを設定して接続したら、それを双方向通信パイプと見なします。あなたはそれを使ってデータをある目的地に渡すことができ、ある目的地はそれを使ってあなたにデータを戻すことができます。ソケットに書き込んだものは送信され、受け取ったものは読み取りに使用できます。
一方、ポートはTCP/IPプロトコルスタックの特定のプロトコルだけが持っているものです。 TCPおよびUDPパケットにはポートがあります。ポートは単なる数字です。送信元ポートと宛先ポートの組み合わせによって、2つのホスト間の通信チャネルが識別されます。例えば。単純なHTTPサーバーと単純なFTPサーバーの両方を兼ね備えたサーバーがあるかもしれません。パケットがそのサーバーのアドレスに到着した場合、それがHTTPまたはFTPサーバーのどちらのパケットであるかどうかはどのようにしてわかりますか? HTTPサーバーはポート80で、FTPサーバーはポート21で実行されるので、パケットが宛先ポート80に到着した場合は、HTTPサーバー用であり、FTPサーバー用ではありません。また、そのような送信元ポートがない場合、サーバは一度に1つのIPアドレスへの接続を1つしか持てないため、パケットに送信元ポートがあります。送信元ポートは、サーバーが他の点では同一の接続を区別することを可能にします。それらはすべて同じ宛先ポートを持ちます。ポート80、同じ宛先IPアドレス、常に同じサーバーアドレスと同じ送信元IPアドレスは、すべて同じクライアントからのものですが、送信元ポートが異なるため、サーバーはそれらを区別できます。そしてサーバが応答を返送するとき、それは要求が来たポートにそれをするでしょう、そのようにしてクライアントはまたそれが受け取る異なる返答を区別することができます。
私が仮定しているものである相対的なTCP/IP用語は、質問によって暗示されています。素人の言葉で:
PORTは特定の郵便番号の特定の家の電話番号のようなものです。町の郵便番号は、町とその町のすべての家のIPアドレスと見なすことができます。
一方、ソケットは、お互いに話し合っている一対の家の電話間で確立された電話のようなものです。これらの電話は、同じ町にある住宅間、または異なる町にある2つの住宅間で確立できます。それはお互いに話している電話のペア間の一時的な確立された経路であり、それがソケットです。
これらは基本的なネットワーキングの概念ですので、詳細を理解するための簡単で包括的な方法で説明します。
したがって、ネットワーキングのソケットは、(ip、port)=(address、service)のペアにバインドされた仮想通信デバイスです。
注意:
それがあなたの疑問を解消することを願っています
広義には、ソケット - それはまさにそれ、あなたの電気、ケーブルまたは電話ソケットのようなソケットです。 「必要なもの」(力、信号、情報)が出入りできるポイント。それは「必要なもの」の使用のために必要とされない多くの詳細なものを隠します。ソフトウェア用語では、2つのエンティティ間の通信メカニズムを定義する一般的な方法を提供します(それらのエンティティは何でもかまいません - 2つのアプリケーション、2つの物理的に離れたデバイス、OS内のユーザーとカーネル空間など)
ポートはエンドポイント識別子です。あるエンドポイントを別のエンドポイントと区別します。ネットワーキングレベルでは、それはあるアプリケーションを別のアプリケーションと区別します。その結果、ネットワーキングスタックは適切なアプリケーションに情報を渡すことができます。
単一のポートは、複数の電気コンセントのように、異なる外部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
ソケットは、データI/Oのためにカーネルによってユーザアプリケーションに提供される抽象概念です。ソケットの型はそのプロトコルの取り扱い、IPC通信などによって定義されます。したがって、誰かがTCPソケットを作成した場合、ソケットへのデータの読み取りやソケットへのデータの書き込みなどの操作ができます。単純なメソッドと、TCP変換、低レベルネットワークプロトコルへのパケット転送などの低レベルプロトコル処理は、カーネル内の特定のソケット実装によって行われます。利点は、ユーザがプロトコル特有の新種の扱いを心配する必要がなく、通常のバッファのようにソケットにデータを読み書きするだけでよいことです。 IPCの場合も同様です。ユーザーはソケットに対してデータを読み書きするだけで、カーネルは作成されたソケットのタイプに基づいてすべての下位レベルの詳細を処理します。
IPと一緒のポートはソケットにアドレスを提供するようなものですが、必須ではありませんが、ネットワーク通信に役立ちます。
ソケットはデータI/Oメカニズムです。ポートは 契約上 のコンセプト 通信プロトコル です。ソケットはポートなしで存在できます。特定のソケットなしでポートが存在する可能性があります(たとえば、同じポート上で複数のソケットがアクティブになっている場合、これは一部のプロトコルで許可される場合があります)。
ポートは、受信側がパケットをどのソケットにルーティングするかを決定するために使用されますが、常に必須ではなく、他の方法で受信側のソケットを選択することもできます。ネットワークサブシステム例えばプロトコルがポートを使用しない場合、パケットはすべての待機中のソケットまたは任意のソケットに送信される可能性があります。
この質問にはすでに理論的な答えがあります。私はこの質問に実際的な例を挙げたいと思います。それはSocketとPortについてのあなたの理解を明確にするでしょう。
見つけました ここ
この例では、Wileyなどの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ソケットになります。
説明がたくさんあることを私は知っています。しかし、実際的な例でもう少し簡単に理解できる方法があります。私たち全員がHTTPポート80に接続できますが、それは一度に1人のユーザーしかそのポートに接続できないという意味ですか?。答えは明らかに「いいえ」です。複数の目的のために複数のユーザーがHTTPポート80にアクセスできますが、彼らはまだサーバーから彼らが待っている適切な応答を得ますか?それではちょっと考えてみてください、どうですか。はい、あなたは正しいです、その IPアドレス それは、異なる目的のために連絡を取る異なるユーザーをユニークに識別します。ここに来る前に前の答えを読んだことがあれば、IPアドレスはソケットが構成する情報の一部であることがわかります。考えてみましょう、ソケットなしでコミュニケーションをとることは可能ですか?答えは「はい」ですが、1つのポートで複数のアプリケーションを実行することはできませんが、ハードウェアだけで実行される「ダンプ」スイッチではないことがわかります。
ソケットは基本的にネットワーク通信のエンドポイントであり、少なくともIPアドレスとポートで構成されています。 Java/C#では、ソケットは一方向の双方向接続の高レベルの実装です。
また、 Javaドキュメント の定義。
港:
ポートは、シリアルポート、パラレルポート、USBポートなどの周辺機器の物理的な接続ポイントを指すことができます。ポートという用語は、ハブ、スイッチ、またはルータ上のものなど、特定のイーサネット接続ポイントも指します。
ソケット:
ソケットは、2つのネットワークアプリケーション間の単一の接続を表します。これら2つのアプリケーションは公称上異なるコンピュータ上で動作しますが、ソケットは単一のコンピュータ上のプロセス間通信にも使用できます。アプリケーションは互いに通信するために複数のソケットを作成できます。ソケットは双方向です。つまり、接続のどちら側でもデータの送受信が可能です。
ポートは、IPネットワークプロトコルのTCPおよびUDPトランスポート内の通信エンドポイントを示します。ソケットは、これらのプロトコルの実装で一般的に使用されている通信エンドポイント(ソケットAPI)のソフトウェア抽象概念です。代替の実装はXTI/TLI APIです。
また見なさい:
Stevens、W.R。1998、UNIXネットワークプログラミング:ネットワーキングAPI:ソケットおよびXTI。第1巻、プレンティスホール。
Stevens、W.R。、1994、TCP/IP Illustrated、第1巻:プロトコル、Addison-Wesley.
Socketは、ネットワークエンドポイントをソフトウェアで抽象化したもので、アプリケーションへのインターフェイスとして使用されます。 Javaでは、C#はオブジェクトで表され、Linuxでは、UNIXではファイルです。
通信を確立したい場合、ポートは単にあなたが指定したソケットの特性です。パケットをソケットから受信するには、それを特定のローカルポートとNIC(ローカルIPアドレスを持つ)またはすべてのNICにバインドする必要があります(INADDR_ANYはバインド呼び出しで指定されます)。パケットを送信するには、リモートソケットのポートとIPを指定する必要があります。