Zrozumiałem dzisiaj, że zasadniczo nie rozumiem, jak działa komunikacja portowa.
Jeśli odpalę instancję serwera WWW nasłuchującego na porcie 80, może on odpowiedzieć na wiele żądań z wielu różnych kart przeglądarki, wszystkie komunikują się przez port 80.
Nie mogę jednak uruchomić dwóch instancji serwera, obydwu nasłuchujących na porcie 80, ponieważ powoduje to konflikt portów.
Zawsze traktowałem to jako dane (tylko jeden proces może się połączyć z określonym portem w danym momencie) bez zastanowienia się nad tym - czy na porcie 80 nie komunikuje się wiele procesów? (tj. każda z kart działających w przeglądarce?)
źródło
recv()
w każdym procesie.Przeglądarka łączy się z losowo wysokiego (tj.> 1024) portu w komputerze z portem 80 serwera zdalnego. Dlatego nie ma konfliktu portów na twoim komputerze.
Jeśli korzystasz z wielu kart, aby połączyć się z tym samym zdalnym serwerem (lub wielu użytkowników łączy się z serwerem), wszyscy przechodzą do tego samego portu i są obsługiwani przez ten sam proces (tj. Serwer WWW witryny).
źródło
Serwer nasłuchujący na porcie 80 NIE MUSI obsługiwać wielu procesów. Proste demony TCP starszych lat mogły obsługiwać tylko jedno połączenie na raz. Możesz naśladować to zachowanie, mając program taki jak
netcat
nasłuch na określonym porcie i spróbuj podłączyć do niego dwie maszyny. Jeden wejdzie, drugi odbije się bez połączenia. Te demony są w większości bezużyteczne, więc już ich nie widzisz.W przypadku czegoś takiego jak serwer WWW nasłuchuje bezpośrednio na porcie. Należy pamiętać, że znajduje się on nad biblioteką gniazd systemu operacyjnego. Po ustanowieniu nowego połączenia biblioteka gniazd przekazuje zupełnie nowe gniazdo do oprogramowania serwera WWW. W tym momencie oprogramowanie serwera WWW ma pewne opcje.
Jedną z możliwości jest to, że przekazuje obiekt gniazda do nowego wątku w tym samym procesie. Ilekroć komunikacja odbywa się przez to gniazdo, ten wątek sobie z tym poradzi. Proces nadrzędny pośredniczy w tym, które wątki są aktywne w danym momencie, co może być dużo.
Inną możliwością jest to, że rozpędza nowy proces i przekazuje obiekt gniazda do procesu. Jak rozumiem, teraz system gniazdowy systemu operacyjnego pośredniczy w komunikacji między tymi procesami potomnymi a ich celami. Proces nadrzędny nadal ma pewną kontrolę nad procesami, takimi jak zabijanie zawieszonych i inna komunikacja między procesami.
To, które z tych podejść jest bardziej wydajne, zależy od systemu operacyjnego. IIRC, Apache może działać w dowolnym trybie.
Zasadniczo biblioteka gniazd zapewnia poziom równoległego przetwarzania do serwera WWW. Może obsługiwać wiele jednoczesnych połączeń aktywnie przesyłających dane, a wszystko to przy jednoczesnym akceptowaniu nowych połączeń.
W przypadku przeglądarki, która może rozdzielić wiele prób połączenia z serwerem sieciowym w celu skrócenia czasu ładowania, równoległość dotyczy również końca przeglądarki, jest to dobra i cudowna rzecz. Przeglądarka śledzi stan strony podczas wczytywania, a wszystkie próby połączenia, które wykręca, są częścią tego procesu.
źródło
Istnieją dwa „typy” gniazd strumieniowych. Jeden ma „drugi koniec” z dziką kartą, jeden ma określony host: port dla drugiego końca.
Żadne dwa gniazda nie mogą (a raczej powinny nigdy) mieć takie same identyfikatory „ten koniec” i „drugi koniec”. Gniazdo „nasłuchiwane” (przyjmujące połączenia przychodzące) to gniazdo, które ma „drugi koniec” z dziką kartą, więc może istnieć tylko jedno na raz. Gdy nadchodzą połączenia, następuje zakończenie
accept
, zwracane jest gniazdo z krotką host: port dla drugiego końca.źródło
Twoje pytanie przypomina mi się kilka lat temu przed Cisco CCNA - miałem te same wątpliwości :)
Po pierwsze, nawiązywanie wielu połączeń HTTP niekoniecznie wiąże się z liczbą kart otwartych w przeglądarce. Na przykład odwiedzając witrynę z reklamami lub kodem Google Analytics, łączysz się z wieloma witrynami, mimo że znajduje się tylko na jednej karcie.
W każdym razie, kiedy twoja przeglądarka komunikuje się z serwerem, docelowym portem ruchu wysyłanego do serwera jest port 80, podczas gdy port źródłowy jest liczbą losową. Port źródłowy ma poinformować serwer WWW, w którym porcie powinien się z tobą skontaktować. Każde nawiązane połączenie HTTP będzie miało własny port otwarty na twoim komputerze. Spróbuj uruchomić netstat z kilkoma otwartymi stronami, a natychmiast zobaczysz, co mam na myśli.
Możesz się śmiać, ale ta książka to świetny i szybki sposób na zapoznanie się z podstawami TCP / IP. Bardzo mi pomogło.
źródło