Port efemeryczny to tymczasowy numer portu, którego system używa przy zestawianiu konkretnego połączenia sieciowego. Najłatwiej zauważyć jego rolę wtedy, gdy otwierasz stronę internetową. Serwer HTTPS czeka na połączenie na porcie 443, ale Twój komputer również potrzebuje własnego numeru, żeby system wiedział, do którego połączenia później przypisać odpowiedź. Taki numer jest wybierany automatycznie, używany przez pewien czas, a po zakończeniu komunikacji może wrócić do puli dostępnych portów.
Co to jest port efemeryczny?
Słowo "efemeryczny" oznacza coś krótkotrwałego. W przypadku sieci chodzi o port, który nie jest na stałe przypisany do konkretnej usługi, tylko pojawia się wtedy, gdy jest potrzebny do utworzenia połączenia.
Nie jest to więc drugi odpowiednik portu 80 czy 443. Te numery są kojarzone z usługami po stronie serwera. Port efemeryczny pojawia się najczęściej po stronie klienta - komputera, telefonu albo aplikacji rozpoczynającej połączenie.
Załóżmy, że komputer ma adres:
192.168.1.20
i otwierasz stronę działającą przez HTTPS. Połączenie może wyglądać tak:
192.168.1.20:53124 → 203.0.113.10:443
Po prawej stronie mamy serwer i port 443. Po lewej komputer użytkownika oraz port 53124. To właśnie 53124 jest w tym przykładzie portem efemerycznym.
Jak działa port efemeryczny?
System operacyjny wybiera wolny numer z dostępnej puli. Nie musisz wpisywać go ręcznie ani ustawiać wcześniej w programie.
Przy kolejnym połączeniu numer może być już inny:
192.168.1.20:53125 → 198.51.100.15:443
Potem następny:
192.168.1.20:53126 → 203.0.113.40:443
Na jednym komputerze mogą przecież działać jednocześnie przeglądarka, komunikator, klient poczty, aktualizacje systemu i kilka innych programów. Każdy z nich może utrzymywać własne połączenia.
Dzięki różnym portom system potrafi je od siebie odróżnić.
Możemy więc mieć:
192.168.1.20:52001 → serwer A:443 192.168.1.20:52002 → serwer B:443 192.168.1.20:52003 → serwer C:443 192.168.1.20:52004 → serwer D:443
Adres lokalnego komputera pozostaje ten sam, ale numery portów pozwalają rozdzielić poszczególne połączenia.
Port efemeryczny a port serwera
To tutaj najłatwiej się pomylić, bo po obu stronach połączenia widzimy po prostu numery portów.
Wygląda to na przykład tak:
Klient:
192.168.1.20:54321
↓
Serwer:
203.0.113.10:443
Port 443 mówi, że serwer udostępnia usługę HTTPS. Numer 54321 nie oznacza natomiast żadnej konkretnej usługi użytkownika. Został przydzielony na potrzeby tego konkretnego połączenia.
Dlatego odpowiedź na pytanie "na jakim porcie działa HTTPS?" brzmi zwykle 443, ale komputer łączący się z takim serwerem może mieć po swojej stronie zupełnie inny numer.
Połączenie TCP jest rozróżniane między innymi właśnie dzięki zestawieniu adresów i portów obu stron. Bez portu źródłowego trudno byłoby obsłużyć wiele jednoczesnych sesji wychodzących z jednego urządzenia.
Jaki jest zakres portów efemerycznych?
Numery portów mieszczą się w zakresie od 0 do 65535. IANA dzieli je na kilka grup:
| Zakres | Numery |
|---|---|
| System Ports | 0-1023 |
| User Ports | 1024-49151 |
| Dynamic / Private Ports | 49152-65535 |
To właśnie zakres 49152-65535 jest najmocniej kojarzony z portami dynamicznymi i efemerycznymi.
Jest jednak jeden haczyk. Ten podział nie oznacza, że każdy system operacyjny zawsze musi wybierać porty efemeryczne wyłącznie w identyczny sposób. Konkretna pula może zależeć od systemu i jego konfiguracji.
Porty efemeryczne w Windows
W nowszych systemach Windows domyślny zakres dynamicznych portów klienta obejmuje:
49152-65535
Nie trzeba jednak wierzyć ustawieniom domyślnym na słowo. Można sprawdzić rzeczywistą konfigurację własnego komputera.
Dla TCP w IPv4:
netsh int ipv4 show dynamicport tcp
Dla UDP:
netsh int ipv4 show dynamicport udp
Analogicznie można sprawdzić IPv6:
netsh int ipv6 show dynamicport tcp netsh int ipv6 show dynamicport udp
System pokaże początek puli oraz jej wielkość. Ma to znaczenie szczególnie wtedy, gdy diagnozujemy serwer albo aplikację generującą bardzo dużo połączeń.
Jak sprawdzić używany port efemeryczny?
Nie trzeba pisać programu sieciowego, żeby zobaczyć porty efemeryczne w praktyce. Wystarczy otworzyć kilka stron internetowych i sprawdzić aktywne połączenia.
W Windows można użyć:
netstat -ano
Na ekranie mogą pojawić się wpisy podobne do:
TCP 192.168.1.20:53874 142.250.74.14:443 ESTABLISHED
Lokalna część połączenia to:
192.168.1.20:53874
a połączenie prowadzi do:
142.250.74.14:443
W tym przykładzie 53874 jest portem używanym tymczasowo po stronie komputera, a 443 portem usługi HTTPS.
Dodatkowo netstat -ano pokazuje PID procesu, więc można ustalić, który program utworzył konkretne połączenie.
Port efemeryczny a NAT
W domowej sieci dochodzi jeszcze router. Kilka komputerów, telefonów i innych urządzeń korzysta zazwyczaj z jednego publicznego adresu IP.
Komputer może rozpocząć połączenie w taki sposób:
192.168.1.20:53124 → serwer:443
Router zapamiętuje to połączenie i tworzy odpowiednie mapowanie NAT. Podczas wysyłania danych do Internetu może również zmienić numer portu widoczny po stronie publicznej.
Gdy odpowiedź wraca, router na podstawie swojej tablicy wie, do którego komputera i którego połączenia powinna trafić.
Porty są więc jednym z elementów pozwalających wielu urządzeniom jednocześnie korzystać z tego samego publicznego adresu.
Czy port efemeryczny trzeba otwierać?
Przy zwykłym połączeniu wychodzącym zazwyczaj nie trzeba niczego ręcznie przekierowywać na routerze.
Gdy przeglądarka otwiera stronę internetową, to komputer rozpoczyna połączenie. Router i zapora śledzą taką komunikację i pozwalają na powrót odpowiedzi należącej do istniejącej sesji.
Nie ma więc sensu otwierać całego zakresu portów efemerycznych tylko dlatego, że system z niego korzysta.
Inna sytuacja występuje wtedy, gdy sam uruchamiasz usługę, która ma być dostępna z zewnątrz. Wtedy interesuje Cię konkretny port nasłuchującego serwera, a nie losowo wybrany port klienta.
Co oznacza wyczerpanie portów efemerycznych?
Portów jest dużo, ale nie nieskończenie wiele. Problem może pojawić się wtedy, gdy aplikacja bardzo szybko tworzy ogromną liczbę nowych połączeń wychodzących.
Wyobraźmy sobie serwer, który cały czas otwiera krótkie połączenia:
49152 49153 49154 49155 ... 65535
Jeśli kolejne numery są zajmowane szybciej, niż system może ponownie wykorzystać wcześniejsze, dostępna pula może się chwilowo wyczerpać.
Nowe połączenia zaczynają wtedy kończyć się błędami, mimo że zdalny serwer działa normalnie.
Na zwykłym domowym komputerze jest to raczej mało typowy problem. Znacznie częściej dotyczy serwerów, proxy, aplikacji backendowych czy systemów wykonujących ogromną liczbę zapytań sieciowych.
TIME_WAIT a porty efemeryczne
Przy analizowaniu połączeń TCP można zauważyć dużą liczbę wpisów:
TIME_WAIT
Czasem wygląda to podejrzanie, ale sam stan TIME_WAIT nie oznacza awarii. Jest normalną częścią działania TCP.
Po zakończeniu połączenia system przez pewien czas zachowuje informacje o nim między innymi po to, żeby opóźnione pakiety starej transmisji nie zostały pomylone z kolejnym połączeniem.
Ma to jednak praktyczny skutek: dany zestaw parametrów połączenia nie zawsze może zostać natychmiast wykorzystany ponownie.
Jeśli aplikacja tworzy tysiące krótkich połączeń w bardzo krótkim czasie, duża liczba wpisów TIME_WAIT może współwystępować z problemami z dostępną pulą portów.
Dlatego przy diagnostyce nie warto patrzeć tylko na jeden licznik. Sama obecność TIME_WAIT jest normalna. Problem zaczyna się dopiero wtedy, gdy nowych połączeń jest tak dużo, że aplikacja faktycznie przestaje mieć możliwość ich tworzenia.
Najprościej zapamiętać port efemeryczny jako tymczasowy numer po stronie konkretnego połączenia. Użytkownik zwykle go nie wybiera i na co dzień nie musi się nim interesować. Dopiero kiedy analizujemy ruch sieciowy, NAT albo problemy z dużą liczbą połączeń, ten niepozorny numer zaczyna mieć naprawdę duże znaczenie.
