Nur um sicherzustellen, dass wir uns auf derselben Seite befinden (Ihre Frage ist auf diese Weise nicht eindeutig), weist die Aufforderung, TCP an Port 0 zu binden, auf die Anforderung hin, dynamisch eine nicht verwendete Portnummer zu generieren. Mit anderen Worten, die Portnummer, die Sie nach dieser Anforderung tatsächlich abhören, ist nicht Null. Es gibt einen Kommentar zu diesem in [linux kernel source]/net/ipv4/inet_connection_sock.c
an 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.
*/
Welches ist eine Standard-Unix-Konvention. Es könnte Systeme geben, die tatsächlich die Verwendung von Port 0 zulassen, dies wird jedoch als schlechte Praxis angesehen. Dieses Verhalten wird jedoch nicht offiziell von POSIX, IANA oder dem TCP-Protokoll angegeben. 1 Das könnte Sie interessieren .
Aus diesem Grund können Sie keine sinnvolle TCP-Verbindung zu Port Null herstellen. Vermutlich nc
ist sich dessen bewusst und informiert Sie, dass Sie eine unsinnige Anfrage stellen. Wenn Sie dies im nativen Code versuchen:
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));
}
Sie erhalten den gleichen Fehler, den Sie beim Versuch, eine Verbindung zu einem anderen nicht verfügbaren Port herzustellen, erhalten: ECONNREFUSED
"Verbindung abgelehnt". Also als Antwort auf:
Wo im System wird das gehandhabt? Im TCP-Stack des Betriebssystemkerns?
Wahrscheinlich nicht; es bedarf keiner besonderen Behandlung. Dh, wenn Sie ein System finden, das das Binden und Abhören von Port 0 ermöglicht, könnten Sie vermutlich eine Verbindung dazu herstellen.
1. IANA spricht jedoch von "Reserved" ( siehe hier ). Dies bedeutet, dass dieser Port nicht online verwendet werden sollte. Das macht es in Bezug auf die dynamische Zuweisungskonvention in Ordnung (da es eigentlich nicht verwendet wird). Es würde wahrscheinlich den Rahmen der IANA sprengen, dies ausdrücklich als Zweck festzulegen. Im Grunde genommen können Betriebssysteme damit tun, was sie wollen, auch nichts.