Różnica między gniazdem a portem

121

Czy ktoś mógłby wyjaśnić dość wyraźnie różnicę między portem a gniazdem. Wiem, że port służy jako wejście do sieci dla procesu aplikacji i że proces aplikacji korzysta z połączenia gniazdowego z danym numerem portu do obsługi komunikacji sieciowej, ale gdy wiele procesów nasłuchuje na jednym numerze portu, znajduję trudno jest zrozumieć różnicę między gniazdem a portem i sposób, w jaki wszystkie one do siebie pasują.

cobie
źródło
9
Port to adres fizyczny, a gniazdo to obiekt.
superM
14
Jeśli pakiet trafi do kieszeni na gnieździe w porcie ...
użytkownik16764

Odpowiedzi:

116

S jest programem serwerowym: powiedzmy, że jest to serwer HTTP, więc użyje dobrze znanego numeru portu dla HTTP , czyli 80. Uruchomię go na hoście z adresem IP 10.0.0.4, więc będzie nasłuchiwał połączeń 10.0.0.4:80(ponieważ tam wszyscy będą się tego spodziewać).

Wewnątrz S zamierzam utworzyć gniazdo i powiązać je z tym adresem: teraz system operacyjny wie, że połączenia przychodzące 10.0.0.4:80powinny być kierowane do mojego procesu S przez to konkretne gniazdo.

  • wyjście netstat po związaniu gniazda:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    

    NB. adres lokalny jest zerowy, ponieważ S nie obchodzi, w jaki sposób docierają do niego klienci

Gdy S połączy to gniazdo, będzie akceptować połączenia - za każdym razem, gdy nowy klient się łączy, acceptzwraca nowe gniazdo, które jest specyficzne dla tego klienta

  • wyjście netstat po zaakceptowaniu połączenia:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    
    • 10.0.0.4:80reprezentuje koniec połączenia S i jest powiązany z gniazdem zwróconym przezaccept
    • 10.0.0.5:55715jest końcem połączenia klienta i jest powiązany z gniazdem, które klient przekazał do połączenia . Port klienta nie jest wykorzystywany do niczego poza kierowaniem pakietów na tym połączeniu TCP do właściwego procesu: jest przydzielany losowo przez jądro klienta z efemerycznego zakresu portów.

Teraz S może z radością kontynuować przyjmowanie większej liczby połączeń klienckich ... każde otrzyma własne gniazdo, każde gniazdo będzie powiązane z unikalnym połączeniem TCP, a każde połączenie będzie miało unikalny zdalny adres. S śledzi stan klienta (jeśli taki istnieje), kojarząc go z gniazdem.

Z grubsza:

  • adres IP służy do routingu między hostami w sieci
  • port służy do kierowania do właściwego gniazda na hoście
    • Prawie powiedziałem, że proces jest poprawny , ale w rzeczywistości możliwe jest posiadanie wielu (zwykle potomnych) procesów akceptujących na tym samym gnieździe ...
    • jednak za każdym razem, gdy jedno z acceptwywołań wraca, robi to tylko w jednym procesie, gniazdo każdego połączenia przychodzącego jest unikalne dla jednej instancji serwera
  • gniazdo jest obiektem używanym przez proces do rozmowy z systemem operacyjnym na temat określonego połączenia, podobnie jak deskryptor pliku
    • jak wspomniano w komentarzach, istnieje wiele innych zastosowań gniazd, które w ogóle nie używają portów: na przykład socketpair tworzy parę połączonych ze sobą gniazd, które w ogóle nie mają schematu adresowania - jedynym sposobem korzystania z tego potoku jest bycie proces, który wywołał socketpairbycie dzieckiem tego procesu i dziedziczenie jednego lub jawne przekazanie jednego z gniazd tego procesu
Nieprzydatny
źródło
1
@ Bez sensu Warto wspomnieć, że gniazda nie muszą być oparte na IP, jak wskazuje odpowiedź. Nie jest to dokładnie związane z OP, ale wyjaśnienie rodzin gniazd mogłoby pomóc w uzupełnieniu tej odpowiedzi.
hafichuk
Dobra uwaga - już zaczynałem się martwić o pełzanie zakresu, kiedy zacząłem pisać o serwerach wieloprocesowych. Możesz go edytować, a jeśli tego nie zrobisz, zajmę się nim w pewnym momencie ...
Bezużyteczne
11
to wcale nie jest bezużyteczne
l - '' '' ----------- '' „” „
Staram się zrozumieć gniazdo w elektronice, serwer przypisuje gniazdo do numeru portu, jest jak umieszczenie gniazda na ścianie w oczekiwaniu na jakieś urządzenia elektroniczne, które mogą się podłączyć do ładowania baterii. Ale czy po zaakceptowaniu zwracane jest nowe gniazdo? Dlaczego? Nowe gniazdo jest postawione na ścianie? Proszę, pomóż mi zrozumieć to przez analogię.
Aaron Shen
3
Problem polega na tym, że twoja analogia jest błędna. Zapomnij, co w świecie fizycznym oznacza gniazdo - nie jest to metafora czegoś innego, tylko techniczny termin określający konkretną koncepcję oprogramowania technicznego. Nie jest nawet silnie związany z fizycznymi portami lub gniazdami sieciowymi - po prostu musisz zrozumieć w tej dziedzinie jako koncepcję na własnych warunkach.
Bezużyteczne
49

Pomyśl o swojej maszynie jak o budynku mieszkalnym:

  • Port to numer mieszkania.

  • Gniazdo to drzwi mieszkania.

  • Adres IP to adres ulicy budynku.

Caleb
źródło
3
Podoba mi się ta analogia, chociaż teraz myślę o tym, by być w tym mieszkaniu i patrzeć na niekończący się korytarz z mnóstwem drzwi. Nie mogę się wydostać Nie mogę się wydostać! :)
Daniel Hollinrake
1
@Caleb A socket is the door of an apartment.Ale czy nie może być otwartych wiele gniazd w jednym porcie?
Suhail Gupta
3
@suhail Czasami mieszkanie ma więcej niż jedne drzwi. Wszystkie mają ten sam numer mieszkania, ale są różnymi drzwiami.
Caleb
45

Port jest częścią adresu w protokołach TCP i UDP. Służy do pomocy systemowi operacyjnemu w określeniu, która aplikacja powinna otrzymać otrzymane dane. System operacyjny musi obsługiwać porty, aby obsługiwać TCP i UDP, ponieważ porty są nieodłączną częścią TCP i UDP.

Gniazdo jest częścią interfejsu, który system operacyjny przedstawia aplikacjom, aby umożliwić im wysyłanie i odbieranie danych sieciowych. Większość implementacji gniazd obsługuje wiele protokołów poza TCP i UDP, z których niektóre nie mają pojęcia portów. System operacyjny nie musi obsługiwać gniazd do obsługi TCP lub UDP; może zapewnić inny interfejs dla aplikacji. Gniazdo to po prostu jeden ze sposobów wysyłania i odbierania danych na określonym porcie.

Dirk Holsopple
źródło
Gniazdo jest w zasadzie 4 krotkami złożonymi z: Source IP: Port-Dest IP: Port.
Tony The Lion
masz na myśli, że port istnieje tylko w protokołach TCP i UDP ??? Co z http i innymi protokołami?
H. Aqjn
HTTP to protokół warstwy aplikacji, który działa na protokołach warstwy transportu, takich jak TCP lub UDP. Nie ma własnej koncepcji portów, dziedziczy je po podstawowym protokole warstwy transportowej.
Dirk Holsopple
8

Komputer ma adres IP, który identyfikuje go jako oddzielny byt w sieci. Dodajemy do tego dodatkowy numer, aby umożliwić nam rozróżnienie połączeń z tym komputerem. To jest numer portu. Po stronie OS połączenia potrzebujesz buforów, stanu połączenia itp. Ten obiekt logiczny to gniazdo.

kamieniste
źródło
0

Gniazdo to ścieżka komunikacyjna do portu. Gdy chcesz, aby Twój program komunikował się przez sieć, dałeś mu sposób na zaadresowanie portu i można to zrobić poprzez utworzenie gniazda i podłączenie go do portu. Zasadniczo gniazdo = IP + porty Gniazda zapewniają dostęp do portu + ip

Sitati
źródło
-1

Adres IP identyfikuje urządzenie, tj. Adres do konkretnego urządzenia, kiedy osiągnąłeś urządzenie za pomocą adresu IP, teraz określa, z którym procesem w tym urządzeniu ma się komunikować.

Tak więc do faktycznej komunikacji potrzebujesz zarówno portu + IP, który nazywa się gniazdem.

pj
źródło