web-dev-qa-db-ja.com

TCPポート0に接続することは可能ですか?

TCPポート0をリッスンすると、システム上の空きポート番号が割り当てられます。

しかし、-接続からTCPポート0に接続しようとするとどうなりますか?

$ nc localhost 0                 
nc: port number too small: 0

これはシステムのどこで処理されますか? OSカーネルのTCPスタックでは?TCPポート0への接続が機能するUnixはありますか?

60
nh2

同じページにいることを確認するために(あなたの質問はこのようにあいまいです)、TCP on port 0にバインドするように要求することは、未使用のポート番号を動的に生成する要求を示します。つまり、 、そのリクエストの後に実際にリッスンしているポート番号がゼロではありません。これについてのコメントがinet_csk_get_port()[linux kernel source]/net/ipv4/inet_connection_sock.cにあります:

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

これは、標準のUNIX規則です。実際にポート0の使用を許可するシステムもあるかもしれませんが、それは悪い習慣と考えられます。ただし、この動作はPOSIX、IANA、またはTCPプロトコルでは正式に指定されていません。1 あなたは これは興味深い を見つけるかもしれません。

そのため、TCPポート0への接続を適切に行うことができません。おそらくncはこれを認識しており、無意味な要求を行っていることを通知します。これを試行した場合ネイティブコード:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

他の使用できないポートに接続しようとするのと同じエラーが発生します:ECONNREFUSED、 "接続が拒否されました"。だから返信で:

これはシステムのどこで処理されますか? OSカーネルのTCPスタックでは?

おそらくそうではありません。特別な処理は必要ありません。つまり、ポート0でのバインドとリスニングを許可するシステムを見つけることができれば、おそらくそれに接続できます。


1.しかし、IANAはdoesそれを「予約済み」と呼びます( ここを参照 )。つまり、このポートはオンラインで使用しないでください。これにより、動的割り当て規則に関しては問題ありません(実際には使用されないため)。具体的には目的として、おそらくIANAの範囲を超えることを規定します。本質的に、オペレーティングシステムは何も含めて、自由にそれを使ってやりたいことができます。

60
goldilocks

ポート0を使用すると、オペレーティングシステムがトリガーされ、次に使用可能なポートが検索されて割り当てられます。これにより、特定のポートをハードコーディングしたり、使用可能なポートを検索したりする必要がなくなります。私のMint Linuxシステムが戻ってきました

nc: port range not valid

nc localhost 0 
5
MichaelJohn

nc -l 0はOSにポート0でリッスンするように要求します。ただし、上記で述べたように、ほとんどのオペレーティングシステムは0を認識し、アプリケーションの正の番号のポートを選択するための特定のカスタムを呼び出すため、nc winds 56514のようなポートでリッスンしています。

2
MC17