ポートとソケットの違いは何ですか?


928

これは私の組織のソフトウェアエンジニアの1人から出された質問でした。最も広い定義に興味があります。


19
繰り返しますが、ソケットはネットワークIOに限定されません。さまざまなアプリケーション間でデータをストリーミングするために、あらゆる状況で利用できます。
Oli

回答:


977

概要

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メソッドを呼び出します。このメソッドには、他のエンドポイントを説明するパラメーターが必要です。

これは少し混乱し、ソケットは接続であると信じるようになります。リチャードドーマンが質問するまで、私はこの誤解の下で働いていました。

多くの読み書きを行った結果、LocalEndpointRemoteEndpointの 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は言う

接続は、両端のソケットのペアによって完全に指定されます。ローカルソケットは、さまざまな外部ソケットへの多くの接続に参加できます。

このソケットの定義は、特定の接続のエンドポイントであるソケットオブジェクトとは異なるため、プログラミングの観点からは役に立ちません。プログラマーにとって、そしてこの質問の聴衆のほとんどはプログラマーであるので、これは重要な機能上の違いです。

参考文献

  1. TCP-IP Illustrated Volume 1 The Protocols、W。Richard Stevens、1994 Addison Wesley

  2. RFC793、DARPAのための南カリフォルニア大学情報科学研究所

  3. RFC147、The Definition of a Socket、Joel M. Winett、Lincoln Laboratory


6
おそらく、ソケットとポートのキーワードに類似した現実の世界は、質問に賛成票を投じた人たちを助けるでしょう。まだ素晴らしい説明です!
rohitverma 2013

5
@rationalcoder-答え全体を読んでください。何かによって定義されることとそれによって識別されることには違いがあります。たとえば、クラスのインスタンスはクラスによって定義されます。それらによって部分的には識別されますが、完全には識別されません。
Peter Wone、2015

6
ソケットはIPアドレスとポートの組み合わせによって識別されません:」.. TCP RFCを読みます-tools.ietf.org/html/rfc793 .. このステートメントに同意しないため、投票しませんでした。ソケットはIPとポートの組み合わせです。IPとポートがわかっている場合は、ソケットまたはエンドポイントを識別しています。ソケットのペア、つまりクライアントIP +ポートとサーバーIP +ポートがわかっている場合は、一意の接続を識別しています..
hagrawal

6
「上記のサンプルでは、​​アドレスとポートの組み合わせが54.252.94.236:80である2つのエンドポイントがあります。アドレスとポートがあるだけの場合、これらのソケットを区別するのに十分な情報がありません。ソケット。" それらは同じソケットではありませんが、3つのソケット、2つのローカル、および1つの同じサーバーソケットが接続されている2つの接続の間の接続は異なります。それとも実際には2つの異なるソケットですか?それらが同じであるのでそれらを区別することはありませんが、接続を区別するためには異なるローカルソケットが必要になります。
Andrew Clavin 2016

6
-1あなたの答えは単に間違っています。あなた:「TCPソケットは... 特定の接続のエンドポイントです。」RFC 793:「ソケットは複数の接続で同時に使用される可能性があります。」どのライブラリを使用しているかはわかりませんが、私が使用したライブラリでは、ソケットオブジェクトはIPとポートによって一意に定義されており、リモートソケットごとに接続オブジェクトが生成されています。
Zaz

187

ソケットは次の3つで構成されます。

  1. IPアドレス
  2. トランスポートプロトコル
  3. ポート番号

ポートは、デバイスの論理ゲートを示す1〜65535の数値です。クライアントとサーバー間のすべての接続には、一意のソケットが必要です。

例えば:

  • 1030はポートです。
  • (10.1.1.2、TCP、ポート1030)はソケットです。

80
いいえ。ソケットは5つの要素で構成されています:{プロトコル、ローカルアドレス、ローカルポート、リモートアドレス、リモートポート}。
ローン侯爵2013

19
@EJPいいえ、もう一度。詳細については、選択した回答を参照してください。
Kehlan Krumme 2013年

2
@KorayTugay IPヘッダーにあります。TCPレイヤーがそれを認識できないと思うのはなぜですか?
ローン侯爵、2015

1
上記の最も投票された回答で@EJPを見るとわかるように、ソケットは接続自体ではなく、接続のエンドポイントであり、ローカルポートとリモートポートの両方、およびIPアドレスを含めることができるのはなぜですか。ソケットは、接続の片側のみを表します。つまり、ローカルポートとローカルIPアドレス、またはリモートポートとリモートIPアドレスのいずれかです。私が間違っている場合は親切に私を修正します。
RBT 2016年

7
@EJPまだRFC 793:「ソケットのペアは各接続を一意に識別します。つまり、ソケットは複数の接続で同時に使用される可能性があります。」ソケットがすでに5つの要素で構成されている場合、引用に「ソケットのペア」がどのように存在する可能性がありますか?
Gab是好人

100

ソケットは、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


2
OSIモデルのレイヤー2はノード間の接続であり、プロセスを接続するメカニズムはありません。OSI l2に存在するソケットを検討できるとは思いません。
Antonio Haley

18
回路は接続であり、ソケットはエンドポイントです。接続は2つのソケットで構成されます。
Mark Brackett

" ソケットは2つのネットワークアプリケーション間の単一の接続を表します。 "これは、RFC 793、次の説明の伝送制御プロトコルと一致しません: " 単一のホスト内の多くのプロセスがTCP通信機能を同時に使用できるように、TCPはアドレスのセットを提供または各ホスト内のポート。これは、インターネット通信層からのネットワークおよびホストアドレスと連結され、ソケットを形成します。ソケットのペアは、各接続を一意に識別します。
Ron Maupin

84

いくつかの類推で

ソケットについてはすでに多くの技術的なことを説明していますが、誰かがまだ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

それがまだ混乱している人を助けることを願っています:)


X、Y、Zは同じポート、つまり同じサービスに接続しますが、サーバー側に異なるソケットがありますか?したがって、たとえば、Xがサーバーにパケットを送信すると、「((プロトコル、XのIP、Xのポート、SのIP、Sのポート)ソケットを見つけて」チャットアプリに送信します。一部のアプリケーション固有のオブジェクトとソケットオブジェクトの間にバインディングがある必要があると思いますか?たとえば、socket-1からデータを取得したときに、それをユーザーメッセージとして表示したいが、アプリはソケットAからのメッセージがUser-Xからのものであることを認識する必要があります。
モノリス

44

まず、AからBへのパケットの取得について、少し理解することから始めるべきだと思います。

ネットワークの一般的な定義は、目的に応じてネットワークをいくつかの層に分離するOSIモデルの使用です。ここでは、重要なものをいくつか取り上げます。

  • データリンク層。この層は、あるネットワークデバイスから別のネットワークデバイスにデータのパケットを取得する役割を果たし、実際に送信を行う層のすぐ上にあります。MACアドレスについて話し、MAC(ハードウェア)アドレスに基づいてホストを見つける方法を知っていますが、それ以上のものはありません。
  • ネットワーク層は、あなたがマシンと、物理デバイスなどの上に物理的な境界、間でデータを転送することを可能にする層です。ネットワーク層は基本的に、何らかの形で物理アドレスに関連する追加のアドレスベースのメカニズムをサポートする必要があります。インターネットプロトコル(IPv4)を入力します。IPアドレスは、インターネットを介してAからBにパケットを取得できますが、個々のホップを通過する方法については何も知りません。これは、ルーティング情報に従って上のレイヤーで処理されます。
  • トランスポート層。この層は、情報がAからBに到達する方法と、その動作に関する制限、チェック、またはエラーを定義する責任があります。たとえば、TCPはパケットに追加情報を追加して、パケットが失われたかどうかを推測できるようにします。

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);

も可能です。ああ、それは作品にスパナを投げました!

わかりました、実際にはそうではありません。私たちがする必要があるのは、いくつかの適切な定義を考え出すことです:

  • インターネットソケットは、IPアドレス、プロトコル、およびサービスがデータを提供できる関連ポート番号の組み合わせです。つまり、tcpポート80、stackoverflow.comはインターネットソケットです。
  • UNIXソケットは、ファイルシステムで表されるIPCエンドポイント/var/run/database.sockです。
  • ソケットAPIは、アプリケーションがソケットに対してデータを読み書きできるように要求する方法です。

出来上がり!それは物事を片付けます。ですから私たちの計画では

  • ポートは数値識別子であり、トランスポート層プロトコルの一部として、特定の要求に応答する必要があるサービス番号を識別します。

したがって、実際にはポートはインターネットソケットを形成するための要件のサブセットです。残念ながら、たまたま、ソケットという言葉の意味がいくつかの異なるアイデアに適用されています。混乱を増すために、次のプロジェクトソケットに名前を付けることを強くお勧めします;)


これが、弾丸がパワーポイントを離れず、パワーポイントを離れない理由です。彼らが働きます!
Anurag Kalia

tcp-ipとネットワーク通信の非常に優れた紹介。初心者、まずこれを読んでください。
コリン

32

ソケット= IPアドレス+ポート(数値アドレス)
一緒に、マシン上のネットワーク接続のエンドポイントを識別します。(ネットワーク101をフランクしただけですか?)


7
ポートはあなたの定義よりも広い意味を持っていると思います。
Richard Dorman

2
また、ソケットはTCP / IPスタックの影響を受けるだけではありません。一般に、UNIXドメインソケットまたはプロセス間通信ソケットを参照してください。
matthias krull

この答えについてはわかりません。HTTPを使用すると、ポートを割り当てずに、ソケットを介して別のプロセスと通信できます。
SeF

31

一般に、多くの理論がわかりますが、これら2つの概念を区別する最も簡単な方法の1つは次のとおりです。

サービスを受けるには、サービス番号が必要です。このサービス番号はポートと呼ばれます。そのような単純な。

たとえば、サービスとしてのHTTPはポート80で実行されています。

これで、多くの人がサービスをリクエストでき、クライアント/サーバーからの接続が確立されました。たくさんのつながりがあります。各接続はクライアントを表します。各接続を維持するために、サーバーは接続ごとにソケットを作成してクライアントを維持します。


各ソケットには独自のポートが必要ですか?
14

驚くばかり。山の知識を提示する最も簡単な方法。
Asif Mehmood、

5
「サーバーが接続ごとにソケットを作成してクライアントを維持する」というステートメントが正しいかどうかはわかりません。
Rushi Agrawal 2015

1
@RushiAgrawalそれから私はあなたがそれを調べることを勧めます。具体的には、男性が受け入れることを
ローン侯爵2015

1
これは、サーバーがそのクライアントを維持するために接続ごとに作成するソケットごとに、同じポート番号(HTTP接続継続のポート80など)を持つことができるが、接続の要求の送信元であるクライアントのIPアドレスが異なることを意味します。正しい?
Randika Vishman

25

ソケットを2台のPC間の接続と同等とする答えはたくさんあるようです。これは間違いです。ソケットは常に1台のPC のエンドポイントでしたが、接続されている場合と接続されていない場合があります-確かに、ある時点ですべてのリスナーまたはUDPソケット*を使用しました。重要な部分は、それがアドレス指定可能でアクティブであることです。1.1.1.1:1234にメッセージを送信しても、そのエンドポイントにソケットが定義されていないため、機能しない可能性があります。

ソケットはプロトコル固有です-そのため、TCP / IPUDP / IPの両方が使用する一意性の実装*(ipaddress:port)は、IPX(ネットワーク、ノード、...など)とは異なりますが、ソケットは異なりますソケットは、一般的な「ソケット」という用語が意味します。IPXソケット番号は、IPポートと同等です)。しかし、それらはすべて、一意のアドレス可能なエンドポイントを提供します。

IPが主流のプロトコルになったため、ポート(ネットワーク用語で)は、ソケットアドレスの一部であるUDPまたはTCPポート番号と同じ意味になります。

  • UDPはコネクションレスです。つまり、2つのエンドポイント間に仮想回線は作成されません。ただし、UDPソケットをエンドポイントと呼びます。API関数は、両方が異なるタイプのソケットであることを明確にしSOCK_DGRAMます。UDP(メッセージを送信するだけ)とSOCK_STREAMTCP(仮想回線を作成する)です。

  • 技術的には、IPヘッダーはIPアドレスを保持し、IP上のプロトコル(UDPまたはTCP)はポート番号を保持します。これにより、他のプロトコルを使用できるようになります(たとえば、ポート番号を持たないがIPアドレス指定情報を持っているICMP)。


25

短い簡単な答え。

ポートは、のように記述することができる内部アドレスプログラムまたはプロセスを特定のホスト内。

ソケットは、として記述することができるインタフェースプログラミングローカルインターネット上で、他のプログラムまたはプロセスと通信するためのプログラムを可能にする、または。


3
ポートの説明にある「内部」という言葉は、私には「非公開」のように聞こえます。
Jonas N

だから、:SocketsはPortsの内部で動作すると言えるでしょうか?またはポートはソケット内で実行されますか?
Gucho Ca

@GuchoCaソケットとポートのどちらかが実行されるとは言えません。あなたが何を求めているのかはっきりしない。
ローン侯爵

16

これらは2つの異なるドメインの用語です。「ポート」はTCP / IPネットワーキングの概念であり、「ソケット」はAPI(プログラミング)のことです。「ソケット」は、ポートとホスト名またはネットワークアダプターを取得し、それらをデータの送受信に使用できるデータ構造に結合することにより(コードで)作成されます。


最も一般的な答えは、「ポートとホスト名またはネットワークアダプターを取り、それらを1つに結合することによって作られる」というストライキです。たとえば、UNIXソケットは(コードでは)データ構造(またはオブジェクト)であり、データの送受信に使用できます。
Josiah Yoder 2016

14

これらは基本的なネットワーキングの概念なので、詳細を理解するための簡単かつ包括的な方法で説明します。

  • ソケットは電話のようなものです(つまり、通信用のエンドツーエンドデバイス)。
  • IPは電話番号(ソケットのアドレスなど)のようなものです
  • ポートは、あなたが話したい人(つまり、あなたがそのアドレスから注文したいサービス)のようなものです
  • ソケットはクライアントまたはサーバーソケットにすることができます(つまり、会社ではカスタマーサポートの電話はサーバーですが、自宅の電話はほとんどがクライアントです)。

したがって、ネットワーキングのソケットは、ペア(ip、ポート)=(address、service)にバインドされた仮想通信デバイスです。

注意:

  • マシン、コンピューター、ホスト、モバイル、またはPCは、複数のアドレス、複数の開いているポート、したがって複数のソケットを持つことができます。オフィスのように、複数の電話番号を持つ複数の電話と複数の人と話すことができます。
  • オープン/アクティブポートが存在する場合は、ポートにアクセスできるようにするソケットであるため、それにバインドされたソケットが必要です。ただし、当面は未使用のポートがある可能性があります。
  • また、サーバーソケットでは、それを(ポート、マシンの特定のアドレス)または(ポート、マシンのすべてのアドレス)にバインドできます。電話と同様に、多くの電話回線(電話番号)を電話または電話への1つの特定の電話回線であり、これらすべての電話回線または特定の電話回線を通じて人に到達できます。
  • 電話のように、ソケットを2つのポートに関連付ける(バインドする)ことはできません。通常、2人が同時に同じ電話を使用することはできません。
  • 詳細:同じマシン上に、同じタイプ(クライアントまたはサーバー)でポートとIPが同じである2つのソケットを持つことはできません。ただし、クライアントの場合は、サーバーへの2つのソケットを使用して2つの接続を開くことができます。これは、これらの各クライアントのソケットのローカルポートが異なるためです。

それがあなたの疑問を晴らしてくれることを願っています


この質問の下で、ソケット/ポート/ IPアドレスのこれらすべての理解と類似点を見るのは興味深いことです。そして、私はこの答えが好きです。
Bloodmoon

12

優れた投票結果を読んだ後、ネットワークプログラミングの初心者である私にとって、次の点を強調する必要があることがわかりました。

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
...

12

ソケットアドレスはIPアドレスとポート番号です

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

2つのソケットが一緒にバインドされると、接続が発生します。


2つのソケットを一緒にバインドするようなものはありません。「バウンド」という言葉は、ポートとは別の意味です。
ローンの侯爵

10

ソケットは、オペレーティングシステムからネットワークサービスを要求するためにプロセスによって使用される特殊なタイプのファイルハンドルです。ソケットアドレスは、トリプル:{プロトコル、ローカルアドレス、ローカルプロセス}であり、ローカルプロセスはポート番号で識別されます。

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システムによって最初に導入されました。標準化されていませんが、事実上の業界標準になっています。


この答えは私のためにそれをしたものです。連想という言葉を他に誰も言わなかったからだと思います。良い説明。
rationalcoder

どの例にもプロセス番号はありません。あなたが探している言葉は「ポート」です。
ローン侯爵

最初のパラグラフを読んでください。それはそこに明確に述べられています。正確なフレーズを引用して、あいまいさを知らせてください。即興で役立つと思います。
クリシュナ

7

ソケットは通信エンドポイントです。ソケットは、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を持ちます。同じクライアントですが、送信元ポートが異なるため、サーバーはそれらを互いに区別できます。そして、サーバーが応答を返すとき、それは要求が来たポートにそうします、それでクライアントは同じサーバーから受け取った異なる応答を区別することもできます。


2
これは誤りです。ソケットはエンドポイントではありません。ソケットは2つのエンドポイントによって定義されます。各エンドポイントは、ネットワークアドレスとポートによって定義されます。ポートの目的は、同じネットワークアドレス上の複数のエンドポイントを区別して、複数の同時ソケットをサポートできるようにすることです。
Peter Wone 2008

1
RFC793(元のTCP仕様)はネットワークアドレスとポートの組み合わせをソケットとして参照しているため、これがどこにあるのかはわかりますが、ソケットが2つのエンドポイントによって必ず定義されているため、これはまだ正しくありません。
Peter Wone 2008

2
振り返ってみると、文学は矛盾しており、お詫び申し上げます。厳密に言えば、ネットワークアドレスとポートで識別される2つのエンドポイント(ソケット)間でTCP接続が確立されるまで、通信は行われません。あきらめる。
Peter Wone 2008

6

ポートは最も簡単な部分でした。これは、ソケットの一意の識別子です。ソケットは、プロセスが接続を確立し、相互に通信するために使用できるものです。トール・ジェフは完璧な電話の類推をしていなかったので、修正することにしました。

  • IPとポート〜電話番号
  • ソケット〜電話デバイス
  • 接続〜電話
  • 接続の確立〜電話をかける
  • プロセス、リモートアプリケーション〜人
  • メッセージ〜スピーチ

グッド明確化(特にあなたは専門用語のネットワークの基盤の一部です電話交換履歴を考えると...)
oɔɯǝɹ

いつかnetstatディスプレイを見てください。リスニングソケットから受け入れられたすべてのソケットは、同じポートを共有します。Ergoポートは、ソケットの一意の識別子ではありません。
ローンの侯爵2017年

6

アプリケーションは、ネットワークを介して通信するプロセスのペアで構成されます(クライアント/サーバーのペア)。これらのプロセスは、socketと呼ばれるソフトウェアインターフェイスを介して、ネットワークとの間でメッセージを送受信します。本「コンピュータネットワーキング:トップダウンアプローチ」で提示された類推を検討してください。他の家とコミュニケーションしたい家があります。ここでは、家はプロセスに、ドアはソケットに似ています。送信プロセスは、データを宛先に転送するインフラストラクチャがドアの反対側にあると想定しています。メッセージが反対側に到着すると、受信側のドア(ソケット)を通過して家(プロセス)に入ります。同じ本のこの図は、次のことに役立ちます。
ここに画像の説明を入力してください
ソケットはトランスポート層の一部であり、アプリケーションへの論理的な通信を提供します。これは、アプリケーションの観点から見ると、それらの間に多数のルーターやスイッチがある場合でも、両方のホストが互いに直接接続されていることを意味します。したがって、ソケットはそれ自体が接続ではなく、接続のエンドポイントです。トランスポート層プロトコルはホストにのみ実装され、中間ルーターには実装されません。
ポートマシンへの内部アドレス指定の手段を提供します。主な目的は、複数のプロセスが他のプロセス(データ)に干渉することなくネットワークを介してデータを送受信できるようにすることです。すべてのソケットにはポート番号が付いています。セグメントがホストに到着すると、トランスポート層はセグメントの宛先ポート番号を調べます。次に、セグメントを対応するソケットに転送します。トランスポート層セグメントのデータを正しいソケットに配信するこのジョブは、逆多重化と呼ばれます。セグメントのデータは、ソケットに接続されているプロセスに転送されます。


5

ソケットはソフトウェアの構造です。それは多かれ少なかれファイルです。読み取りや書き込みなどの操作があります。それは物理的なものではありません。ソフトウェアが物理的なものを参照する方法です。

ポートはデバイスのようなものです。各ホストには1つ以上のネットワークがあります(これらは物理的です)。ホストは各ネットワークにアドレスを持っています。各アドレスは数千のポートを持つことができます。

1つのソケットのみがアドレスでポートを使用している可能性があります。ソケットは、ファイルシステムI / O用のデバイスの割り当てとほぼ同じようにポートを割り当てます。ポートが割り当てられると、他のソケットはそのポートに接続できなくなります。ソケットが閉じられると、ポートは解放されます。

見てみましょうTCP / IPの用語


3
このソケットの説明はかなり根拠のないものです。ソケットとは、タプルのペアがIP ADDRとポートのペアを参照する、タプルのペア間の接続のことです。さらに、多くのソケットが同じポートに接続できます。Webサーバーがポート80で複数の接続をどのように取ると思いますか?これは悪い答えです
トールジェフ

1
ごめんなさい。複数のソケットがポート80に接続されていません。1つのソケットが接続され、実際の転送が行われる追加のソケットを生成します。opengroup.org/onlinepubs/009695399/functions/listen.htmlを参照してください。
S.Lott、2009

1
実際、opengroup.org / onlinepubs / 009695399 / functions / connect.htmlの説明の方が優れています。接続によって返されたピア・ソケットは、ポート80ではありません
S.Lott

1
この投稿はいくつかの点で正しくなく、いくつかの点で誤解を招きます。
Peter Wone 2008年

@ピーターウォン:どの詳細?どの側面?私の過ちから学ぶことを期待しています。
S.Lott、2008年

5

Oracle Javaチュートリアルから:

ソケットは、ネットワーク上で実行されている2つのプログラム間の双方向通信リンクの1つのエンドポイントです。ソケットはポート番号にバインドされているため、TCP層はデータの送信先のアプリケーションを識別できます。


これは単なるチュートリアルであり、規範的なリファレンスではありません。
ローンの侯爵

「ソケットは双方向通信リンクの1つのエンドポイントです」これはソケット定義ではなく、Javaチュートリアルではありませんか?
prayagupd 2017年

@prayagupdもちろん定義ですが、仕様ではなくチュートリアルからのものです。
ローンの侯爵

4

ポートとソケットは銀行支店と比較できます。

「銀行」の建物番号はIPアドレスに類似しています。銀行には、次のようなさまざまなセクションがあります。

  1. 普通預金部門
  2. 個人ローン部
  3. 住宅ローン部
  4. 苦情部門

つまり、1(普通預金部門)、2(個人ローン部門)、3(住宅ローン部門)、4(苦情部門)がポートです。

ここで、普通預金口座を開き、銀行(IPアドレス)に行き、次に「普通預金部門」(ポート番号1)に行き、「普通預金部門」の下で働いている従業員の1人に会ったとします。 」アカウントを開設するために彼をSAVINGACCOUNT_EMPLOYEE1と呼びましょう。

SAVINGACCOUNT_EMPLOYEE1はソケット記述子であるため、SAVINGACCOUNT_EMPLOYEE1からSAVINGACCOUNT_EMPLOYEENが存在する場合があります。これらはすべてソケット記述子です。

同様に、他の部門もその下で雇用者を雇うことになり、それらはソケットに似ています。


3

ソケットはデータI / Oメカニズムです。ポートは、通信プロトコルの契約上の概念です。ソケットはポートなしで存在できます。特定のソケットなしでポートが存在する場合があります(たとえば、同じポートで複数のソケットがアクティブで、一部のプロトコルで許可されている場合)。

ポートは、多くのプロトコルで、レシーバーがパケットをルーティングするソケットを決定するために使用されますが、必ずしも必要ではなく、受信ソケットの選択は他の方法で行うことができます-ポートは、完全にプロトコルハンドラーによって使用されるツールですネットワークサブシステム。たとえば、プロトコルがポートを使用しない場合、パケットはすべての待機ソケットまたは任意のソケットに送信できます。


3

私が想定している相対的なTCP / IP用語は、質問によって暗示されています。素人の言葉で:

PORTは、特定の郵便番号の特定の家の電話番号のようなものです。町の郵便番号は、町とその町のすべての家のIPアドレスと考えることができます。

一方、SOCKETは、互いに話し合っている2つの家の電話間で確立された電話のようなものです。これらの通話は、同じ町の家の間、または別の町の2つの家の間で確立できます。それは、SOCKETである、互いに通信している電話のペア間に一時的に確立された経路です。


2
ソケットはエンドポイントです。これは、接続が確立される前(TCP)、または接続がない場合(UDP)に存在します。エルゴそれ自体は接続ではありません。
ローン侯爵

2

広い意味で、ソケット-それはまさにあなたの電気、ケーブル、電話のソケットのようなソケットです。「必要なもの」(電力、信号、情報)が出入りできるポイント。「必要なもの」を使用するために必要とされない、多くの詳細なものを非表示にします。ソフトウェア用語では、2つのエンティティ間の通信メカニズムを定義する一般的な方法を提供します(これらのエンティティは、2つのアプリケーション、2つの物理的に別個のデバイス、OS内のユーザーとカーネルスペースなど、何でもかまいません)。

ポートはエンドポイント識別子です。エンドポイントを区別します。ネットワーキングレベルでは、1つのアプリケーションを別のアプリケーションと区別するため、ネットワークスタックは適切なアプリケーションに情報を渡すことができます。


2

この質問にはすでに理論的な答えが出されています。この質問の具体的な例を挙げれば、ソケットとポートに関する理解が深まります。

ここで見つけ

この例では、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ソケットになります。


非常に質の悪い引用。3番目の段落では、「ソケット」という単語を「IPアドレス」を意味するかのように誤用しています。そうではありません。
ローン侯爵

2

ソケットは、データI / Oのためにカーネルがユーザーアプリケーションに提供する抽象化です。ソケットタイプは、その処理、IPC通信などのプロトコルによって定義されます。したがって、誰かがTCPソケットを作成した場合、ソケットへのデータの読み取りや書き込みなどの操作を、TCP変換や下位レベルのネットワークプロトコルへのパケットの転送は、カーネルの特定のソケット実装によって行われます。利点は、ユーザーがプロトコル固有の軽微さを処理することを心配する必要がなく、通常のバッファーのようにデータをソケットに読み書きするだけでよいことです。IPCの場合も同様です。ユーザーはデータをソケットに読み書きするだけで、カーネルは作成されたソケットのタイプに基づいて、すべての下位レベルの詳細を処理します。

ポートとIPは、必ずしも必要ではありませんが、ソケットにアドレスを提供するようなものですが、ネットワーク通信には役立ちます。


2

単一のポートは、複数のコンセントのような異なる外部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

2

ソケットは、ネットワークエンドポイントのソフトウェア抽象化であり、アプリケーションへのインターフェイスとして使用されます。JavaではC#、オブジェクトではLinux、Unixではファイルで表されます。

ポートは、通信を確立する場合に指定したソケットのプロパティにすぎません。ソケットからパケットを受信するには、特定のローカルポートとNIC(ローカルIPアドレスを使用)またはすべてのNIC(バインド呼び出しでINADDR_ANYが指定されている)にバインドする必要があります。パケットを送信するには、リモートソケットのポートとIPを指定する必要があります。



1

ポート:

ポートは、シリアル、パラレル、USBポートなどの周辺機器の物理的な接続ポイントを指します。ポートという用語は、ハブ、スイッチ、ルーターなどの特定のイーサネット接続ポイントも指します。

ソケット:

ソケットは、2つのネットワークアプリケーション間の単一の接続を表します。これら2つのアプリケーションは、名目上は異なるコンピューター上で実行されますが、ソケットは単一のコンピューター上のプロセス間通信にも使用できます。アプリケーションは、相互に通信するための複数のソケットを作成できます。ソケットは双方向です。つまり、接続のどちらの側でもデータの送信と受信の両方が可能です。


TCPまたはUDPポートは、物理的なものやイーサネット接続ポイントのいずれも参照しません。質問に答えていません。
ローン侯爵

1

ポートは、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。

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