この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つのポート55486
と55487
のうち、どちらがサーバーポートで、どちらがクライアントポートですか。
私が理解していることから、local-address
列はTCP接続のクライアント側を示し、foreign-adress
列はサーバー側を示します。この出力から、同じように見えます。ポートは両方のクライアントとして動作していますおよびサーバー。
TCPでこれがどのように可能かわかりませんか?
行: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 [〜#〜]同じポート上にあります。
あなたが今どれだけ理解しているのかよくわかりませんので、少し衒学者になりましょう。
クライアントとサーバーの概念を明確に理解しているので、次のように書いていることに驚かされます。「_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接続がいくつかあります。どちらの端がクライアントでどちらがサーバーかはっきりとはわかりません。実際には、ポート番号が小さいほどサーバーである可能性が高いと思いますが、それは単なる推測です。
珍しいことではありません。 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
これは理にかなっています。