web-dev-qa-db-ja.com

同じマシン上の2つの異なるサービスがIPv4とIPv6で同じポートを使用できますか?

2つのTCPサービスAとBがあるとします。Aは127.0.0.1:10000をリッスンするIPv4のみのサービスです。Bは::1:10000をリッスンするIPv6のみのサービスです。これらのサービスを同じマシンで開始しますか?つまり、IPポートはどのように割り当てられますか?マシンごとですか?インターフェイスごとですか?プロトコルごとですか?など…

1
levant pied

TCPとUDPポートについて話していると思います。

2つのTCPサービスAとBがあるとします。Aは127.0.0.1:10000をリッスンするIPv4のみのサービスです。Bは::1:10000をリッスンするIPv6のみのサービスです。これらのサービスを同じマシンで開始しますか?

はい。

つまり、IPポートはどのように割り当てられますか?マシンごと?インターフェイスごと?プロトコルごと?等…

まず、「IPポート」のようなものはありません。ポートは、特定のトランスポート層プロトコルの機能です。特にTCPとUDPはポート番号を使用します。他のいくつかのプロトコルもポート番号を使用していると思いますが、私はTCPとUDPを自分で使用しただけです。

TCPポートとUDPポートは完全に分離されています。 TCPサーバーとUDPサーバーは、同じIP /ポートの組み合わせを使用できます。

サーバーは、特定のIPアドレスとポートの組み合わせでリッスンすることも、すべてのアドレスのポートでリッスンすることもできます。後者は、IPv4の場合は0.0.0.0、ipv6の場合は::のリッスンアドレスを指定することで指定されます。サーバーがすべてのアドレスのポートでリッスンしている場合、他のサーバーはそのポートで特定のアドレスをリッスンできません。

最後に、ほとんどのオペレーティングシステムでは、::をリッスンしているサーバーがIPv4とIPv6の両方を介した接続を受け入れることができます。この動作を有効/無効にするための「IPV6_V6ONLY」と呼ばれるソケットオプションがあります。このオプションのデフォルト設定は異なります。 Linuxでは、このオプションはデフォルトで無効になっていますが、これはsysctl "net.ipv6.bindv6only"を介して変更できます。 Windows Vista以降では、IPV6_V6ONLYがデフォルトで有効になっています。古いバージョンのWindowsでは、1つのソケットでv4接続とv6接続の両方を受け入れることはできません。両方をリッスンするアプリケーションでは、2つの別々のソケットを開く必要があります。

1
plugwash

ポートと言うときは、TCPおよびUDPで使用されるポートについて話していると想定しています。その場合、各IP addressには、TCPの場合は1-65,535、UDPの場合は1-65,535で実行されるポートがあります。

IPv6に関する限り、同じポートを使用します。角かっこ([])IPv6アドレスはピリオドではなくコロンで区切られているため、アドレス部分とポート部分を区別するためにアドレスを囲みます。

0
xEODGuy