TCPポート0をリッスンすると、システム上の空きポート番号が割り当てられます。
しかし、TCPポート0 に接続しようとするとどうなりますか?明白な答えは、「機能しません」です。
$ nc localhost 0
nc: port number too small: 0
これはシステムのどこで処理されますか?OSカーネルのTCPスタックに?TCPポート0への接続が機能するUnixはありますか?
TCPポート0をリッスンすると、システム上の空きポート番号が割り当てられます。
しかし、TCPポート0 に接続しようとするとどうなりますか?明白な答えは、「機能しません」です。
$ nc localhost 0
nc: port number too small: 0
これはシステムのどこで処理されますか?OSカーネルのTCPスタックに?TCPポート0への接続が機能するUnixはありますか?
回答:
私たちが同じページにいることを確認するため(あなたの質問はこのようにあいまいです)、ポート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 これは面白い かもしれません。
そのため、ポートゼロへの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
、「接続が拒否されました」が表示されます。だからへの返信:
これはシステムのどこで処理されますか?OSカーネルのTCPスタックに?
おそらくない。特別な処理は必要ありません。つまり、ポート0でバインドとリッスンを許可するシステムを見つけることができれば、おそらくそれに接続できます。
1.しかし、IANA はそれを「予約済み」と呼びます(こちらを参照)。つまり、このポートはオンラインで使用しないでください。これにより、動的割り当て規則に関しては問題ありません(実際には使用されないため)。明確に目的としてそれを規定することは、おそらくIANAの範囲外です。本質的に、オペレーティングシステムは、何も含めないで、自由にやりたいことができます。
INADDR_ANY
は、同義語w / であり、これはリチャードが参照しているものです(システムはこれをデフォルトに置き換えます)。しかし、実際にネットワーク上のアドレスを使用することは、アンドレアが言及する意味を持っているようです(「ブロードキャスト」としてカウントされるほど明確でない限り):en.wikipedia.org/wiki/0.0.0.0