同じポートがクライアントとサーバーの両方として機能していますか?

同じポートがクライアントとサーバーの両方として機能していますか?

この netstat 出力に何か変なところがあります。この出力は、netstat -a -n -o -p TCPWin 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 つのポートのうち5548655487どちらがサーバー ポートで、どちらがクライアント ポートですか?

私の理解では、local-address列はTCP接続のクライアント側を示し、foreign-adress列はサーバー側を示します。この出力から、同じポートが両方のクライアントとして動作しているようです。そしてサーバ。

TCP でこれがどのように可能なのか理解できません。

ペアポートを使用したnetstat

答え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

それは理にかなっています。

関連情報