同じマシンで、TCP クライアントがポート 12345 を占有している場合、たとえば、クライアントが google.com に接続し、TCP サーバーがリスニング ポートを 12345 にバインドしようとした場合、これは許可されますか?
2 に答える
答えは「依存する」(OS とソケットのオプションによる) です。
SO_REUSEADDR
両方のソケットを備えたLinux では、説明されている正確な状況が可能です。
$ sudo netstat -panl |grep 12300
tcp 0 0 127.0.0.1:12300 0.0.0.0:* LISTEN 3591/nc
tcp 0 0 127.0.0.1:12300 127.0.0.1:25 ESTABLISHED 3547/nc
tcp 0 0 127.0.0.1:25 127.0.0.1:12300 ESTABLISHED 3548/exim4
...しかし、クライアントが最初にそこに着いたときだけです。サーバーが既にリッスンしている場合、クライアントは同じポートをバインドできません (クライアント、IIRC に自動的に割り当てられることはありません)。
Windows では、 の有無にかかわらずSO_REUSEADDR
、port は portであり、bind
失敗します (サーバーまたはクライアントが最初に実行した場合)。
いいえ。ポートはポートです。
つまり、通常、サーバーはクライアントが指定されていないポートを要求する前に起動するため、衝突が発生することはめったにありません(つまり、クライアントがポート番号を設定することはなく、マシンは空きポートを取得します)。
また、ほとんどのサーバーには事前定義されたポートがあります。
http://www.webopedia.com/quick_ref/portnumbers.asp http://www.ietf.org/rfc/rfc1700.txt?number=1700
そして範囲:
http://www.tcpipguide.com/free/t_TCPIPApplicationAssignmentsandServerPortNumberRang-2.htm
ご覧のとおり、登録済みのポートは49151に移動し、そこから動的に使用するために予約されています。したがって、クライアントポートは通常、サービスが使用してはならない範囲49152以上から取得されます。