web-dev-qa-db-ja.com

ソケットとポートの違い

誰かがポートとソケットの違いをはっきりと説明してくれませんか。ポートがアプリケーションプロセスのネットワークへのドアとして機能し、アプリケーションプロセスが特定のポート番号へのソケット接続を使用してネットワーク通信を処理することを知っていますが、複数のプロセスが単一のポート番号をリッスンしている場合、ソケットとポートの違い、およびそれらがどのように組み合わされるかを理解することは困難です。

128
cobie

[〜#〜] s [〜#〜]はサーバープログラムです:HTTPサーバーであるため、よく知られているものを使用します [〜#〜] http [〜#〜] のポート番号、80です。IPアドレス_10.0.0.4_のホストで実行するため、リッスンします_10.0.0.4:80_での接続(誰もがそれを見つけることを期待する場所だからです)。

[〜#〜] s [〜#〜]の内部に、 socket を作成しますそして bind それをそのアドレスに:これで、OSは_10.0.0.4:80_に着信する接続がmy[〜#〜 ] s [〜#〜]その特定のソケットを介してプロセス。

  • ソケットがバインドされた後のnetstat出力:

    _$ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    _

    NB。ローカルアドレスはすべてゼロです[〜#〜] s [〜#〜]はクライアントがどのように到達するかを考慮しないため

[〜#〜] s [〜#〜]がこのソケットをバインドすると、 接続 接続を受け入れます-新しいクライアントが接続するたびに、acceptはそのクライアントに固有のnewソケットを返します

  • 接続が受け入れられた後のnetstat出力:

    _$ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    _
    • _10.0.0.4:80_は[〜#〜] s [〜#〜]の接続の終わりを表し、によって返されるソケットに関連付けられていますaccept
    • _10.0.0.5:55715_はクライアントの接続の終わりであり、クライアントが connect に渡したソケットに関連付けられています。クライアントのポートは、このTCP接続で正しいプロセスにルーティングすることを除いて、何にも使用されません。このポートは、エフェメラルポート範囲からクライアントのカーネルによってランダムに割り当てられます。

これで、[〜#〜] s [〜#〜]は、より多くのクライアント接続を受け入れ続けることができます...それぞれが独自のソケットを取得します。各ソケットは一意のTCP接続に関連付けられ、各接続には一意のリモートアドレスがあります。[〜#〜] s [〜#〜] は、クライアントの状態を(ある場合)ソケットに関連付けることで追跡します。

だから、おおよそ:

  • iPアドレスは、ネットワーク上のホスト間のルーティング用です
  • ポートは、ホスト上の正しいソケットにルーティングするためのものです
    • 私はほぼ正しいプロセスと言いましたが、実際には複数の(通常は子)プロセスがすべて同じソケットで受け入れることが可能です...
    • ただし、同時accept呼び出しの1つが返されるたびに、oneプロセスのみで返され、各着信接続のソケットはサーバーの1つのインスタンスに固有です。
  • ソケットは、ファイル記述子のように、プロセスが特定の接続についてOSと通信するために使用するオブジェクトです
    • コメントで述べたように、ポートをまったく使用しないソケットには他にも多くの用途があります。たとえば、 socketpair は、noアドレス指定スキーム-パイプを使用する唯一の方法は、socketpairを呼び出したプロセスであるか、そのプロセスの子であり、プロセスを継承するか、または明示的にいずれかを渡すことです。そのプロセスからのソケット
118
Useless

あなたの機械をアパートの建物と考えてください:

  • ポートはアパート番号です。

  • ソケットはアパートのドアです。

  • IPアドレスは、建物の番地です。

52
Caleb

ポートは、TCPおよびUDPプロトコルのアドレスの一部です。これは、受信したデータを取得する必要があるアプリケーションをOSが識別できるようにするために使用されます。OSがサポートするポートをサポートする必要があります= TCPおよびUDPです。これは、ポートがTCPおよびUDPの組み込み部分であるためです。

ソケットは、OSがアプリケーションに提供するインターフェースの一部であり、アプリケーションがネットワークデータを送受信できるようにします。ほとんどのソケット実装は、TCPおよびUDPを超える多くのプロトコルをサポートします。これらの一部にはポートの概念がありません。OSは、TCPまたはUDP;これは、アプリケーションが使用する別のインターフェースを提供する可能性があります。ソケットは、特定のポートでデータを送受信する1つの方法にすぎません。

48
Dirk Holsopple

コンピュータには、ネットワーク上の別のエンティティとして識別するIPアドレスがあります。そのコンピューターへの接続を区別できるように、番号を追加します。これはポート番号です。接続のOS側では、バッファ、接続状態などが必要です。この論理オブジェクトはソケットです。

8
stonemetal

ソケットは、ポートへの通信パスです。プログラムがネットワークを介して通信するようにしたい場合は、ポートをアドレス指定する方法をプログラムに与えました。これは、ソケットを作成してポートに接続することによって行われます。基本的に、ソケット= IP +ポートソケットはポート+ IPへのアクセスを提供します

0
Sitati