Właściwie uczę się sieci komputerowych i jestem przy tym zdezorientowany, w jaki sposób serwer WWW utrzymuje wiele połączeń?
Mówiąc krótko, nauczyłem się przez Google, że gniazda obsługują każde żądanie klienta.
Powiedzmy, że istnieje serwer WWW, i powiedzmy 2 klientów z adresami IP
Client A: 5.5.5.5
Client B: 10.10.10.10
Oboje próbują połączyć się z serwerem na porcie 80.
Teraz, od googlingu, co mam, serwer nasłuchuje na porcie 80 dla przychodzących żądań. Powiedzmy, że klient A próbuje połączyć się z serwerem (nawiązać połączenie TCP / IP). Podczas którego między nimi powstaje gniazdo. Następnie jest wykonywany jako osobny wątek dla dalszej komunikacji, dzięki czemu serwer ponownie nasłuchuje innych żądań klienta na tym konkretnym porcie. A klient B łączy się w ten sam sposób.
Teraz moje pierwsze pytanie brzmi:
1. How does server communicate with these two clients simultaneously
after the connection has been established?
Teraz praktycznie nie tylko 2 klienci, ale tysiące użytkowników mogą połączyć się z serwerem.
Moje następne pytanie brzmi:
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?
Wreszcie moje trzecie pytanie brzmi:
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.
To są moje podstawowe pytania, których nie dostaję. Proszę mnie poprawić, jeśli wszystko popełniam źle. Możesz zasugerować mi kilka książek / pdf do przeczytania, jeśli odpowiedzi są szczegółowe lub nie są szczególnie skoncentrowane na konkretnej części. Dzięki
Odpowiedzi:
Rzeczywiście, bardziej konkretnie istnieje specjalny typ gniazda zwany gniazdem „nasłuchującym”.
Zwykle gniazdo jest powiązane z kombinacją lokalnego adresu IP, portu lokalnego, zdalnego adresu IP i portu zdalnego.
Gniazdo nasłuchowe jest inne. Nie jest powiązany z żadnym konkretnym zdalnym adresem IP ani portem. Jest powiązany z określonym portem lokalnym. Może, ale nie musi być związany z konkretnym lokalnym adresem IP.
Zwykle twój serwer będzie miał gniazdo nasłuchiwania z lokalnym portem 80
Para gniazd w rzeczywistości jedno na kliencie, jedno na serwerze.
Aplikacja kliencka tworzy gniazdo i prosi system operacyjny klienta o połączenie go z serwerem.
System operacyjny klienta przydziela losowy port lokalny, wybiera lokalny adres IP (zwykle na podstawie interfejsu, na który pakiet zostanie wysłany) i wypełnia zdalny adres IP oraz port żądany przez aplikację kliencką. Następnie rozpoczyna się proces łączenia z serwerem.
System operacyjny serwera powiadamia posiadacza gniazda nasłuchującego, że nadchodzi nowe połączenie. Aplikacja serwera akceptuje połączenie i tworzone jest nowe gniazdo, aby je obsłużyć.
Wiele wątków lub nawet procesów może monitorować to samo gniazdo listy. System operacyjny zapewni, że dokładnie jeden z nich zaakceptuje dane połączenie.
To zależy od implementatora aplikacji serwera. Mogą wybrać użycie wielu wątków lub interfejs API, taki jak „select” lub „poll”, który pozwala pojedynczemu wątkowi monitorować wiele gniazd pod kątem aktywności.
System operacyjny serwera dopasuje pakiety do gniazd przez połączenie źródłowego adresu IP, portu źródłowego, docelowego adresu IP i portu docelowego i dostarczy je do odpowiedniego gniazda.
„Gniazdo” w tym kontekście nie odnosi się do fizycznego gniazda, a jedynie do struktury danych w systemie operacyjnym.
Nadal istnieją ograniczenia, tysiące można łatwo wykonać na nowoczesnym serwerze, miliony stają się trudne.
Komputery są znacznie lepsze w dzieleniu uwagi niż ludzie. Oczywiście, jeśli serwer ma tylko jeden rdzeń procesora, może wykonywać tylko jedną czynność naraz, ale jeśli może wystarczająco szybko przełączać się między rzeczami, klienci tego nie zauważą.
Oczywiście wiele serwerów ma obecnie wiele rdzeni procesorów.
Wydaje się, że problemem jest to, że RFC różni się od rzeczywistej praktyki w definicji gniazda.
Po prostu poszedłem i poszukałem dokumentacji „Akceptuję” dla trzech głównych systemów operacyjnych, wszystkie mówią o akceptacji tworzenia nowego gniazda.
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
źródło