web-dev-qa-db-ja.com

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

このnetstatの出力に奇妙なものが見つかりました。出力は、win7でnetstat -a -n -o -p TCPコマンドを使用して取得されます。

 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 with paired ports

2
inquisitive

行: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-クライアントは通常、ランダムポートを使用して、特定のポートを持つサーバーに接続します。サーバーは、ランダムポートを使用してそのマシンに応答します。クライアントとサーバーは[〜#〜] not [〜#〜]同じポート上にあります。

3
falconspy

あなたが今どれだけ理解しているのかよくわかりませんので、少し衒学者になりましょう。

クライアントとサーバーの概念を明確に理解しているので、次のように書いていることに驚かされます。「_Local Address_列はTCP接続のクライアント側を示し、_Foreign Address_列はサーバ側。"それは間違っている; _Local Address_列は、local TCP接続の側と_Foreign Address_列を示しますForeign(またはremote)側を示します。つまり、_Local Address_列は、プロセスコンピューター上のが使用している(TCP)ソケット(つまり、コンピューターが使用しているソケットowns)、および_Foreign Address_列は、ローカルソケットが接続されているソケットを示します。ご存知のように、コンピューター上のプロセスはサーバーとして機能できるため、ローカルソケットはサーバーソケットになります。その場合、対応するクライアントソケットは「外部」としてリストされます。

コンピューターのクライアントプロセスがコンピューターのサーバープロセスに接続すると、混乱が生じ始めます。現在、この1つの接続は2つのローカルソケットを表しています-そしてnetstatはそれぞれに1行を報告します。 1つはクライアントをローカルとして表示し、サーバーを外部として表示します(実際にはローカルソケットですが)。もう1つはその逆です。

あなたの状況はもう少し混乱しています。もちろん、桟橋サーバー(プロセス5808)は、ソケットを作成し、それらの接続を受け入れます。これがサーバーの機能です。しかし、それは一度に多くのソケットを作成しています。 (必然的に、それらは異なるポート番号にあります。OSは、同じプロトコルとポート番号を持つ複数のソケットが共存することを許可しません。)そして、ランダムな(OSによって割り当てられた)ポート番号を使用しているようです。たとえば、ご指摘のとおり、ポート55484でリッスンしています。私は桟橋に慣れていないため、それが正常かどうかはわかりません。

netstat出力を詳しく調べると、ポート8081のソケットを使用するローカルプロセス184が、プロセス5808 /ポート55482に接続していることがわかります。

私が本当に奇妙だと思う部分は、プロセス5808がこれらのソケットのいくつかでそれ自体に接続していることです。したがって、同じホスト上だけでなく、同じプロセス内ので両方のソケットが保持されるTCP接続がいくつかあります。どちらの端がクライアントでどちらがサーバーかはっきりとはわかりません。実際には、ポート番号が小さいほどサーバーである可能性が高いと思いますが、それは単なる推測です。

3
Scott

珍しいことではありません。 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

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

0
VL-80