質問
これは、私の組織のソフトウェア エンジニアの 1 人が提起した質問です。私は最も広い定義に興味があります。
正しい解決策はありません
他のヒント
概要
TCPソケットは、特定のTCP接続またはリスニング状態のコンテキストでIPアドレスとポートによって定義されるエンドポイントインスタンス です。
ポートは、サービスエンドポイントを定義する仮想化識別子です(サービスインスタンスエンドポイント(セッション識別子)とは異なります)。
TCPソケットは接続ではなく 、特定の接続のエンドポイントです。
サービスエンドポイントへの同時接続が可能です。これは、接続がそのローカルエンドポイントとリモートエンドポイントの両方によって識別され、トラフィックを特定のサービスインスタンスにルーティングできるためです。 。
特定のアドレス/ポートの組み合わせに対して、リスナーソケットは1つしか存在できません。
博覧会
これは、私が裏返しに知っていると思っていた多くのことを再検討せざるを得ない興味深い質問でした。 「ソケット」のような名前だと思うでしょう。自明です:ネットワークケーブルを接続するエンドポイントの画像を呼び出すために選択されたのは明らかで、強力な機能の類似点があります。それでも、ネットワーク用語では「ソケット」という言葉は荷物が非常に多いため、慎重な再検査が必要です。
最も広い意味で、ポートは入力または出力のポイントです。ネットワークの文脈では使用されていませんが、フランス語の porte は文字通り doorまたはgateway を意味し、データや大型の鉄製コンテナを輸送する場合でもポートが輸送エンドポイントであることを強調します。
この説明の目的上、TCP-IPネットワークのコンテキストへの考慮を制限します。 OSIモデルはすべて非常に優れていますが、完全に実装されたことはなく、トラフィックの多い高ストレスの状況ではそれほど広く展開されていません。
IPアドレスとポートの組み合わせは、厳密にはエンドポイントと呼ばれ、ソケットとも呼ばれます。この使用法は、元のTCP仕様であるRFC793に由来しています。
TCP connection は、2つのエンドポイント、つまり sockets によって定義されます。
エンドポイント(ソケット)は、ネットワークアドレスとポート識別子の組み合わせによって定義されます。アドレス/ポートはソケットを完全には識別しない ことに注意してください(これについては後で説明します)。
ポートの目的は、特定のネットワークアドレス上の複数のエンドポイントを区別することです。ポートは仮想化されたエンドポイントであると言えます。この仮想化により、単一のネットワークインターフェイスで複数の同時接続が可能になります。
ソケットペア(4タプル クライアントIPアドレスで構成され、 クライアントのポート番号、サーバーのIPアドレス、 およびサーバーのポート番号) 一意の2つのエンドポイント 内の各TCP接続を識別します インターネット。 ( TCP-IP Illustrated Volume 1 、W。リチャードスティーブンス)
ほとんどのC派生言語では、TCP接続はSocketクラスのインスタンスのメソッドを使用して確立および操作されます。通常はNetworkStreamクラスのインスタンスである、より高いレベルの抽象化で動作するのが一般的ですが、これは一般にソケットオブジェクトへの参照を公開します。接続はソケットオブジェクトのメソッドを使用して作成および操作されるため、コーダーにとってこのソケットオブジェクトは接続を表すように見えます。
C#では、(既存のリスナーへの)TCP接続を確立するには、まず TcpClient を作成します。 TcpClient コンストラクターにエンドポイントを指定しない場合、デフォルトを使用します-何らかの方法でローカルエンドポイントが定義されます。次に、 Connect を呼び出します 作成したインスタンスのメソッド。このメソッドには、他のエンドポイントを記述するパラメーターが必要です。
これは少し混乱を招き、ソケットは接続であり、ブロックであると考えるようになります。私はこのミスアプリの下で働いていましたリチャード・ドーマンが質問をするまでリハビリ。
多くの読書と思考を行ったので、2つの引数 LocalEndpoint および RemoteEndpoint 。ローカルエンドポイントでデフォルトが受け入れられる場合は、おそらく単一の引数 RemoteEndpoint をサポートできます。これはマルチホームコンピューターではあいまいですが、リモートエンドポイントへの最短ルートを持つインターフェイスを選択することにより、ルーティングテーブルを使用してあいまいさを解決できます。
他の点でも透明度が向上します。ソケットは、IPアドレスとポートの組み合わせによって識別されません :
[...] TCPは、ローカルおよび外部アドレスを構成する4つの値(宛先IPアドレス、宛先ポート番号、送信元IPアドレス、および送信元ポート番号)をすべて使用して、着信セグメントを逆多重化します。 TCPは、宛先ポートのみを調べて、どのプロセスが着信セグメントを取得するかを判断できません。また、着信接続要求を受信する[指定されたポート番号]の[さまざまな]エンドポイントの1つだけがlisten状態のエンドポイントです。 (p255、 TCP-IP Illustrated Volume 1 、W。リチャードスティーブンス)
ご覧のとおり、ネットワークサービスが同じアドレス/ポートを持つ多数のソケットを持つことは可能ですが、特定のアドレス/ポートの組み合わせで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のソケットがさらに2つあります:80
。
ハグラワルの誤解は、「識別する」という言葉を非常に慎重に使用したことに起因すると思います。 「完全に、明確に、一意に識別する」という意味です。上記のサンプルには、アドレス/ポートの組み合わせが 54.252.94.236:80
の2つのエンドポイントがあります。アドレスとポートしか持っていない場合、これらのソケットを区別するのに十分な情報がありません。ソケットを識別するには十分な情報ではありません。
補遺
RFC793のセクション2.7の段落2では、
接続は、両端のソケットのペアによって完全に指定されます。 A ローカルソケットは異なる外部への多くの接続に参加するかもしれません ソケット。
このソケットの定義は、特定の接続のエンドポイントであるソケットオブジェクトとは異なるため、プログラミングの観点からは役に立ちません。プログラマーにとって、この質問の聴衆のほとんどはプログラマーです。これは重要な機能の違いです。
参照
ソケットは次の3つの要素で構成されています。
- IPアドレス
- トランスポートプロトコル
- ポート番号
ポートは、デバイス内の論理ゲートを示す1〜65535の数値です。 クライアントとサーバー間のすべての接続には、一意のソケットが必要です。
例:
- 1030はポートです。
- (10.1.1.2、TCP、ポート1030)はソケットです。
ソケットは、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、ポート、ソケットの違いをまだ誰かが感じられない場合
サーバーSを検討する、
そして person X、Y、Z と言うと、そのサーバーS
からのサービス(チャットサービスなど)が必要ですthen
IPアドレスが伝える-> 誰? は、X、Y、Zが連絡したいチャットサーバー「S」です
わかりました、「サーバーは誰ですか」
ただし、サーバー「S」が他の人にも他のサービスを提供していると仮定します。たとえば、「S」はA、B、Cの人にストレージサービスを提供します
then
port tells ---> どちら?あなたが必要とするサービス(X、Y、Z)は、ストレージサービスではなくチャットサービスです
OK
しかし あなたは3人で、サーバーは3つすべてを別々に識別したい場合があります ソケット 今ソケットが伝える-> どれですか? 特定の接続 つまり、 X人のソケット1 Y人用のソケット2 およびZ人のソケット3 まだ混乱している人の助けになることを願っています
:)
まず、A から B にパケットを送信するということについて少し理解することから始める必要があると思います。
ネットワークの一般的な定義は、 OSIモデル これにより、目的に応じてネットワークがいくつかの層に分割されます。重要なものがいくつかありますので、ここで説明します。
- の データリンク層. 。この層は、あるネットワーク デバイスから別のネットワーク デバイスにデータのパケットを取得する役割を担っており、実際に送信を行う層のすぐ上にあります。それは MAC アドレスについて話し、MAC (ハードウェア) アドレスに基づいてホストを見つける方法を知っていますが、それ以上のことは何もしません。
- の ネットワーク層 マシン間や物理デバイスなどの物理境界を越えてデータを転送できるようにするレイヤーです。ネットワーク層は本質的に、物理アドレスに何らかの形で関連する追加のアドレスベースのメカニズムをサポートする必要があります。インターネット プロトコル (IPv4) を入力します。IP アドレスはインターネット経由で A から B にパケットを届けることができますが、個々のホップを通過する方法については何も知りません。これは、ルーティング情報に従って上の層によって処理されます。
- の トランスポート層. 。この層は、情報が A から B に届く方法と、その動作に関する制限、チェック、エラーを定義する責任があります。たとえば、TCP は、パケットが失われたかどうかを推定できるように、パケットに追加情報を追加します。
TCP には、とりわけ、次の概念が含まれています。 ポート. 。これらは、インターネット ソケット (AF_INET
) バインドできます。
たまたま、 UDPも同様です, 、およびその他のトランスポート層プロトコル。彼らは技術的にはそうではありません 必要 ただし、これらのポートは、上の層の複数のアプリケーションが同じコンピュータを使用して発信接続を受信 (実際に作成) する方法を提供します。
ここで、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
構造体では、ポートと bam! を指定します。仕事は終わりました!まあ、ほとんどですが、例外は次のとおりです。
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
も可能です。ああ、作業中にスパナを投げてしまった!
わかりました、実際にはそうではありません。私たちがしなければならないのは、いくつかの適切な定義を考え出すことだけです。
- インターネット ソケットは、サービスがデータを提供する IP アドレス、プロトコル、およびそれに関連するポート番号の組み合わせです。したがって、TCP ポート 80、stackoverflow.com はインターネット ソケットです。
- Unix ソケットは、ファイル システムで表現される IPC エンドポイントです。
/var/run/database.sock
. - ソケット API は、アプリケーションがソケットに対してデータを読み書きできるように要求するメソッドです。
出来上がり!それで物事が整理されます。したがって、私たちのスキームでは、
- ポートは、トランスポート層プロトコルの一部として、指定された要求に応答するサービス番号を識別する数値識別子です。
したがって、実際には、ポートはインターネット ソケットを形成するための要件のサブセットです。残念ながら、ソケットという言葉の意味がいくつかの異なる概念に適用されているのは偶然です。したがって、混乱を招くことになるので、次のプロジェクトにはソケットに名前を付けることを心からお勧めします ;)
ソケット= IPアドレス+ポート(数値アドレス)
一緒になって、マシン上のネットワーク接続のエンドポイントを特定します。 (ネットワーク101をちらほらしましたか?)
一般に、多くの理論が得られますが、これら2つの概念を区別する最も簡単な方法の1つは次のとおりです。
サービスを取得するには、サービス番号が必要です。このサービス番号はポートと呼ばれます。簡単です。
たとえば、サービスとしてのHTTPはポート80で実行されています。
現在、多くの人々がサービスを要求でき、クライアントサーバーからの接続が確立されています。多くの接続があります。各接続はクライアントを表します。各接続を維持するために、サーバーは接続ごとにソケットを作成してクライアントを維持します。
ソケットと2台のPC間の接続と同等の答えがたくさんあるようです。これは絶対に間違っていると思います。ソケットは常に1台のPCのエンドポイントであり、接続されている場合とされていない場合があります。重要な部分は、アドレス可能でアクティブであることです。 1.1.1.1:1234にメッセージを送信しても、そのエンドポイントにソケットが定義されていないため、機能しない可能性があります。
ソケットはプロトコル固有であるため、 TCP / IP および UDP / IP は*(ipaddress:port)を使用します。たとえば、 IPX とは異なります。 (ネットワーク、ノード、および... ahem、ソケット-ただし、一般的な「ソケット」という用語が意味するものとは異なるソケット。IPXソケット番号はIPポートと同等です)。しかし、それらはすべてユニークなアドレス可能なエンドポイントを提供します。
IPが主要なプロトコルになったため、ポートは(ネットワーク用語で)ソケットアドレスの一部であるUDPまたはTCPポート番号と同義語になりました。
-
UDPはコネクションレスです。つまり、2つのエンドポイント間に仮想回線は作成されません。ただし、引き続きエンドポイントとしてのUDPソケット。 API関数により、両方がソケットの異なるタイプであることが明確になります。
SOCK_DGRAM
はUDP(メッセージを送信するだけ)であり、SOCK_STREAM
はTCP(仮想回線を作成する)です。 -
技術的には、IPヘッダーはIPアドレスを保持し、IP上のプロトコル(UDPまたはTCP)はポート番号を保持します。これにより、他のプロトコル(たとえば、ポート番号のない ICMP を使用できます。 、ただしIPアドレス情報は持っています)。
短い簡単な答え。
ポートは、プログラムまたはプロセスを識別するホスト内の内部アドレスとして説明できます。
ソケットは、プログラムが他のプログラムまたはプロセスと、インターネット上で、またはローカルに通信できるようにするプログラミングインターフェースとして説明できます。
これらは2つの異なるドメインの用語です。「ポート」はTCP / IPネットワーキングの概念であり、「ソケット」は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
...
ソケットアドレスは、IPアドレスとポート番号
123.132.213.231 # IP address
:1234 # port number
123.132.213.231:1234 # socket address
2つのソケットがバインドされると接続が発生します。
ソケットは、オペレーティングシステムからネットワークサービスを要求するプロセスによって使用される特殊なタイプのファイルハンドルです。 ソケットアドレスはトリプルです: {プロトコル、ローカルアドレス、ローカルプロセス}。ローカルプロセスはポート番号で識別されます。
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システムによって最初に導入されました。標準化されていませんが、事実上の業界標準となっています。
ポートは最も簡単な部分であり、単にソケットの一意の識別子です。ソケットは、プロセスが接続を確立し、相互に通信するために使用できるものです。トールジェフは完璧ではない素晴らしい電話アナロジーを持っていたので、私はそれを修正することにしました:
- IPおよびポート〜電話番号
- ソケット〜電話デバイス
- 接続〜電話
- 接続の確立〜番号の呼び出し
- プロセス、リモートアプリケーション〜人
- メッセージ〜スピーチ
ソケットは、ソフトウェアの構造です。それは多かれ少なかれファイルです。読み取りや書き込みなどの操作があります。それは物理的なものではありません。ソフトウェアが物理的なものを参照する方法です。
ポートはデバイスのようなものです。各ホストには1つ以上のネットワークがあります(物理的なネットワーク)。ホストは各ネットワークにアドレスを持っています。各アドレスには数千のポートを含めることができます。
1つのソケットのみがアドレスでポートを使用している可能性があります。ソケットは、ファイルシステムI / Oにデバイスを割り当てるのとほぼ同じようにポートを割り当てます。ポートが割り当てられると、他のソケットはそのポートに接続できません。ソケットが閉じられると、ポートは解放されます。
アプリケーションは、ネットワークを介して通信するプロセスのペアで構成されます(クライアントとサーバーのペア)。これらのプロセスは、ソケットと呼ばれるソフトウェアインターフェースを介して、ネットワークとの間でメッセージを送受信します。本「コンピュータネットワーキング:トップダウンアプローチ」で提示されている類推を検討してください。他の家と通信したい家があります。ここで、家はプロセスに似ており、ソケットへのドアです。送信プロセスでは、ドアの反対側にデータを宛先に転送するインフラストラクチャがあると想定しています。メッセージが反対側に届くと、受信者のドア(ソケット)を通過して家(プロセス)に入ります。同じ本からのこの図はあなたを助けることができます:
ソケットは、アプリケーションへの論理的な通信を提供するトランスポート層の一部です。つまり、アプリケーション間には多数のルーターやスイッチが存在していても、両方のホストが直接接続されています。したがって、ソケットは接続そのものではなく、接続のエンドポイントです。トランスポート層プロトコルはホストにのみ実装され、中間ルーターには実装されていません。
ポートは、マシンへの内部アドレス指定の手段を提供します。主な目的は、複数のプロセスが他のプロセス(データ)に干渉することなく、ネットワークを介してデータを送受信できるようにすることです。すべてのソケットにはポート番号が付いています。セグメントがホストに到着すると、トランスポート層はセグメントの宛先ポート番号を調べます。次に、対応するソケットにセグメントを転送します。トランスポート層セグメントのデータを正しいソケットに配信するこのジョブは、逆多重化と呼ばれます。セグメントのデータは、その後、ソケットに接続されたプロセスに転送されます。
ソケットは、ネットワーク上で実行されている2つのプログラム間の双方向通信リンクの1つのエンドポイントです。ソケットはポート番号にバインドされているため、TCPレイヤーは、データの送信先のアプリケーションを識別できます。
ポートとソケットは銀行支店と比較できます。
「銀行」の建物番号IPアドレスに類似しています。 銀行には次のようなさまざまなセクションがあります:
- 普通預金部門
- 個人ローン部門
- 住宅ローン部門
- 苦情処理部門
したがって、1(普通預金部門)、2(個人ローン部門)、3(住宅ローン部門)、および4(苦情部門)はポートです。
ここで、普通預金口座を開設し、銀行(IPアドレス)に行き、「普通預金部門」に行くとしましょう。 (ポート番号1)、「貯蓄部門」の下で働く従業員の1人に会います。アカウントを開設するために彼をSAVINGACCOUNT_EMPLOYEE1と呼びましょう。
SAVINGACCOUNT_EMPLOYEE1はソケット記述子であるため、 SAVINGACCOUNT_EMPLOYEE1〜SAVINGACCOUNT_EMPLOYEEN。これらはすべてソケット記述子です。
同様に、他の部門では、その下で働く従業員がいます。それらはソケットに似ています。
これらは基本的なネットワークの概念です。詳細を理解するための簡単かつ包括的な方法で説明します。
- ソケットは電話のようなものです(つまり、通信のためのエンドツーエンドのデバイス)
- IP は電話番号(つまり、ソケットのアドレス)のようなものです
- ポートは、話したい相手(つまり、そのアドレスから注文したいサービス)のようなものです
- ソケットは、クライアントまたはサーバーソケットにすることができます(つまり、企業ではカスタマーサポートの電話はサーバーですが、自宅の電話はほとんどがクライアントです)
したがって、ネットワーキングのソケットは、ペア(ip、port)=(address、service)にバインドされた仮想通信デバイスです。
注:
- マシン、コンピューター、ホスト、モバイル、またはPCは、複数のアドレス、複数の開いているポート、したがって複数のソケットを持つことができます。オフィスのように、複数の電話番号と複数の人と話す複数の電話を持つことができます。
- オープン/アクティブポートが存在する場合、ポートをアクセス可能にするのはソケットであるため、それにバインドされたソケットが必要です。ただし、当面は未使用のポートがある可能性があります。
- また、サーバーソケットでは、(ポート、マシンの特定のアドレス)または(ポート、マシンのすべてのアドレス)にバインドできるので、電話のように多くの電話回線(電話番号)を電話または特定の電話回線から電話に接続しても、これらすべての電話回線または特定の電話回線を介して人に連絡できます。
- 通常、電話のようにソケットを2つのポートに関連付ける(バインドする)ことはできません。通常、同じ電話を同時に2人で使用することはできません。
- 詳細:同じマシンでは、同じタイプ(クライアント、またはサーバー)と同じポートおよびIPを持つ2つのソケットを持つことはできません。ただし、クライアントの場合は、これらのクライアントの各ソケットのローカルポートが異なるため、2つのソケットでサーバーへの2つの接続を開くことができます)
疑問が解消されることを願って
質問によって暗示されていると思われる相対TCP / IP用語。素人の言葉で:
PORTは、特定の郵便番号の特定の家の電話番号のようなものです。町の郵便番号は、町とその町のすべての家のIPアドレスと考えることができます。
一方で、ソケットは、互いに話し合っている一対の家の電話間で確立された電話のようなものです。これらの呼び出しは、同じ町の家の間、または異なる町の2つの家の間で確立できます。互いに話し合う電話の間に一時的に確立された経路がSOCKETです。
ソケットは通信エンドポイントです。ソケットはTCP / IPプロトコルファミリに直接関連していないため、システムでサポートされている任意のプロトコルで使用できます。 CソケットAPIは、最初にシステムから空のソケットオブジェクトを取得し、ローカルソケットアドレスにバインドできることを期待しています(コネクションレスプロトコルの着信トラフィックを直接取得するか、コネクション型プロトコルの着信接続要求を受け入れるため)。または、リモートソケットアドレスに接続できること(いずれかの種類のプロトコル)。ソケットがバインドされているローカルソケットアドレスと、ソケットが接続されているリモートソケットアドレスの両方を制御する場合は、両方を行うこともできます。ソケットを接続するコネクションレスプロトコルの場合でもオプションですが、そうしない場合は、ソケットがどこに送信するかを他の方法で知るように、ソケット経由で送信するすべてのパケットとともに宛先アドレスも渡す必要がありますこのデータに?利点は、単一のソケットを使用してパケットを異なるソケットアドレスに送信できることです。ソケットを構成し、場合によっては接続しさえしたら、双方向通信パイプであると考えてください。これを使用してデータを特定の宛先に渡すことができ、一部の宛先はそれを使用してデータを戻すことができます。ソケットに書き込むものは送信され、受信したものは読み取り可能です。
一方、ポートは、TCP / IPプロトコルスタックの特定のプロトコルのみが持つものです。 TCPおよびUDPパケットにはポートがあります。ポートは単なる数字です。送信元ポートと宛先ポートの組み合わせにより、2つのホスト間の通信チャネルが識別されます。例えば。単純なHTTPサーバーと単純なFTPサーバーの両方であるサーバーを使用できます。そのサーバーのアドレス宛てにパケットが到着した場合、それがHTTPまたはFTPサーバーのパケットであるかどうかはどのようにわかりますか? HTTPサーバーがポート80で実行され、FTPサーバーがポート21で実行されるため、パケットが宛先ポート80で到着する場合、FTPサーバーではなくHTTPサーバー用であることがわかります。また、パケットには送信元ポートがあります。そのような送信元ポートがないと、サーバーは一度に1つのIPアドレスへの接続を1つしか持てないからです。送信元ポートにより、サーバーは他の点では同一の接続を区別できます。すべての接続は同じ宛先ポートを持ちます。ポート80、同じ宛先IP、常に同じサーバーアドレス、同じソースIP。これらはすべて同じクライアントからのものですが、異なるソースポートがあるため、サーバーはそれらを互いに区別できます。また、サーバーが応答を返信すると、リクエストの送信元のポートに送信されます。これにより、クライアントは受信した異なる返信を区別できます。ソケットはデータI / Oメカニズムです。ポートは、通信プロトコルの契約の概念です。ソケットはポートなしで存在できます。ポートは特定のソケットなしで存在できます(たとえば、同じポートで複数のソケットがアクティブな場合、一部のプロトコルで許可される場合があります)。
ポートは、多くのプロトコルを使用して、受信者がパケットをルーティングするソケットを決定するために使用されますが、必ずしも必要ではなく、受信ソケットの選択は他の手段で行うことができます-ポートは完全に使用されるツールですネットワークサブシステムのプロトコルハンドラ。例えばプロトコルがポートを使用しない場合、パケットはすべてのリスニングソケットまたは任意のソケットに送信できます。
広義には、 ソケット-まさにそれ、あなたの電気、ケーブルまたは電話ソケットのようなソケットです。 「必要なもの」が置かれるポイント(電力、信号、情報)が出入りできます。 「必要なもの」の使用に必要ではない多くの詳細なものを隠します。ソフトウェア用語では、2つのエンティティ間のコミュニケーションのメカニズムを定義する一般的な方法を提供します(これらのエンティティは、2つのアプリケーション、2つの物理的に分離したデバイス、OS内のユーザー&カーネルスペースなど、何でもかまいません)
ポートはエンドポイント弁別器です。あるエンドポイントを別のエンドポイントと区別します。ネットワークレベルでは、ネットワークスタックが適切なアプリケーションに情報を渡すことができるように、アプリケーションを別のアプリケーションと区別します。
この質問にはすでに理論的な答えが与えられています。この質問に実用的な例を挙げたいと思います。これにより、ソケットとポートに関する理解が明確になります。
この例では、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ページなので、ソケットがあります 接続のクライアント側も。
クライアント側の接続は、次のようなIPアドレスで構成されます。 192.168.1.25、およびランダムに選択された動的ポート番号。 Firefoxに関連付けられたソケットは、192.168.1.25:49175のようになります。なぜならウェブ サーバーはTCPポート80で動作し、これらのソケットは両方ともTCPソケットです。 一方、UDPポートで動作しているサーバーに接続している場合、 サーバーとクライアントの両方のソケットはUDPソケットになります。
ソケットは、カーネルがデータI / Oのユーザーアプリケーションに提供する抽象化です。ソケットタイプは、プロトコル、その処理、IPC通信などによって定義されます。したがって、誰かが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つのアプリケーションは、通常、異なるコンピューターで実行されます。 しかし、ソケットは単一のコンピューター上のプロセス間通信にも使用できます。 アプリケーションは、互いに通信するための複数のソケットを作成できます。 ソケットは双方向です。つまり、接続のどちらの側でもデータの送信と受信の両方が可能です。
多くの説明があることを知っています。しかし、実用的な例を使用して理解するもう1つの簡単な方法があります。私たち全員がHTTPポート80に接続できますが、一度に1人のユーザーしかそのポートに接続できないということですか?答えは明らかに「いいえ」です。複数の目的の複数のユーザーがHTTPポート80にアクセスできますが、サーバーからの適切な応答をサーバーから取得できますか?では、少し考えてみてください。 はい、あなたは正しいです。その IPアドレスは、さまざまな目的で連絡するさまざまなユーザーを一意に識別します。ここに到達する前に以前の回答を読んでいた場合、IPアドレスはソケットを構成する情報の一部であることがわかります。考えてみてください、ソケットなしで通信することは可能ですか?答えは「はい」ですが、ポートで複数のアプリケーションを実行することはできませんが、ハードウェアだけで実行される「ダンプ」スイッチではないことがわかります。
ポートは、IPネットワークプロトコルのTCPおよびUDPトランスポートの通信エンドポイントを示します。ソケットは、これらのプロトコルの実装で一般的に使用される通信エンドポイントのソフトウェア抽象化です(ソケットAPI)。別の実装はXTI / TLI APIです。
参照:
Stevens、W. R. 1998、UNIX Network Programming:Networking APIs:Sockets and XTI; Volume 1、Prentice Hall。
Stevens、W. R.、1994、TCP / IP Illustrated、Volume 1:The Protocols、Addison-Wesley。