Darüber habe ich noch nie nachgedacht, aber jetzt interessieren mich ein paar grundlegende Dinge hinter den Kulissen. 1) Schließt der Webserver die Verbindung nach jeder Anfrage? 2) Wenn ich mehrere Browserfenster geöffnet habe und alle Daten von einem Webserver anfordern, verwendet der Webserver dann eine Art Standard-Socket-Kommunikation, um zu erkennen, welche Verbindung was angefordert hat? 3) Was passiert, wenn es mehr Benutzer als freie Ports gibt (sagen wir 66.000, die gleichzeitig etwas anfordern)?
Danke :)
Antwort1
- Hängt davon ab, welche HTTP-Version die Anfrage verwendet. HTTP 1.0-Verbindungen werden sofort geschlossen, wenn der Server die Antwort an den Benutzeragenten zurückgesendet hat. HTTP 1.1 hat Unterstützung für Keepalives hinzugefügt, wodurch die Socket-Verbindung offen bleibt, nachdem die Antwort an den Benutzeragenten zurückgegeben wurde. In diesem Fall sendet der Benutzeragent einen Connection: Keep-Alive-HTTP-Header, der angibt, dass er die offene Verbindung aufrechterhalten möchte, was bedeutet, dass er weitere Anfragen weitersenden wird.
- Ja. Dies ist eine grundlegende Socket-Funktionalität. Der Client öffnet einen Socket auf einem (normalerweise hohen) ungenutzten lokalen Port und versucht, eine Verbindung mit einem bestimmten Zielport (z. B. 80 für HTTP) auf dem Remote-Host herzustellen. Jede andere Verbindung, die der Client herstellt, öffnet einen lokalen Socket auf einem anderen Port, könnte aber dennoch versuchen, eine Verbindung auf demselben Port auf dem Remote-Host herzustellen.
- Der Listener-Prozess auf dem Server erzeugt Worker-Prozesse, um die mehreren eingehenden Anfragen zu verarbeiten, sodass der Listener für die Verarbeitung eingehender Anfragen frei bleibt. Die meisten HTTP-Server verfügen über eine Konfigurationsoption, um die Anzahl gleichzeitig zu verarbeitender Anfragen zu steuern.
Antwort2
1) Im Allgemeinen ist jede Seitenanforderung auf das Öffnen und Schließen einer Verbindung beschränkt.
2) Ihr Computer ändert seinen Quellport für jede Anfrage. Der Server verwendet die IP/Quellport-Kombination, um zu verfolgen, welche Anfragen von welchen Hosts kamen.
3) Nun, der Server beantwortet alle HTTP-Anfragen auf Port 80. Aber was die Clients betrifft: Wenn Sie 66.000 Anfragen von einem Client gleichzeitig generieren könnten, könnten Sie Probleme bekommen, da bin ich mir nicht sicher.
Antwort3
1) Keepalive wird von den meisten modernen Webservern unterstützt. Wenn der Browser es also unterstützt, kann der Webserver mehr als eine Anfrage pro Verbindung berücksichtigen.
http://en.wikipedia.org/wiki/HTTP_persistent_connection
2) Ja, jede Verbindung erhält ihren eigenen Socket, der ein IP:PORT-Paar ist.
http://en.wikipedia.org/wiki/TCP_sockets
3) Wenn 65.535 Leute gleichzeitig Anfragen von einem einzigen Server stellen, müssen Sie einen Schritt zurücktreten und überlegen, was Sie tun! :) Im Ernst, wenn Sie nicht gerade viel Glück haben, werden Sie das Bedürfnis verspüren, die Last auszugleichen, bevor dieses Problem auftritt. Ein Problem, das Sie früher haben könnten, ist, dass Ihnen die Dateideskriptoren ausgehen. Der Standardwert in Bash ist 1024 (siehe „ulimit“ in der Bash-Manpage).