TCPポート0に接続できますか?

TCPポート0に接続できますか?

TCP ポート 0 を受信すると、システムに使用可能なポート番号が割り当てられます。

しかし、私が試してみるとどうなりますか?つながるTCPポート0に?明らかな答えは「動作しません」です。

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

これはシステムのどこで処理されますか?オペレーティングシステムカーネルのTCPスタックにありますか? UnixでTCPポート0に接続できますか?

ベストアンサー1

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

/* 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あなたは 見つけることができますこれは面白いです。

そのため、ポート0へのTCP接続を賢く設定することはできません。おそらく、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「接続が拒否されました」)が発生します。だから答えは次のようになります。

これはシステムのどこで処理されますか?オペレーティングシステムカーネルのTCPスタックにありますか?

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


1. しかしIANAするコールポート0「予約済み」(ねえ)。つまり、この港はしてはいけないオンラインでお使いください。これは動的割り当て規則をまともにします(実際には使用されていないため)。この目的のために明示的に言及することは、IANAの範囲外である可能性があります。基本的に、オペレーティングシステムは何もしないものを含め、必要なものを自由に実行できます。

おすすめ記事