
Ich verfüge über ein gutes Verständnis für die praktische Verwendung von Ports und ihre Funktionsweise. Allerdings habe ich ein paar Fragen, die ich gerne klären würde.
- Was passiert, wenn wir eine Anfrage senden, ohne einen Port für den Server-Socket anzugeben?
- Gibt es eine Möglichkeit, eine Maschine so einzurichten, dass nicht ein Prozess auf einem bestimmten Port lauscht, sondern dass alle an meine IP-Adresse gesendeten Anfragen vom selben Prozess bearbeitet werden? In diesem Fall könnte der Client den Port in der Anfrage weglassen.
- Ausgehend von Frage 2: Wenn ich einfach nur einen Server irgendeiner Art auf etwas wie einem Raspberry Pi laufen lassen möchte, könnte ich es dann so einrichten, dass meine IP-Adresse zu meinem RPi weitergeleitet wird, der alle eingehenden Netzwerkanforderungen über denselben Server verarbeitet? Das heißt, die Leute stellen einfach eine Verbindung zu der IP-Adresse ohne Portnummer her, um eine Verbindung zu meinem Server herzustellen.
Antwort1
Warum müssen wir beim Senden einer Anfrage zusätzlich zu einer IP eine Portnummer angeben?
Weil das TCP- (und UDP-)Protokoll dies erfordert. Es ist Teil der Protokollspezifikation.
Was passiert, wenn wir eine Anfrage senden, ohne einen Port für den Server-Socket anzugeben?
Wenn Sie keine Portnummer angeben, enthält dieser Teil des API-Aufrufs vermutlich Nullen. Port 0 ist ein reservierter Port und wird von einigen Implementierungen verwendet, um anzuzeigen, dass ein Port dynamisch vom System zugewiesen wird.
Gibt es eine Möglichkeit, eine Maschine so einzurichten, dass nicht ein Prozess auf einem bestimmten Port lauscht, sondern alle an meine IP-Adresse gesendeten Anfragen vom selben Prozess bearbeitet werden?
Nicht, wenn Sie TCP- oder UDP-Transportschichtprotokolle oder eines der darauf basierenden Anwendungsprotokolle verwenden. Wie HTTP
In einigen Betriebssystemen gibt es einen einzelnen Prozess als Teil des Betriebssystems, der jedoch Verbindungen an bestimmte Anwendungen weitergibt.
könnte ich es so einrichten, dass meine IP-Adresse an meinen RPi weitergeleitet wird
Sie können den Router so konfigurieren, dass alle eingehenden Verbindungsanfragen an Ihren rPi weitergeleitet werden
Die Leute stellen einfach eine Verbindung zur IP-Adresse (ohne Portnummer) her, um eine Verbindung zu meinem Server herzustellen.
Keine Verwendung von Standardprotokollen wie HTTP.
Ich denke, dass dies mit Standard-APIs wie Berkely Sockets nicht möglich ist. Ich könnte mir vorstellen, dass Sie mit etwas Aufwand ein anderes oder neues Transportschichtprotokoll Ihrer eigenen Entwicklung verwenden könnten. Sie müssten schon einige gute Gründe haben, um sich all diese Unannehmlichkeiten anzutun.
Antwort2
Was passiert, wenn wir eine Anfrage senden, ohne einen Port für den Server-Socket anzugeben?
Das geht nicht, ein Socket ist per Definition eine IP + Port. Der Grund, warum Ports existieren, ist, dass mehrere Programme auf einem Computer Datenverkehr senden/empfangen können und die Ports verwendet werden, um zwischen Prozessen an beiden Enden zu unterscheiden.
Gibt es eine Möglichkeit, eine Maschine so einzurichten, dass nicht ein Prozess auf einem bestimmten Port lauscht, sondern alle an meine IP-Adresse gesendeten Anfragen vom selben Prozess bearbeitet werden?
Sie könnten Ihren Prozess 65535 Sockets öffnen lassen, einen an jedem Port. Sie können dies nicht mit einem bestehenden Programm tun lassen, das nicht dafür geschrieben wurde, ohne ein seltsames Zwischenprogramm, das Sie wahrscheinlich selbst schreiben müssten.
Unter Linux können Sie möglicherweise eine iptables
Konfiguration erstellen, die dies oder etwas Entsprechendes tut.
Wenn ich beispielsweise einfach nur einen Server irgendeiner Art auf einem Raspberry Pi ausführen möchte, könnte ich es dann so einrichten, dass meine IP-Adresse an meinen RPi weitergeleitet wird, der alle eingehenden Netzwerkanforderungen über denselben Server verarbeitet?
Die Standardeinstellung bei den meisten Standardroutern für Privathaushalte besteht darin, dass Ihr Router sämtlichen Datenverkehr von außen ignoriert.
Bei fast allen dieser Router ist eine Portweiterleitung möglich, die Ihren Router anweist, eingehenden Datenverkehr auf einem bestimmten Port an ein bestimmtes System in Ihrem privaten Netzwerk hinter dem Router weiterzuleiten.
Sie können Ihren Router wahrscheinlich auch anweisen, unerwünschten eingehenden Datenverkehr an eine bestimmte IP in Ihrem privaten Netzwerk hinter dem Router weiterzuleiten. Dies wird als DMZ bezeichnet.
Antwort3
Ports sind für Protokolle, die die Kommunikation mehrerer Prozesse zwischen Servern ermöglichen, unerlässlich. Dies ist mehr als nur eine praktische Überlegung.
Bekannte Dienste haben zugewiesene Ports: DNS=53, HTTP=80, HTTPS=443, SMTP=25, Telnet=23, SSH=22, FTP=20&21 usw. Für solche bekannten Dienste ist es nicht notwendig, den Port anzugeben, wenn sie auf dem dem Dienst zugewiesenen Port ausgeführt werden. Die zugewiesenen Ports sind auf Unix-/Linux-Plattformen in /etc/services aufgeführt.
- Bei TCP und UDP können Sie ohne Port keine Verbindungen herstellen. Der Header enthält Felder für Quell- und Zielports. In diesen Feldern ist immer ein Wert enthalten, auch wenn dieser Null ist.
- Es ist möglich, alle Pakete zu erfassen, die über eine Schnittstelle ankommen. So funktionieren Tools wie tcpdump.
- Wie in 1 erwähnt, haben alle eingehenden Anfragen eine Portnummer. SOHO-Router unterstützen normalerweise eine DMZ und leiten alle eingehenden Anfragen, die nicht anderweitig weitergeleitet werden, an die der DMZ zugewiesene IP-Adresse weiter. In den meisten Fällen müssen Sie nur die für den Dienst erforderlichen Ports an den Server (Ihren Raspberry Pi) weiterleiten. Auf diese Weise können Sie mehrere Raspberry Pis mit unterschiedlichen Diensten betreiben.