Socket (gniazdo) to punkt końcowy komunikacji, przez który dwa procesy wymieniają dane — działające na tej samej maszynie albo na dwóch końcach świata. Z punktu widzenia programu socket wygląda jak zwykły uchwyt (deskryptor pliku), do którego coś zapisujesz i z którego czytasz. To właśnie ta abstrakcja sprawia, że Twoja przeglądarka, baza danych i serwer WWW potrafią ze sobą gadać, nie wnikając w szczegóły kabli i protokołów.
Jak to działa
Socket jest zdefiniowany przez trójkę: protokół, adres i port. Najczęściej spotkasz socket TCP (połączeniowy, gwarantuje kolejność i dostarczenie pakietów — np. HTTP, SSH) oraz socket UDP (bezpołączeniowy, szybki, bez gwarancji — np. DNS, streaming, gry). W systemie cyklicznie wygląda to tak: serwer robi socket(), bind() na adres i port, listen(), a potem accept() czeka na klienta. Klient robi socket() i connect(). Od tego momentu obie strony piszą i czytają.
W Linuksie istnieje też osobny gatunek: Unix domain socket. Zamiast adresu IP i portu używa ścieżki w systemie plików (np. /var/run/docker.sock) i służy do komunikacji procesów na jednej maszynie. Jest szybszy niż pętla lokalna po TCP, bo nie przechodzi przez cały stos sieciowy.
Przykład z praktyki
Chcesz sprawdzić, kto nasłuchuje na Twoim serwerze. Klasyk to ss -tulpn — wypisze wszystkie sockety TCP i UDP, które są w stanie LISTEN, razem z procesem i portem. Jeśli zobaczysz tam 0.0.0.0:5432 dla Postgresa, to znaczy, że baza jest wystawiona na cały świat — zwykle nie tego chcesz. Z kolei docker domyślnie rozmawia z demonem właśnie przez Unix socket, dlatego komendy działają bez podawania adresu sieciowego.
Częste błędy i mity
„Address already in use” przy starcie aplikacji to klasyka: poprzedni proces jeszcze trzyma port (stan TIME_WAIT) albo po prostu nadal działa. Zanim na siłę ustawisz SO_REUSEADDR, sprawdź ss -tulpn, czy port nie jest realnie zajęty. Drugi mit: socket to nie to samo co port — port jest tylko jedną liczbą z adresu, a socket to cały punkt końcowy połączenia. I trzecia pułapka: WebSocket to protokół warstwy aplikacji (działa na bazie socketów TCP), a nie synonim „socketu” w ogóle — nie myl tych pojęć na rozmowie.
Pojęcia powiązane
TCP, UDP, port, deskryptor pliku, Unix domain socket, protokół, WebSocket, polecenia ss i netstat, model klient-serwer.