5

サーバー側では、次のコードを使用します。

ServerSocket server = new ServerSocket(1234);
Socket server_socket = server.accept();

サーバーがポート 1234 でリッスンしていることがわかりました。

1 つ以上のクライアント ソケットが接続されている場合、それらはすべて同じポート 1234 を使用しています。

それは本当に紛らわしいです:

ここに画像の説明を入力

マルチソケットは同じポートを使用できないと覚えていますよね?ありがとう。

4

1 に答える 1

11

TCP 接続は、次の 4 つの番号で識別されます。

  • クライアント (またはピア 1) IP
  • サーバー (またはピア 2) IP
  • クライアント ポート
  • サーバポート

一般的な TCP 接続は次のように開かれます。

  • クライアント IP は、クライアントの ISP または NAT によって提供されます。
  • サーバー IP は、ユーザーによって指定されるか、DNS で検索されます。
  • クライアントは、割り当てられていない範囲から任意にポートを選択します (重複するクワッドを回避しながら)
  • サーバー ポートは、プロトコルによって、または明示的に指定されます。

ServerSocket で指定するポートは、クライアントが接続するポートです。これは、OS が認識しているアプリケーションに属するポート番号と、OS からアプリケーションにイベントを渡すオブジェクトにすぎません。

ServerSocket#acceptメソッドは を返しますSocket。ソケットは、単一の TCP 接続をラップするオブジェクトです。つまり、クライアント IP、サーバー IP、クライアント TCP ポート、およびサーバー TCP ポート (および関連データを渡すためのいくつかのメソッド) です。

クライアントが送信する最初の TCP パケットには、アプリがリッスンするサーバー ポートが含まれている必要があります。そうしないと、オペレーティング システムは接続がどのアプリケーションに属しているかを認識できません。

さらに、サーバーの TCP ポートを別の番号に切り替えるインセンティブはありません。サーバー マシンまたはクライアント マシンには何の役にも立たず、実行するためにいくらかのオーバーヘッドが必要であり (新しい TCP ポートと古い TCP ポートを一緒に送信する必要があります)、サーバー OS がアプリケーションを識別できなくなるため、追加のオーバーヘッドがあります。単一のポート - アプリケーションが使用するすべてのサーバー ポートにアプリケーションを関連付ける必要があります (クライアントはこれを行う必要がありますが、典型的なクライアントは典型的なサーバーよりも接続数が少なくなります)。


あなたが見るものは

  • サーバー (ローカルポート:1234) に属する 2 つのインバウンド接続。Socketそれぞれがサーバーアプリケーションに独自のものを持っています。
  • クライアントに属する 2 つのアウトバウンド接続 (リモート ポート: 1234)。Socketそれぞれがクライアント アプリケーションに独自のものを持っています。
  • サーバーに属する1つのリッスン接続。ServerSocketこれは、接続を受け入れるシングルに対応します。

これらはループバック接続であるため、1 台のマシンで両方のエンドポイントが混在していることがわかります。ローカル側とリモート側の両方で、2 つの異なるクライアント ポート (52506 と 52511) も確認できます。

于 2012-12-30T15:30:21.657 に答える