この netstat 出力に何か変なところがあります。この出力は、netstat -a -n -o -p TCP
Win 7 のコマンドを使用して取得されています。
Proto Local Address Foreign Address State PID
TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808
TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808
これら 2 行に注意してください。ローカル アドレスと外部アドレスは両方とも localhost です。しかし、ポートがペアになっているのはなぜですか? 2 つのポートのうち55486
、55487
どちらがサーバー ポートで、どちらがクライアント ポートですか?
私の理解では、local-address
列はTCP接続のクライアント側を示し、foreign-adress
列はサーバー側を示します。この出力から、同じポートが両方のクライアントとして動作しているようです。そしてサーバ。
TCP でこれがどのように可能なのか理解できません。
答え1
ライン:TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808
クライアントがポート 55486 を使用しているにもかかわらず、クライアントがサーバーのポート 55487 に接続していることを示しています。
ライン: TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808
サーバーがポート 55487 からポート 55486 でクライアントに接続していることを示しています。
TCP では、クライアントとサーバー間の接続を確立するために「3 ウェイ ハンドシェイク」が必要です。
クライアントはサーバーに接続します (3 ウェイ ハンドシェイクのパート 1)。サーバーは接続を確認して応答します (パート 2)。クライアントは確認応答に対して独自の確認応答で応答します (パート 3)。
TL;DR - クライアントは通常、ランダムポートを使用して特定のポートを持つサーバーに接続します。サーバーはランダムポートを使用してそのマシンに応答します。クライアントとサーバーはない同じポート上。
答え2
皆さんが今、このことをどの程度理解しているかは分かりませんので、少し詳しくお話しさせてください。
あなたは明らかにクライアントとサーバーの概念を理解しているので、「Local Address
列はTCP接続のクライアント側を示し、Foreign Address
列はサーバー側を示します」と書いていることに驚きました。これは間違いです。Local Address
列は地元TCP接続の側をForeign Address
示し、列は外国(またはリモート)側。言い換えれば、Local Address
列はプロセスが接続する(TCP)ソケットを示す。コンピュータ上で使用しているソケット(つまり、コンピュータが使用しているソケット)所有する) で、Foreign Address
列はローカル ソケットが接続されているソケットを示します。 ご存知のとおり、コンピューター上のプロセスはサーバーとして機能することができるため、ローカル ソケットはサーバー ソケットになる可能性があり、対応するクライアント ソケットは「外部」としてリストされます。
コンピュータ上のクライアント プロセスがコンピュータ上のサーバー プロセスに接続すると、状況が混乱し始めます。この 1 つの接続は 2 つのローカル ソケットを表し、netstat
それぞれについて 1 行ずつレポートします。1 行はクライアントをローカル、サーバーを外部として表示し (実際にはローカル ソケットですが)、もう 1 行はその逆です。
あなたの状況は、もう少し複雑です。もちろん、jetty サーバー (プロセス 5808) はソケットを作成し、そのソケットで接続を受け入れています。これはサーバーが行うことです。ただし、一度に多数のソケットを作成しています。(必然的に、それらは異なるポート番号にあります。OS では、同じプロトコルとポート番号を持つ複数のソケットが共存することを許可しません。) また、ランダムな (OS によって割り当てられた) ポート番号を使用しているようです。たとえば、あなたが指摘したように、ポート 55484 でリッスンしています。私は jetty に詳しくないので、それが正常かどうかはわかりません。
出力をよく調べるとnetstat
、ポート 8081 のソケットを使用するローカル プロセス 184 がプロセス 5808 / ポート 55482 に接続されていることがわかります。
私が本当に奇妙だと思うのは、プロセス5808が接続しているということですそれ自体にこれらのソケットのいくつかで。つまり、両方のソケットが同じホスト上だけでなく、複数のTCP接続で保持されていることになります。同じプロセスでどちらがクライアントでどちらがサーバーなのかを確実に判断することはできないと思います。実際には、ポート番号が小さい方がサーバーである可能性が高いと思いますが、これは単なる推測です。
答え3
これは珍しい状況ではありません。 は、127.0.0.1
プログラムがリッスンする有効な IP アドレスです。プログラムはこのアドレスでリッスンできます。プログラムはこのアドレスに接続することもできます。これは、クライアント サーバー アーキテクチャに準拠しています。クライアントとサーバーがあります。これらは異なるコンピューター上にある場合もありますが、同時に 1 台のコンピューター上にある場合もあります。
たとえば、Google Web サイトを使用する場合、ユーザーのコンピュータはクライアントで、Google の Web サーバーはサーバーです。ユーザーのコンピュータと Google のサーバーの間には接続があります。
独自の Web サーバーをコンピューター上で実行し、インターフェイスでリッスンすることができます127.0.0.1
。ブラウザーを開いて127.0.0.1
「-」と入力すると、Web サーバーの Web ページが表示されます。この状況では、netstat
同じものが表示されます。
あなたの質問に答えます:
この出力から、同じポートがクライアントとサーバーの両方として動作していることがわかります。
いいえ。1つのポートはクライアントで、もう1つはサーバーです。注意してください。ではない言う
TCP 127.0.0.1:55486 127.0.0.1:55486 ESTABLISHED 5808
それはこう言います:
TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808
TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808
それは理にかなっています。