Eigentlich lerne ich Computernetzwerke und bin dabei verwirrt, wie ein Webserver mehrere Verbindungen unterhält?
Um es einfach auszudrücken, ich habe durch ein bisschen googeln gelernt, dass Sockets jede Client-Anfrage bearbeiten.
Nehmen wir also an, es gibt einen Webserver und sagen wir 2 Clients mit IPs
Client A: 5.5.5.5
Client B: 10.10.10.10
Beide versuchen, über Port 80 eine Verbindung zum Server herzustellen.
Nachdem ich gegoogelt habe, wartet der Server auf Port 80 auf eingehende Anfragen. Nehmen wir an, ein Client A versucht, eine Verbindung zum Server herzustellen (TCP / IP-Verbindung herstellen). Währenddessen wird ein Socket zwischen diesen beiden erstellt. Anschließend wird es als separater Thread für die weitere Kommunikation ausgeführt, sodass der Server erneut auf andere Clientanforderungen an diesem bestimmten Port wartet. Und Client B verbindet sich auf die gleiche Weise.
Jetzt ist meine erste Frage:
1. How does server communicate with these two clients simultaneously
after the connection has been established?
Jetzt können praktisch nicht nur 2 Clients, sondern Tausende und Abermillionen Benutzer eine Verbindung zu einem Server herstellen.
Dann ist meine nächste Frage:
2. Now, how do those thousands of clients get connected to a single server?
If we assume every client is connected to the server through wire, it is not
practically possible to maintain that many sockets on a hardware for
connection. How those thousands connections are made and handled?
Zuletzt ist meine dritte Frage:
3. Above I said (actually heard) how **client A** connected to the the server
and similarly the client B.
But I didn't get the part stating "after a TCP/IP connection is made they
continue separately in a separate socket and making server to listen for
other client requests." What does that mean? If one client is communicating
to the server, how come other can communicate at the same time to same server.
Isn't it like while a student is asking question to a teacher, other can't
ask at the same time since that particular student is busy or occupying the
teacher at the moment so others should wait, which we compare than client B
should wait when client A is communicating.
Dies sind meine grundlegenden Fragen, die ich nicht bekomme. Bitte korrigieren Sie mich, wenn ich alles falsch verstehe. Sie können mir einige Bücher / PDFs zum Lesen vorschlagen, wenn die Antworten detailliert sind oder sich nicht besonders auf einen bestimmten Teil konzentrieren. Vielen Dank
Antworten:
Genauer gesagt gibt es eine spezielle Art von Buchse, die als "Abhörbuchse" bezeichnet wird.
Normalerweise ist ein Socket einer Kombination aus lokaler IP, lokalem Port, Remote-IP und Remote-Port zugeordnet.
Eine Hörbuchse ist anders. Es ist keiner bestimmten Remote-IP und keinem bestimmten Remote-Port zugeordnet. Es ist einem bestimmten lokalen Port zugeordnet. Es kann mit einer bestimmten lokalen IP verknüpft sein oder nicht.
Normalerweise verfügt Ihr Webserver über einen Listening-Socket mit einem lokalen Port von 80
Ein Paar Sockets, tatsächlich einer auf dem Client, einer auf dem Server.
Die Client-Anwendung erstellt einen Socket und fordert das Client-Betriebssystem auf, eine Verbindung zum Server herzustellen.
Das Client-Betriebssystem weist einen zufälligen lokalen Port zu, wählt eine lokale IP (normalerweise basierend auf der Schnittstelle, an die das Paket gesendet wird) und gibt die von der Client-Anwendung angeforderte Remote-IP und den angeforderten Port ein. Dann wird der Verbindungsaufbau zum Server gestartet.
Das Serverbetriebssystem benachrichtigt den Inhaber des abhörenden Sockets, dass eine neue Verbindung eingeht. Die Serveranwendung akzeptiert die Verbindung und ein neuer Socket wird erstellt, um diese zu verarbeiten.
Mehrere Threads oder sogar Prozesse können denselben Listing-Socket überwachen. Das Betriebssystem stellt sicher, dass genau einer von ihnen eine bestimmte Verbindung akzeptiert.
Das liegt beim Implementierer der Serveranwendung. Sie können mehrere Threads verwenden oder eine API wie "select" oder "poll" verwenden, mit der ein einzelner Thread mehrere Sockets auf Aktivität überwachen kann.
Das Server-Betriebssystem vergleicht die Pakete anhand der Kombination aus Quell-IP, Quell-Port, Ziel-IP und Ziel-Port mit den Sockets und übermittelt sie an den entsprechenden Socket.
"Socket" bezieht sich in diesem Zusammenhang nicht auf einen physischen Socket, sondern nur auf eine Datenstruktur innerhalb des Betriebssystems.
Trotzdem gibt es Grenzen, Tausende sind auf einem modernen Server mühelos machbar, Millionen werden schwierig.
Computer können ihre Aufmerksamkeit viel besser aufteilen als Menschen. Wenn der Server nur einen Prozessorkern hat, kann er natürlich immer nur eine Sache gleichzeitig erledigen, aber wenn er schnell genug zwischen den Dingen wechseln kann, bemerken die Clients das nicht.
Und natürlich haben heutzutage viele Server mehrere Prozessorkerne.
Es scheint das Problem zu sein, dass der RFC sich von der tatsächlichen Praxis in seiner Definition des Sockels unterscheidet.
Ich habe gerade in der Dokumentation nach "accept" für drei Hauptbetriebssysteme gesucht. Alle reden davon, einen neuen Socket anzulegen.
http://man7.org/linux/man-pages/man2/accept.2.html
https://www.freebsd.org/cgi/man.cgi?query=accept&sektion=2
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526%28v=vs.85%29.aspx
quelle