Sockety – wiele połączeń na jednym porcie

0

W jaki sposób komunikacja poprzez gniazda nawiązuje wiele połączeń na jednym porcie? Głównie ciekawi mnie to przez serwery http, czy przeglądarki działają coś typu:

  • Połącz
  • Zapytanie
  • Odbierz odpowiedz
  • Rozłącz?
1

gniazdo nasłuchujące musi być w trybie Listen. W tym trybie po przyjściu połączenia i jego akceptacji tworzone jest nowe gniazdo z losowym (port dostaje numer powyżej **chyba ** 1024 i nie może być już używany) portem na którym odbywa się "reszta" komunikacji z podłączonym klientem natomiast "główne" gniazdo zostaje zaraz po utworzeniu nowego gniazda zamknięte i otwarte z powrotem w trybie nasłuchiwania.

W c# odpowiedni kawałek kodu wygląda np. tak

//"główne" gniazdo nasłuchujące
           TcpListener listener = new TcpListener(localAdd, 80);
//rozpoczęcie nasłuchiwania
            listener.Start();

//po przyjściu połączenia i jego zaakceptowaniu tworzone jest nowe gniazdo 
            TcpClient client = listener.AcceptTcpClient();
//client ma już całkiem inny port wewnętrzny niż listener 
0

po jego akceptacji tworzone jest nowe gniazdo z losowym (port dostaje numer powyżej chyba 1024 i nie może być już używany) portem na którym odbywa się "reszta" komunikacji z podłączonym klientem natomiast

Nieprawda. Tworzone jest nowe gniazdo - to akurat prawda, ale port serwerowy pozostaje ten sam.
Port jak najbardziej może być używany. Na jednym porcie może się komunikować wiele klientów.

Gdyby było inaczej i port obsługujący jednego klienta nie mógł obsługiwać innego klienta, to wtedy mógłbyś obsłużyć co najwyżej 65536 połączeń i skończyłyby się porty. A bez problemu na jednym IP można obsłużyć znacznie więcej (nawet milion jak dobrze napiszemy serwer). No i byłby też poważny problem z firewallem, bo byś musiał przepuścić na firewallu wszystkie porty a nie tylko ten jeden, na którym nasłuchuje serwer.

Jeśli serwer nasłuchuje na porcie np. 80, to wszystkie pakiety kierowane do tego serwera idą na port 80, a wszystkie odpowiedzi idą z portu 80 - i dotyczy to całej komunikacji z wieloma klientami. W ten sposób ani nie skończą się porty, ani nie ma problemu z firewallem - po prostu wystarczy przepuścić komunikację na jeden port 80.

Porty efemeryczne służą do czegoś zupełnie innego - do inicjowania połączeń wychodzących. Jeśli masz klienta, który chce otworzyć wiele połączeń do tego samego zdalnego serwera, nasłuchującego na jednym konkretnym IP:port, to każde połączenie tego klienta musi wychodzić z innej pary IP:port. Jeśli klient ma tylko jedno swoje IP, to siłłą rzeczy jedyna rzecz, która może rozróżnić połączenia jest numer portu - i dlatego każde połączenie wychodzi z innego portu. Niemniej, w systemie, który ma wiele IP, porty wychodzące też mogą się powtarzać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1