10

私はJavaを使ったソケットプログラミングを学んでいます。次のステートメントを使用してWebサイトに接続します。

s = new Socket("www.nba.com", 80);

アプリケーションをデバッグしてsの内容を見ると、次のように表示されます。

Socket[addr=www.nba.com/2.21.246.97,port=80,localport=7846]

1)このローカルポート7846がどこから来て、正確に何であるかを知りたい。

2)WebサイトのIPアドレスが2.21.246.97の場合、ブラウザのアドレスフィールドに2.21.246.97と入力するだけでは、なぜWebサイトに接続できないのですか?


ありがとう

4

2 に答える 2

7

ローカルソケットのポート番号です。通常、システムによって割り当てられます。

ソケットとは何ですか?を参照してください。。

クライアント側:クライアントは、サーバーが実行されているマシンのホスト名と、サーバーがリッスンしているポート番号を知っています。接続要求を行うために、クライアントはサーバーのマシンとポートでサーバーとのランデブーを試みます。クライアントは、この接続中に使用するローカルポート番号にバインドするために、サーバーに対して自身を識別する必要もあります。これは通常、システムによって割り当てられます。

2番目の質問について:

このIPアドレスは、ルックアップ時にDNSサーバーによって取得されるものであると思いますwww.nba.com(私のものは異なります)。問題は、このアドレスのHTTPサーバーが複数の仮想ホストにサービスを提供していること、および/またはHostブラウザが送信するヘッダーを考慮していることである可能性があります。あなたの場合、それはの代わりにIPアドレスですwww.nba.com

于 2012-11-21T23:53:00.857 に答える
0

local portソケット記述子(または非常に大きな番号のポート)に他なりません

プロセスがAPI呼び出しを行うときはいつでも、要求はカーネルを介して、この特定の要求の応答をバインド(および識別)するためにソケット記述子を作成します。アウトバウンドコールを実行すると、ソケットが作成され、応答がNIC(ネットワークインターフェイス)に到着してからカーネルに到達すると、カーネルはこの応答の宛先アプリケーションを特定します。

これは、実行中のプロセス(pid)へのono-oneマッピングがあるポートをチェックすることによって行われます。次に、応答メタに添付されているソケット記述子の値をチェックし(この値は接続の作成時に渡されます)、応答ストリームをソケットバッファーに送信します。

次に、CPUはプロセスをウェイクアップして応答を収集します。

だからあなたの主な質問に答えて、

  • local portに他なりませんsocket descriptor
  • 理想的には、仮想化がなく、ハードウェアを所有している場合は、それができるはずです。IP経由で接続します。しかし、一般的にはそうではなく、多くのNAT(ネットワークアドレス変換)が行われるため、これが妨げられる可能性があります

試しls -li /proc/<pid>/fd/て、開いているすべてのソケット記述子を確認して
ください。アプリケーションのプロセスIDはどこにありますか。

于 2020-07-17T13:43:04.043 に答える