TCP / HTTP-Überwachung von Ports: Wie können viele Benutzer denselben Port gemeinsam nutzen?
Was passiert also, wenn ein Server an einem TCP-Port auf eingehende Verbindungen wartet? Angenommen, Sie haben einen Webserver an Port 80. Nehmen wir an, Ihr Computer hat die öffentliche IP-Adresse 24.14.181.229 und die Person, die versucht, eine Verbindung zu Ihnen herzustellen, hat die IP-Adresse 10.1.2.3. Diese Person kann eine Verbindung zu Ihnen herstellen, indem sie einen TCP-Socket bis 24.14.181.229:80 öffnet. Einfach genug.
Intuitiv (und fälschlicherweise) gehen die meisten Leute davon aus, dass es ungefähr so aussieht:
Local Computer | Remote Computer
--------------------------------
<local_ip>:80 | <foreign_ip>:80
^^ not actually what happens, but this is the conceptual model a lot of people have in mind.
Dies ist intuitiv, da er aus Sicht des Clients eine IP-Adresse hat und unter IP: PORT eine Verbindung zu einem Server herstellt. Da der Client eine Verbindung zu Port 80 herstellt, muss sein Port auch 80 sein? Dies ist eine vernünftige Sache zu denken, aber eigentlich nicht, was passiert. Wenn das richtig wäre, könnten wir nur einen Benutzer pro fremder IP-Adresse bedienen. Sobald ein Remotecomputer eine Verbindung hergestellt hat, würde er die Verbindung von Port 80 zu Port 80 blockieren, und niemand anderes könnte eine Verbindung herstellen.
Drei Dinge müssen verstanden werden:
1.) Auf einem Server lauscht ein Prozess auf einem Port. Sobald eine Verbindung hergestellt wurde, wird sie an einen anderen Thread übergeben. Die Kommunikation belastet niemals den Abhörport.
2.) Verbindungen werden vom Betriebssystem durch das folgende 5-Tupel eindeutig identifiziert: (lokale IP, lokaler Port, Remote-IP, Remote-Port, Protokoll). Wenn ein Element im Tupel anders ist, ist dies eine völlig unabhängige Verbindung.
3.) Wenn ein Client eine Verbindung zu einem Server herstellt, wählt er einen zufälligen, nicht verwendeten Quellport höherer Ordnung aus . Auf diese Weise kann ein einzelner Client für denselben Zielport bis zu ~ 64.000 Verbindungen zum Server haben.
Das wird also wirklich erstellt, wenn ein Client eine Verbindung zu einem Server herstellt:
Local Computer | Remote Computer | Role
-----------------------------------------------------------
0.0.0.0:80 | <none> | LISTENING
127.0.0.1:80 | 10.1.2.3:<random_port> | ESTABLISHED
Betrachten, was tatsächlich passiert
Lassen Sie uns zunächst netstat verwenden, um zu sehen, was auf diesem Computer geschieht. Wir werden Port 500 anstelle von 80 verwenden (da auf Port 80 eine ganze Reihe von Dingen passiert, da es sich um einen gemeinsamen Port handelt, aber funktional macht es keinen Unterschied).
netstat -atnp | grep -i ":500 "
Wie erwartet ist die Ausgabe leer. Starten wir nun einen Webserver:
sudo python3 -m http.server 500
Hier ist die Ausgabe von netstat:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
Jetzt gibt es einen Prozess, der aktiv auf Port 500 lauscht (Status: LISTEN). Die lokale Adresse lautet 0.0.0.0. Dies ist der Code für "Lauschen auf alle IP-Adressen". Ein leichter Fehler besteht darin, nur Port 127.0.0.1 abzuhören, der nur Verbindungen vom aktuellen Computer akzeptiert. Dies ist also keine Verbindung. Dies bedeutet lediglich, dass ein Prozess zum Binden () an Port-IP angefordert wird und dieser Prozess für die Verarbeitung aller Verbindungen zu diesem Port verantwortlich ist. Dies weist auf die Einschränkung hin, dass es nur einen Prozess pro Computer geben kann, der einen Port überwacht (es gibt Möglichkeiten, dies mithilfe von Multiplexing zu umgehen, dies ist jedoch ein viel komplizierteres Thema). Wenn ein Webserver Port 80 überwacht, kann er diesen Port nicht für andere Webserver freigeben.
Lassen Sie uns nun einen Benutzer mit unserer Maschine verbinden:
quicknet -m tcp -t localhost:500 -p Test payload.
Dies ist ein einfaches Skript ( https://github.com/grokit/quickweb ), das einen TCP-Socket öffnet, die Nutzdaten sendet (in diesem Fall "Nutzdaten testen"), einige Sekunden wartet und die Verbindung trennt. Wenn Sie netstat erneut ausführen, während dies geschieht, wird Folgendes angezeigt:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
tcp 0 0 192.168.1.10:500 192.168.1.13:54240 ESTABLISHED -
Wenn Sie eine Verbindung mit einem anderen Client herstellen und netstat erneut ausführen, wird Folgendes angezeigt:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -
tcp 0 0 192.168.1.10:500 192.168.1.13:26813 ESTABLISHED -
... das heißt, der Client hat einen anderen zufälligen Port für die Verbindung verwendet. Es gibt also nie Verwechslungen zwischen den IP-Adressen.