Jaka jest różnica między portem a gniazdem?


928

To pytanie zadał jeden z inżynierów oprogramowania w mojej organizacji. Interesuje mnie najszersza definicja.


19
Dla przypomnienia, gniazda nie ograniczają się do sieciowego We / Wy. Są dostępne we wszystkich sytuacjach do przesyłania danych między różnymi aplikacjami.
Oli

Odpowiedzi:


976

Podsumowanie

Gniazdo TCP to instancja punktu końcowego zdefiniowana przez adres IP i port w kontekście określonego połączenia TCP lub stanu nasłuchiwania.

Port jest identyfikatorem wirtualizacji definiującym punkt końcowy usługi (w odróżnieniu od punktu końcowego instancji usługi, czyli identyfikatora sesji).

Gniazdo TCP nie jest połączeniem , jest punktem końcowym określonego połączenia.

Mogą istnieć równoczesne połączenia z punktem końcowym usługi , ponieważ połączenie jest identyfikowane zarówno przez lokalne, jak i zdalne punkty końcowe, umożliwiając kierowanie ruchu do określonej instancji usługi.

Może być tylko jedno gniazdo nasłuchiwania dla danej kombinacji adresu / portu .

Ekspozycja

To było interesujące pytanie, które zmusiło mnie do ponownego zbadania wielu rzeczy, które, jak sądzę, znałem na wylot. Można by pomyśleć, że nazwa taka jak „gniazdo” byłaby oczywista: została wybrana, aby przywołać zdjęcia punktu końcowego, do którego podłączasz kabel sieciowy, ponieważ istnieją silne podobieństwa funkcjonalne. Niemniej jednak w mowie sieciowej słowo „gniazdo” niesie tyle bagażu, że konieczne jest staranne ponowne sprawdzenie.

W najszerszym możliwym sensie port jest punktem wejścia lub wyjścia. Chociaż nie używane w kontekście sieci, francuskie słowo porte dosłownie oznacza drzwi lub bramę , dodatkowo podkreślając fakt, że porty są punktami końcowymi transportu, niezależnie od tego, czy wysyłasz dane, czy duże stalowe kontenery.

Na potrzeby tej dyskusji ograniczę się do kontekstu sieci TCP-IP. Model OSI jest bardzo dobry, ale nigdy nie został w pełni wdrożony, a znacznie rzadziej wdrażany w warunkach dużego natężenia ruchu.

Połączenie adresu IP i portu jest ściśle znane jako punkt końcowy i czasami nazywane jest gniazdem. To użycie pochodzi z RFC793, oryginalnej specyfikacji TCP.

TCP połączenie jest zdefiniowany przez dwa punkty końcowe aka gniazd .

Punkt końcowy (gniazdo) jest definiowany przez połączenie adresu sieciowego i identyfikatora portu . Zauważ, że adres / port nie identyfikuje całkowicie gniazda (więcej na ten temat później).

Celem portów jest rozróżnienie wielu punktów końcowych na danym adresie sieciowym. Można powiedzieć, że port jest zwirtualizowanym punktem końcowym. Wirtualizacja umożliwia wiele jednoczesnych połączeń na jednym interfejsie sieciowym.

Jest to para gniazd (4-krotka składająca się z adresu IP klienta, numeru portu klienta, adresu IP serwera i numeru portu serwera), który określa dwa punkty końcowe, które jednoznacznie identyfikują każde połączenie TCP w Internecie. ( TCP-IP Illustrated Volume 1 , W. Richard Stevens)

W większości języków pochodnych C połączenia TCP są ustanawiane i manipulowane przy użyciu metod w instancji klasy Socket. Chociaż często działa się na wyższym poziomie abstrakcji, zwykle jest to instancja klasy NetworkStream, zazwyczaj ujawnia ona odwołanie do obiektu gniazda. Dla kodera ten obiekt gniazda wydaje się reprezentować połączenie, ponieważ połączenie jest tworzone i manipulowane przy użyciu metod obiektu gniazda.

W języku C #, aby nawiązać połączenie TCP (z istniejącym odbiornikiem), najpierw należy utworzyć klienta TcpClient . Jeśli nie podasz punktu końcowego konstruktora TcpClient , użyje on wartości domyślnych - w taki czy inny sposób zostanie zdefiniowany lokalny punkt końcowy. Następnie wywołujesz metodę Connect w utworzonej instancji. Ta metoda wymaga parametru opisującego inny punkt końcowy.

Wszystko to jest nieco mylące i prowadzi do przekonania, że ​​gniazdo jest połączeniem, które jest jajami. Pracowałem przy tym niezrozumieniu, dopóki Richard Dorman nie zadał pytania.

Po przeczytaniu i przemyśleniu jestem teraz przekonany, że sensowniej byłoby mieć klasę TcpConnection z konstruktorem, który przyjmuje dwa argumenty: LocalEndpoint i RemoteEndpoint . Prawdopodobnie mógłbyś obsłużyć pojedynczy argument RemoteEndpoint, gdy domyślne wartości są dopuszczalne dla lokalnego punktu końcowego. Jest to niejednoznaczne na komputerach wieloadresowych, ale niejednoznaczność można rozwiązać za pomocą tabeli routingu, wybierając interfejs z najkrótszą trasą do zdalnego punktu końcowego.

Przejrzystość zostałaby również zwiększona pod innymi względami. Gniazdo nie jest identyfikowane przez kombinację adresu IP i portu:

[...] TCP demultipleksuje przychodzące segmenty przy użyciu wszystkich czterech wartości, które obejmują adresy lokalne i obce: docelowy adres IP, numer portu docelowego, źródłowy adres IP i numer portu źródłowego. TCP nie może ustalić, który proces otrzymuje segment przychodzący, patrząc tylko na port docelowy. Ponadto jedynym z [różnych] punktów końcowych w [danym numerze portu], które będą odbierać przychodzące żądania połączenia, jest ten w stanie nasłuchiwania. (p255, TCP-IP Illustrated Volume 1 , W. Richard Stevens)

Jak widać, usługa sieciowa ma nie tylko wiele gniazd o tym samym adresie / porcie, ale tylko jedno gniazdo nasłuchiwania w określonej kombinacji adres / port. Typowe implementacje bibliotek przedstawiają klasę gniazd, której instancja służy do tworzenia połączenia i zarządzania nim. Jest to wyjątkowo niefortunne, ponieważ powoduje zamieszanie i doprowadziło do powszechnego połączenia obu pojęć.

Hagrawal mi nie wierzy (patrz komentarze), więc oto prawdziwa próbka. Podłączyłem przeglądarkę internetową do http://dilbert.com, a następnie uruchomiłem netstat -an -p tcp. Ostatnie sześć wierszy danych wyjściowych zawiera dwa przykłady faktu, że adres i port nie są wystarczające do jednoznacznej identyfikacji gniazda. Istnieją dwa różne połączenia między 192.168.1.3 (moja stacja robocza) a 54.252.94.236:80 (zdalny serwer HTTP)

  TCP    192.168.1.3:63240      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63241      54.252.94.236:80       SYN_SENT
  TCP    192.168.1.3:63242      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:63243      207.38.110.62:80       SYN_SENT
  TCP    192.168.1.3:64161      65.54.225.168:443      ESTABLISHED

Ponieważ gniazdo jest punktem końcowym połączenia, istnieją dwa gniazda z kombinacją adresu / portu 207.38.110.62:80i dwa kolejne z kombinacją adresu / portu 54.252.94.236:80.

Myślę, że nieporozumienie Hagrawala wynika z mojego bardzo ostrożnego używania słowa „identyfikuje”. Mam na myśli „całkowicie, jednoznacznie i jednoznacznie identyfikuje”. W powyższej próbce są dwa punkty końcowe z kombinacją adresu / portu 54.252.94.236:80. Jeśli masz tylko adres i port, nie masz wystarczających informacji, aby rozdzielić te gniazda. To za mało informacji, aby zidentyfikować gniazdo.

Uzupełnienie

Paragraf drugi sekcji 2.7 RFC793 mówi

Połączenie jest w pełni określone przez parę gniazd na końcach. Gniazdo lokalne może uczestniczyć w wielu połączeniach z różnymi gniazdami obcymi.

Ta definicja gniazda nie jest pomocna z punktu widzenia programowania, ponieważ nie jest tym samym co obiekt gniazda , który jest punktem końcowym określonego połączenia. Dla programisty, a większość odbiorców tego pytania to programiści, jest to istotna różnica funkcjonalna.

Bibliografia

  1. TCP-IP Illustrated Volume 1 The Protocols , W. Richard Stevens, 1994 Addison Wesley

  2. RFC793 , Information Sciences Institute, University of Southern California dla DARPA

  3. RFC147 , Definicja gniazda, Joel M. Winett, Lincoln Laboratory


6
Być może rzeczywista analogia do słów kluczowych gniazdo i port pomogłaby tym, którzy podnieśli głos w tej kwestii. Wciąż świetne wyjaśnienie!
rohitverma

5
@rationalcoder - Przeczytaj całą odpowiedź. Istnieje różnica między definiowaniem przez coś a identyfikowaniem przez to. Na przykład wystąpienia klasy są definiowane przez klasę. Są one częściowo, ale nie całkowicie przez to zidentyfikowane.
Peter Wone

6
Nie głosowałem, ponieważ nie zgadzam się z tym stwierdzeniem - „ Gniazdo nie jest identyfikowane przez kombinację adresu IP i portu: ” .. Czytaj protokół TCP RFC - tools.ietf.org/html/rfc793 .. Jest bardzo jasne, że gniazdo to kombinacja adresu IP i portu, jeśli znasz adres IP i port, wówczas zidentyfikowałeś gniazdo lub punkt końcowy, jeśli znasz parę gniazd, tj. adres IP klienta + port i adres IP serwera + serwer, wówczas zidentyfikowałeś unikalne połączenie.
hagrawal

6
„W powyższej próbce są dwa punkty końcowe z kombinacją adresu / portu 54.252.94.236:80. Jeśli masz tylko adres i port, nie masz wystarczającej ilości informacji, aby rozdzielić te gniazda. To za mało, aby zidentyfikować gniazdo elektryczne." To nie są te same gniazda, ale różne połączenia, między dwoma połączeniami, do których są podłączone 3 gniazda, 2 miejscowi i jedno gniazdo serwera; czy w rzeczywistości są to dwa różne gniazda? Nie byłoby ich rozróżniania, ponieważ są takie same, ale aby odróżnić połączenia, potrzebne byłyby różne lokalne gniazda.
Andrew Clavin

6
-1 Twoja odpowiedź jest po prostu błędna. Ty: „Gniazdo TCP jest… punktem końcowym określonego połączenia ”. RFC 793 : „gniazdo może być jednocześnie używane w wielu połączeniach ”. Nie jestem pewien, jakich bibliotek używasz, ale w bibliotekach, z których korzystałem, obiekty gniazd zostały jednoznacznie zdefiniowane przez adres IP i port i stworzyły obiekty połączeń dla każdego gniazda zdalnego.
Zaz

187

Gniazdo składa się z trzech rzeczy:

  1. Adres IP
  2. Protokół transportu
  3. Numer portu

Port jest liczbą od 1 do 65535 włącznie, która oznacza logiczną bramę w urządzeniu. Każde połączenie między klientem a serwerem wymaga unikalnego gniazda.

Na przykład:

  • 1030 to port.
  • (10.1.1.2, TCP, port 1030) jest gniazdem.

80
Nie. Gniazdo składa się z pięciu rzeczy: {protokół, adres lokalny, port lokalny, adres zdalny, port zdalny}.
user207421,

19
@EJP Nie, znowu. Zobacz wybraną odpowiedź, aby uzyskać więcej informacji.
Kehlan Krumme,

2
@KorayTugay Jest w nagłówku IP. Co sprawia, że ​​uważasz, że warstwa TCP tego nie widzi?
user207421,

1
@EJP, jak widzę w najczęściej głosowanej odpowiedzi powyżej, że gniazdo NIE jest samym połączeniem, ale jest końcowym punktem połączenia, więc dlaczego może zawierać zarówno lokalne, jak i zdalne porty i adresy IP. Gniazdo będzie reprezentować tylko jedną stronę połączenia, tj. Albo port lokalny i lokalny adres IP LUB port zdalny i zdalny dostęp IP. Uprzejmie mnie popraw, jeśli się mylę.
RBT

7
@EJP Still RFC 793: „Para gniazd jednoznacznie identyfikuje każde połączenie. Oznacza to, że gniazdo może być jednocześnie używane w wielu połączeniach”. Jeśli gniazdo składa się już z pięciu rzeczy, to w jaki sposób w moim cytacie może być „para gniazd”?
Gab 是 好人

100

Gniazdo reprezentuje pojedyncze połączenie między dwiema aplikacjami sieciowymi. Te dwie aplikacje nominalnie działają na różnych komputerach, ale gniazd można również używać do komunikacji międzyprocesowej na jednym komputerze. Aplikacje mogą tworzyć wiele gniazd do komunikacji między sobą. Gniazda są dwukierunkowe, co oznacza, że ​​każda strona połączenia może zarówno wysyłać, jak i odbierać dane. Dlatego gniazdo można utworzyć teoretycznie na dowolnym poziomie modelu OSI od 2 w górę. Programiści często używają gniazd w programowaniu sieci, choć pośrednio. Biblioteki programistyczne, takie jak Winsock, ukrywają wiele szczegółów niskiego poziomu programowania gniazd. Gniazda są szeroko stosowane od wczesnych lat 80.

Port reprezentuje punkt końcowy lub „kanał” komunikacji sieciowej. Numery portów umożliwiają różnym aplikacjom na tym samym komputerze korzystanie z zasobów sieciowych bez zakłócania się nawzajem. Numery portów najczęściej pojawiają się w programowaniu sieciowym, szczególnie w programowaniu gniazd. Czasami jednak numery portów są widoczne dla zwykłego użytkownika. Na przykład niektóre witryny sieci Web, które dana osoba odwiedza w Internecie, używają adresu URL takiego jak poniżej:

http://www.mairie-metz.fr:8080/ W tym przykładzie liczba 8080 odnosi się do numeru portu używanego przez przeglądarkę internetową do łączenia się z serwerem WWW. Zwykle witryna sieci Web używa portu o numerze 80 i ten numer nie musi być dołączony do adresu URL (chociaż może być).

W sieciach IP numery portów teoretycznie mogą mieścić się w zakresie od 0 do 65535. Jednak najbardziej popularne aplikacje sieciowe używają numerów portów na dolnym końcu zakresu (np. 80 dla HTTP).

Uwaga: Termin port odnosi się również do kilku innych aspektów technologii sieciowej. Port może odnosić się do fizycznego punktu połączenia dla urządzeń peryferyjnych, takich jak porty szeregowy, równoległy i USB. Termin port odnosi się również do niektórych punktów połączenia Ethernet, takich jak te na koncentratorze, przełączniku lub routerze.

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm


2
Warstwa 2 w modelu OSI to połączenie między węzłami, nie ma mechanizmu łączenia procesów. Nie sądzę, że można rozważyć gniazdo istniejące w OSI l2.
Antonio Haley

18
Obwód jest połączeniem - gniazdo jest punktem końcowym. Połączenie składa się z 2 gniazd.
Mark Brackett,

Gniazdo reprezentuje pojedyncze połączenie między dwiema aplikacjami sieciowymi. ” To nie jest zgodne z RFC 793, Protokołem kontroli transmisji, który wyjaśnia: „ Aby umożliwić wielu procesom w obrębie jednego hosta jednoczesne korzystanie z urządzeń komunikacyjnych TCP, TCP zapewnia zestaw adresów lub porty w obrębie każdego hosta. Połączone z siecią i adresami hosta z warstwy komunikacji internetowej, tworzy gniazdo. Para gniazd jednoznacznie identyfikuje każde połączenie.
Ron Maupin,

84

Z pewną analogią

Chociaż powyżej podano wiele technicznych informacji na temat gniazd ... Chciałbym dodać swoją odpowiedź, na wszelki wypadek, jeśli ktoś nadal nie odczuje różnicy między ip, portem a gniazdami

Rozważmy serwer S ,

i powiedz, że osoba X, Y, Z potrzebuje usługi (powiedz czat) z tego serwera S.

następnie

Adres IP mówi -> kto? to ten serwer czatu „S”, z którym X, Y, Z chcą się skontaktować

okej, masz „kto jest serwerem”

ale przypuśćmy, że serwer „S” zapewnia również inne usługi innym osobom, powiedzmy, że „S” świadczy usługi przechowywania danych dla osób A, B, C

następnie

port mówi ---> który? usługa, której potrzebujesz (X, Y, Z), tj. usługa czatu, a nie ta usługa pamięci masowej

okej, sprawisz, że serwer dowie się, że „usługa czatu” jest tym, czego chcesz, a nie miejscem do przechowywania

ale

masz trzy lata, a serwer może chcieć zidentyfikować wszystkie trzy inaczej

nadchodzi gniazdo

teraz gniazdo mówi -> który? szczególne połączenie

to znaczy powiedzmy

gniazdo 1 dla osoby X

gniazdo 2 dla osoby Y

i gniazdo 3 dla osoby Z

Mam nadzieję, że to pomoże komuś, kto nadal był zdezorientowany :)


Więc X, Y, Z łączyłyby się z tym samym portem, tj. Tą samą usługą, ale miałyby różne gniazda po stronie serwera? Kiedy więc powiedzmy, X wysyła pakiet do serwera, powie: „znajdź mi gniazdo (protokół, adres IP X, port X, adres IP S, port S)” i wyślij do aplikacji czatu. Zakładam, że musi istnieć powiązanie między niektórymi obiektami specyficznymi dla aplikacji a obiektami gniazd? Na przykład, kiedy otrzymuję dane z gniazda 1, chcę wyświetlić je jako wiadomość użytkownika, ale aplikacja musi wiedzieć, że wiadomości z gniazda A pochodzą od użytkownika X.
monolit

44

Firsty, myślę, że powinniśmy zacząć od małego zrozumienia, co oznacza uzyskanie pakietu od A do B.

Powszechną definicją sieci jest użycie modelu OSI, który dzieli sieć na kilka warstw zgodnie z przeznaczeniem. Jest kilka ważnych, które omówimy tutaj:

  • Do warstwy łącza danych . Ta warstwa jest odpowiedzialna za przesyłanie pakietów danych z jednego urządzenia sieciowego do drugiego i znajduje się tuż nad warstwą, która faktycznie transmituje. Mówi o adresach MAC i wie, jak znaleźć hosty na podstawie ich adresu MAC (sprzętowego), ale nic więcej.
  • Warstwa sieci jest warstwą, która pozwala przenosić dane między maszynami i poza fizycznymi granicami, takimi jak urządzenia fizyczne. Warstwa sieci musi zasadniczo obsługiwać dodatkowy mechanizm oparty na adresie, który w jakiś sposób odnosi się do adresu fizycznego; wprowadź protokół internetowy (IPv4). Adres IP może przesyłać twój pakiet z A do B przez Internet, ale nic nie wie o tym, jak przechodzić przez poszczególne przeskoki. Jest to obsługiwane przez powyższą warstwę zgodnie z informacjami o routingu.
  • Warstwa transportowa . Ta warstwa jest odpowiedzialna za określenie sposobu, w jaki informacje są przesyłane z punktu A do punktu B oraz wszelkich ograniczeń, kontroli lub błędów dotyczących tego zachowania. Na przykład TCP dodaje dodatkowe informacje do pakietu, dzięki czemu można wywnioskować, czy pakiety zostały utracone.

TCP zawiera między innymi koncepcję portów . Są to właściwie różne punkty końcowe danych na tym samym adresie IP, z którymi AF_INETmoże się łączyć Internet Socket ( ).

Tak się składa, że UDP i inne protokoły warstw transportowych. Z technicznego punktu widzenia nie muszą one zawierać portów, ale te porty umożliwiają wielu aplikacjom w powyższych warstwach korzystanie z tego samego komputera w celu odbierania (a nawet nawiązywania) połączeń wychodzących.

Co prowadzi nas do anatomii połączenia TCP lub UDP. Każdy z nich ma port źródłowy i adres, a port docelowy i adres. Dzieje się tak, aby w każdej sesji aplikacja docelowa mogła odpowiadać, a także odbierać, ze źródła.

Porty są więc w zasadzie umotywowaną specyfikacją, która pozwala wielu współbieżnym połączeniom współdzielić ten sam adres.

Teraz musimy przyjrzeć się, jak komunikujesz się z punktu widzenia aplikacji do świata zewnętrznego. Aby to zrobić, należy uprzejmie zapytać system operacyjny, a ponieważ większość systemów operacyjnych obsługuje sposób działania Berkeley Sockets, widzimy, że możemy tworzyć gniazda obejmujące porty z aplikacji takiej jak ta:

int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...

Świetny! Więc w sockaddrstrukturach określimy nasz port i bam! Zadanie wykonane! Cóż, prawie, z wyjątkiem:

int fd = socket(AF_UNIX, SOCK_STREAM, 0);

jest również możliwe. Urgh, to rzuca klucz w prace!

Ok, właściwie to nie ma. Wszystko, co musimy zrobić, to wymyślić kilka odpowiednich definicji:

  • Gniazdo internetowe to połączenie adresu IP, protokołu i powiązanego numeru portu, na którym usługa może dostarczać dane. Port 80 tcp, stackoverflow.com jest gniazdem internetowym.
  • Gniazdo unix to punkt końcowy IPC reprezentowany w systemie plików, np /var/run/database.sock.
  • Interfejs API gniazda to metoda żądania od aplikacji możliwości odczytu i zapisu danych w gnieździe.

Voila! To wszystko porządkuje. Zatem w naszym schemacie

  • Port to identyfikator numeryczny, który jako część protokołu warstwy transportowej identyfikuje numer usługi, który powinien odpowiedzieć na dane żądanie.

Tak naprawdę port jest podzbiorem wymagań dotyczących formowania gniazda internetowego. Niestety, tak się składa, że ​​znaczenie słowa „gniazdo” zostało zastosowane do kilku różnych pomysłów. Dlatego serdecznie radzę nazwać swoje następne gniazdo projektu, aby dodać zamieszanie;)


To dlatego pociski nie opuszczają i nie opuszczają Powerpoint; oni pracują!
Anurag Kalia

Bardzo miłe wprowadzenie do TCP-IP i komunikacji sieciowej. Początkujący przeczytaj najpierw.
Colin

32

Gniazdo = adres IP + port (adres numeryczny)
Razem określają punkt końcowy połączenia sieciowego na komputerze. (Czy właśnie zaliczyłem sieć 101?)


7
Uważam, że port ma szersze znaczenie niż twoja definicja.
Richard Dorman

2
Gniazda podlegają nie tylko stosowi TCP / IP. Zobacz ogólnie gniazda domeny UNIX lub gniazda komunikacji międzyprocesowej.
matthias krull

nie jestem pewien co do tej odpowiedzi. Za pomocą protokołu HTTP można komunikować się z innym procesem za pośrednictwem gniazd bez przypisywania portu.
SEF

31

Zasadniczo otrzymasz wiele teorii, ale jednym z najprostszych sposobów na rozróżnienie tych dwóch pojęć jest:

Aby uzyskać usługę, potrzebujesz numeru usługi. Ten numer usługi nazywa się portem. Proste.

Na przykład HTTP jako usługa działa na porcie 80.

Teraz wiele osób może poprosić o usługę i nawiązano połączenie z klient-serwer. Będzie wiele połączeń. Każde połączenie reprezentuje klienta. Aby utrzymać każde połączenie, serwer tworzy gniazdo dla każdego połączenia, aby utrzymać swojego klienta.


Czy każde gniazdo wymaga własnego portu?
MondayPaper

Niesamowite. Najprostszy sposób na przedstawienie wiedzy o górach.
Asif Mehmood

5
Nie jestem pewien, czy twoje stwierdzenie: „serwer tworzy gniazdo dla każdego połączenia w celu utrzymania swojego klienta” jest poprawne.
Rushi Agrawal

1
@RushiAgrawal W takim razie sugeruję, aby to sprawdzić. W szczególności zobacz, jak człowiek akceptuje.
user207421,

1
Oznacza to, że dla każdego gniazda, które serwer tworzy dla każdego połączenia w celu utrzymania swojego klienta, może mieć ten sam numer portu (taki jak port 80 dla kontynuacji połączeń HTTP), ale z innym adresem IP klientów, z których wysyłane są żądania połączeń. dobrze?
Randika Vishman,

25

Wydaje się, że istnieje wiele odpowiedzi, które utożsamiają gniazdo z połączeniem między 2 komputerami PC, co moim zdaniem jest absolutnie niepoprawne. Gniazdo zawsze było punktem końcowym na 1 komputerze, który może, ale nie musi być podłączony - na pewno wszyscy w pewnym momencie używaliśmy gniazd nasłuchiwania lub UDP *. Ważne jest to, że jest adresowalny i aktywny. Wysłanie komunikatu do 1.1.1.1:1234 prawdopodobnie nie zadziała, ponieważ dla tego punktu końcowego nie zdefiniowano gniazda.

Gniazda są specyficzne dla protokołu - więc implementacja unikalności, której używa zarówno TCP / IP, jak i UDP / IP * (ipaddress: port), jest inna niż np. IPX (sieć, węzeł i ... hmm, gniazdo - ale inna gniazdo, niż rozumie się przez ogólny termin „gniazdo”. Numery gniazd IPX są równoważne portom IP). Ale wszystkie oferują unikalny adresowalny punkt końcowy.

Ponieważ protokół IP stał się dominującym protokołem, port (pod względem sieci) stał się synchroniczny z numerem portu UDP lub TCP - który jest częścią adresu gniazda.

  • UDP nie wymaga połączenia - co oznacza, że ​​nigdy nie powstaje obwód wirtualny między 2 punktami końcowymi. Nadal jednak nazywamy gniazda UDP jako punkt końcowy. Funkcje API wyjaśniają, że oba są po prostu różnego rodzaju gniazdami - SOCK_DGRAMto UDP (tylko wysyłanie wiadomości) i SOCK_STREAMTCP (tworzenie obwodu wirtualnego).

  • Z technicznego punktu widzenia nagłówek IP zawiera adres IP, a protokół nad IP (UDP lub TCP) zawiera numer portu. Umożliwia to stosowanie innych protokołów (np. ICMP , które nie mają numerów portów, ale mają informacje o adresie IP).


25

Krótka krótka odpowiedź.

Portu może być opisana jako adres wewnętrzny w gospodarzu, który identyfikuje program lub proces.

Gniazdo może być opisana jako Programming Interface pozwala programowi na komunikowanie się z innymi programami lub procesów, w Internecie, lub lokalnie.


3
Słowo „wewnętrzny” w opisie portu wydaje mi się raczej „niepubliczne”.
Jonas N

Czy możemy więc powiedzieć: gniazda działają w portach? czy porty działają wewnątrz gniazd?
Gucho Ca

@GuchoCa Nie możemy powiedzieć, że gniazda lub porty w ogóle działają, a co dopiero jedno w drugim. Niejasne, o co pytasz.
user207421,

16

Są to terminy z dwóch różnych domen: „port” to koncepcja z sieci TCP / IP, „gniazdo” to API (programowanie). „Gniazdo” powstaje (w kodzie), biorąc port i nazwę hosta lub adapter sieciowy i łącząc je w strukturę danych, której można używać do wysyłania lub odbierania danych.


Aby uzyskać najbardziej ogólną odpowiedź, wpisz „wykonane przez wzięcie portu i nazwy hosta lub karty sieciowej i połączenie ich w„. ” Na przykład gniazdo UNIX to (w kodzie) struktura danych (lub obiekt), której można używać do wysyłania lub odbierania danych.
JosiahYoder-deactive, z wyjątkiem ..

14

Są to podstawowe pojęcia związane z siecią, więc wyjaśnię je w łatwy, ale kompleksowy sposób, aby zrozumieć szczegółowo.

  • Gniazdo jest jak telefon (tj. Urządzenie do komunikacji od końca do końca)
  • Adres IP jest jak numer telefonu (tj. Adres gniazda)
  • Port jest jak osoba, z którą chcesz rozmawiać (tj. Usługa, którą chcesz zamówić z tego adresu)
  • Gniazdo może być gniazdem klienta lub serwera (tzn. W firmie telefon obsługi klienta jest serwerem, ale telefon w domu to głównie klient)

Gniazdo w sieci to wirtualne urządzenie komunikacyjne powiązane z parą (ip, port) = (adres, usługa).

Uwaga:

  • Maszyna, komputer, host, telefon komórkowy lub komputer PC może mieć wiele adresów, wiele otwartych portów, a tym samym wiele gniazd. Podobnie jak w biurze, możesz mieć wiele telefonów z wieloma numerami telefonów i wieloma osobami do rozmowy.
  • Istnienie portu otwartego / aktywnego wymaga, aby gniazdo było z nim związane, ponieważ to gniazdo umożliwia dostęp do portu. Jednak na razie możesz mieć nieużywane porty.
  • Należy również pamiętać, że w gnieździe serwera można powiązać go z (port, określony adres maszyny) lub z (port, wszystkie adresy maszyny), ponieważ w telefonie można podłączyć wiele linii telefonicznych (numerów telefonicznych) do telefon lub jedna konkretna linia telefoniczna do telefonu, a mimo to możesz dotrzeć do osoby za pośrednictwem tych wszystkich linii telefonicznych lub określonej linii telefonicznej.
  • Nie można powiązać (powiązać) gniazda z dwoma portami, ponieważ w telefonie zwykle nie zawsze można mieć dwie osoby korzystające z tego samego telefonu w tym samym czasie.
  • Zaawansowane: na tym samym komputerze nie można mieć dwóch gniazd tego samego typu (klienta lub serwera) i tego samego portu i adresu IP. Jeśli jednak jesteś klientem, możesz otworzyć dwa połączenia z dwoma gniazdami do serwera, ponieważ port lokalny w każdym z tych gniazd jest inny)

Mam nadzieję, że rozwiąże to twoje wątpliwości


Interesujące jest, aby zobaczyć wszystkie te zrozumienia i analogie gniazd / portów / adresów IP w ramach tego pytania. I podoba mi się ta odpowiedź.
Bloodmoon,

12

Po przeczytaniu doskonałych, głosowanych odpowiedzi, stwierdziłem, że następujący punkt wymaga szczególnego nacisku na mnie, nowicjusza w programowaniu sieciowym:

Połączenia TCP-IP są dwukierunkowymi ścieżkami łączącymi jeden adres: kombinację portów z innym adresem: kombinacją portów. Dlatego za każdym razem, gdy otwierasz połączenie z lokalnego komputera do portu na zdalnym serwerze (powiedzmy www.google.com:80), kojarzysz również nowy numer portu na swoim komputerze z połączeniem, aby umożliwić serwerowi wysyłanie rzeczy do ciebie, (np. 127.0.0.1:65234). Pomocne może być użycie narzędzia netstat do sprawdzenia połączeń komputera:

> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)    
tcp4       0      0  192.168.0.6.49871      17.172.232.57.5223     ESTABLISHED
...

12

Adres gniazda to adres IP i numer portu

123.132.213.231         # IP address
               :1234    # port number
123.132.213.231:1234    # socket address

Połączenie występuje, gdy 2 gniazda są ze sobą połączone.


Nie ma czegoś takiego jak połączenie dwóch gniazd razem. Słowo „związany” oznacza coś innego w przypadku portów.
user207421 24.0419

10

Gniazdo to specjalny typ uchwytu pliku, który jest używany przez proces do żądania usług sieciowych od systemu operacyjnego. Adres gniazda to potrójny: {protokół, adres lokalny, proces lokalny}, w którym proces lokalny jest identyfikowany przez numer portu.

Na przykład w pakiecie TCP / IP:

{tcp, 193.44.234.3, 12345}

Rozmowa jest łączem komunikacyjnym między dwoma procesami, tym samym obrazując powiązanie między dwoma procesami. Powiązanie to 5-krotka, która całkowicie określa dwa procesy, które składają się na połączenie: {protokół, adres lokalny, proces lokalny, adres obcy, proces obcy}

Na przykład w pakiecie TCP / IP:

{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}

może być prawidłowym powiązaniem.

Połowa asocjacji to: {protokół, adres lokalny, proces lokalny}

lub

{protokół, adres obcy, proces zagraniczny}

które określają każdą połowę połączenia.

Półsocjacja jest również nazywana gniazdem lub adresem transportowym. Oznacza to, że gniazdo jest punktem końcowym komunikacji, który można nazwać i zaadresować w sieci. Interfejs gniazda jest jednym z kilku interfejsów programowania aplikacji (API) do protokołów komunikacyjnych. Zaprojektowany jako ogólny interfejs programowania komunikacji, został po raz pierwszy wprowadzony przez system UNIX 4.2BSD. Chociaż nie został znormalizowany, stał się de facto standardem branżowym.


To jest odpowiedź, która mi to zrobiła. Chyba dlatego, że nikt inny nie wspomniał o słowie skojarzenie. Dobre wytłumaczenie.
rationalcoder

W żadnym z twoich przykładów nie ma numeru procesu. Słowo, którego szukasz, to „port”.
user207421

Przeczytaj pierwszy akapit. Jest tam wyraźnie wspomniane. Daj mi znać o wszelkich niejasnościach, podając dokładne zdanie. Przydałaby mi się improwizacja.
Krishna

7

Gniazdo to punkt końcowy komunikacji. Gniazdo nie jest bezpośrednio związane z rodziną protokołów TCP / IP, można go używać z dowolnym protokołem obsługiwanym przez system. Interfejs API gniazda C oczekuje, że najpierw uzyskasz pusty system gniazda z systemu, który możesz następnie powiązać z lokalnym adresem gniazda (aby bezpośrednio pobrać ruch przychodzący dla protokołów bez połączenia lub zaakceptować przychodzące żądania połączenia dla protokołów zorientowanych na połączenie) lub że możesz połączyć się ze zdalnym adresem gniazda (dla dowolnego rodzaju protokołu). Możesz zrobić jedno i drugie, jeśli chcesz kontrolować oba, lokalny adres gniazda, do którego jest przypisane gniazdo, i adres zdalnego gniazda, do którego jest podłączone gniazdo. W przypadku protokołów bez połączenia podłączenie gniazda jest nawet opcjonalne, ale jeśli tego nie zrobisz, „ Będę również musiał przekazywać adres docelowy z każdym pakietem, który chcesz wysłać przez gniazdo, bo skąd inaczej to gniazdo wiedziałoby, dokąd wysłać te dane? Zaletą jest to, że możesz użyć pojedynczego gniazda do wysyłania pakietów na różne adresy gniazd. Po skonfigurowaniu gniazda, a może nawet podłączeniu, należy uznać go za dwukierunkową rurę komunikacyjną. Możesz go użyć do przesłania danych do jakiegoś miejsca docelowego, a jakiś cel może użyć go do przekazania danych z powrotem do ciebie. To, co piszesz do gniazda, jest wysyłane, a to, co otrzymałeś, jest dostępne do odczytu. Możesz go użyć do przesłania danych do jakiegoś miejsca docelowego, a jakiś cel może użyć go do przekazania danych z powrotem do ciebie. To, co piszesz do gniazda, jest wysyłane, a to, co otrzymałeś, jest dostępne do odczytu. Możesz go użyć do przesłania danych do jakiegoś miejsca docelowego, a jakiś cel może użyć go do przekazania danych z powrotem do ciebie. To, co piszesz do gniazda, jest wysyłane, a to, co otrzymałeś, jest dostępne do odczytu.

Z drugiej strony porty są czymś, co mają tylko niektóre protokoły stosu protokołów TCP / IP. Pakiety TCP i UDP mają porty. Port to tylko prosta liczba. Kombinacja portu źródłowego i docelowego identyfikuje kanał komunikacyjny między dwoma hostami. Np. Możesz mieć serwer, który będzie jednocześnie prostym serwerem HTTP i prostym serwerem FTP. Jeśli teraz przybywa pakiet na adres tego serwera, to skąd miałby wiedzieć, czy jest to pakiet dla serwera HTTP czy FTP? Będzie wiedział, że serwer HTTP będzie działał na porcie 80, a serwer FTP na porcie 21, więc jeśli pakiet dotrze z portem docelowym 80, dotyczy to serwera HTTP, a nie serwera FTP. Pakiet ma również port źródłowy, ponieważ bez takiego portu źródłowego serwer może mieć tylko jedno połączenie z jednym adresem IP na raz. Port źródłowy umożliwia serwerowi rozróżnienie w przeciwnym razie identycznych połączeń: wszystkie mają ten sam port docelowy, np. Port 80, ten sam docelowy adres IP (adres IP serwera) i ten sam źródłowy adres IP, ponieważ wszystkie pochodzą z ten sam klient, ale ponieważ mają różne porty źródłowe, serwer może je odróżnić. A kiedy serwer odeśle odpowiedzi, zrobi to z portem, z którego pochodzi żądanie, w ten sposób klient może również odróżnić różne odpowiedzi, które otrzymuje od tego samego serwera.


2
To jest niepoprawne. Gniazdo nie jest punktem końcowym. Gniazdo jest zdefiniowane przez dwa punkty końcowe. Każdy punkt końcowy jest zdefiniowany przez adres sieciowy i port. Celem portów jest rozróżnienie wielu punktów końcowych na tym samym adresie sieciowym, aby można było obsługiwać wiele jednoczesnych gniazd.
Peter Wone

1
Zauważam, że RFC793 (oryginalna specyfikacja TCP) odnosi się do kombinacji adresu sieciowego i portu jako gniazda, więc mogę zobaczyć, skąd to masz, ale nadal jest to nieprawidłowe, ponieważ gniazdo jest koniecznie zdefiniowane przez dwa punkty końcowe.
Peter Wone

2
Po namyśle literatura jest sprzeczna i przepraszam. Mówiąc ściśle, komunikacja nie następuje, dopóki nie zostanie nawiązane połączenie TCP między dwoma punktami końcowymi (inaczej gniazdami), z których każdy jest identyfikowany przez adres sieciowy i port. Poddaję się.
Peter Wone

6

Port był najłatwiejszą częścią, to po prostu unikalny identyfikator gniazda. Gniazdo jest czymś, czego procesy mogą używać do nawiązywania połączeń i komunikacji między sobą. Wysoki Jeff miał świetną analogię telefoniczną, która nie była idealna, więc postanowiłem to naprawić:

  • ip i port ~ numer telefonu
  • gniazdo ~ urządzenie telefoniczne
  • połączenie ~ połączenie telefoniczne
  • nawiązanie połączenia ~ połączenie z numerem
  • procesy, aplikacje zdalne ~ ludzie
  • wiadomości ~ mowa

Dobre wyjaśnienie (zwłaszcza, gdy weźmie się pod uwagę historię przełączania telefonu, która jest częścią podstawowej terminologii sieciowej)
o

Spójrz na netstatwyświetlacz jakiś czas. Wszystkie gniazda przyjęte z gniazda nasłuchującego mają ten sam port. Ergo port nie jest unikalnym identyfikatorem gniazda.
user207421,

6

Aplikacja składa się z pary procesów komunikujących się przez sieć (para klient-serwer). Procesy te wysyłają i odbierają wiadomości do i z sieci za pośrednictwem interfejsu oprogramowania o nazwie gniazdo . Biorąc pod uwagę analogię przedstawioną w książce „Computer Networking: Top Down Approach”. Jest dom, który chce komunikować się z innym domem. Tutaj dom jest analogiczny do procesu, a drzwi do gniazdka. Proces wysyłania zakłada, że ​​po drugiej stronie drzwi znajduje się infrastruktura, która przetransportuje dane do miejsca docelowego. Gdy wiadomość dotrze po drugiej stronie, przechodzi przez drzwi odbiornika (gniazdo) do domu (proces). Ta ilustracja z tej samej książki może ci pomóc:
wprowadź opis zdjęcia tutaj
Gniazda są częścią warstwy transportowej, która zapewnia logiczną komunikację z aplikacjami. Oznacza to, że z punktu widzenia aplikacji oba hosty są bezpośrednio ze sobą połączone, mimo że istnieje wiele routerów i / lub przełączników między nimi. Zatem gniazdo nie jest samym połączeniem, jest punktem końcowym połączenia. Protokoły warstwy transportowej są implementowane tylko na hostach, a nie na routerach pośrednich.
Portyzapewnić środki wewnętrznego adresowania do maszyny. Głównym celem jest umożliwienie wielu procesom wysyłania i odbierania danych przez sieć bez ingerencji w inne procesy (ich dane). Wszystkie gniazda mają numer portu. Kiedy segment dociera do hosta, warstwa transportowa sprawdza docelowy numer portu segmentu. Następnie przekazuje segment do odpowiedniego gniazda. Zadanie dostarczania danych w segmencie warstwy transportowej do odpowiedniego gniazda nazywa się demultipleksowaniem . Dane segmentu są następnie przekazywane do procesu podłączonego do gniazda.


5

Gniazdo to struktura oprogramowania. To mniej więcej plik; ma operacje takie jak odczyt i zapis. To nie jest rzecz fizyczna; jest to sposób na odniesienie przez oprogramowanie do rzeczy fizycznych.

Port jest podobny do urządzenia. Każdy host ma jedną lub więcej sieci (fizycznych); host ma adres w każdej sieci. Każdy adres może mieć tysiące portów.

Tylko jedno gniazdo może korzystać z portu pod adresem. Gniazdo przydziela port mniej więcej tak, jak przydział urządzenia dla operacji we / wy systemu plików. Po przydzieleniu portu żadne inne gniazdo nie może połączyć się z tym portem. Port zostanie zwolniony po zamknięciu gniazda.

Spójrz na terminologię TCP / IP .


3
Ten opis gniazda jest całkiem nie na bazie. Gniazdo dotyczy połączenia między parą krotek, przy czym krotka odnosi się do pary adresów IP ADDR i portu. Dodatkowo wiele gniazd MOŻE podłączyć się do tego samego portu. Jak myślisz, jak serwer sieciowy przyjmuje wiele połączeń na porcie 80? To kiepska odpowiedź
Wysoki Jeff,

1
Przepraszam. Wiele gniazd nie jest podłączonych do portu 80. Jedno gniazdo jest podłączone i spawnuje dodatkowe gniazda, w których odbywa się prawdziwy transfer. Zobacz opengroup.org/onlinepubs/009695399/functions/listen.html .
S.Lott,

1
W rzeczywistości opis na opengroup.org/onlinepubs/009695399/functions/connect.html jest lepszy. Gniazdo równorzędne zwrócone przez połączenie NIE znajduje się na porcie 80.
S.Lott

1
Ten post jest nieprawidłowy w kilku szczegółach i wprowadza w błąd pod wieloma względami.
Peter Wone

@Peter Wone: Jakie dane? Które aspekty Mam nadzieję, że nauczę się na własnych błędach.
S.Lott,

5

z Oracle Java Tutorial :

Gniazdo to jeden punkt końcowy dwukierunkowego łącza komunikacyjnego między dwoma programami działającymi w sieci. Gniazdo jest powiązane z numerem portu, dzięki czemu warstwa TCP może zidentyfikować aplikację, do której dane mają zostać wysłane.


To tylko samouczek, a na pewno nie odniesienie normatywne.
user207421,

„Gniazdo to jeden punkt końcowy dwukierunkowego łącza komunikacyjnego” Czy to nie jest definicja gniazda, nie samouczek Java?
prayagupd

@prayagupd Oczywiście jest to definicja, ale pochodzi z samouczka, a nie ze specyfikacji.
user207421,

4

Port i gniazdo można porównać do oddziału banku.

Numer budynku „Banku” jest analogiczny do adresu IP. Bank ma różne sekcje, takie jak:

  1. Dział rachunków oszczędnościowych
  2. Dział pożyczek osobistych
  3. Dział kredytów mieszkaniowych
  4. Wydział skarg

Tak więc 1 (dział rachunków oszczędnościowych), 2 (dział pożyczek osobistych), 3 (dział kredytów mieszkaniowych) i 4 (dział skarg) są portami.

Teraz powiedzmy, że idziesz otworzyć konto oszczędnościowe, idziesz do banku (adres IP), następnie idziesz do „działu konta oszczędnościowego” (numer portu 1), a następnie spotykasz jednego z pracowników pracujących w dziale „konta oszczędnościowego” „. Nazwijmy go SAVINGACCOUNT_EMPLOYEE1 w celu otwarcia konta.

SAVINGACCOUNT_EMPLOYEE1 to deskryptor gniazda, więc może występować SAVINGACCOUNT_EMPLOYEE1 do SAVINGACCOUNT_EMPLOYEEN. Są to wszystkie deskryptory gniazd.

Podobnie inne działy będą zatrudniać pod nimi pracodawców i są one analogiczne do gniazd.


3

Gniazdo to mechanizm we / wy danych. Port to umowna koncepcja protokołu komunikacyjnego . Gniazdo może istnieć bez portu. Port może istnieć bez określonego gniazda (np. Jeśli kilka gniazd jest aktywnych na tym samym porcie, co może być dozwolone w przypadku niektórych protokołów).

Port jest używany do określania, do którego gniazda odbiorca powinien kierować pakiet, z wieloma protokołami, ale nie zawsze jest to wymagane, a wybór gniazda odbiorczego może być dokonany w inny sposób - port jest całkowicie narzędziem używanym przez procedurę obsługi protokołu w podsystem sieciowy. np. jeśli protokół nie korzysta z portu, pakiety mogą iść do wszystkich gniazd nasłuchujących lub dowolnego gniazda.


3

Względna terminologia TCP / IP, która, jak zakładam, wynika z pytania. W kategoriach laika:

PORT jest jak numer telefonu określonego domu w określonym kodzie pocztowym. Kod pocztowy miasta można uznać za adres IP miasta i wszystkich domów w tym mieście.

Z drugiej strony GNIAZDO przypomina bardziej nawiązane połączenie telefoniczne między telefonami pary domów rozmawiających ze sobą. Połączenia te można nawiązywać między domami w tym samym mieście lub dwoma domami w różnych miastach. Jest to tymczasowa ustanowiona ścieżka między parą telefonów rozmawiających ze sobą, czyli GNIAZDO.


2
Gniazdo jest punktem końcowym. Istnieje przed nawiązaniem połączenia (TCP) lub w przypadku braku połączenia (UDP). Ergo to nie samo połączenie.
user207421

2

W szerokim sensie Socket - to po prostu gniazdo, podobnie jak gniazdko elektryczne, kablowe lub telefoniczne. Punkt, w którym „wymagane rzeczy” (moc, sygnał, informacja) mogą wyjść i wyjść. Ukrywa wiele szczegółowych rzeczy, które nie są wymagane do użycia „wymaganych rzeczy”. W języku programowania zapewnia ogólny sposób definiowania mechanizmu komunikacji między dwoma podmiotami (tymi podmiotami może być wszystko - dwie aplikacje, dwa fizycznie oddzielne urządzenia, przestrzeń użytkownika i jądra w systemie operacyjnym itp.)

Port jest dyskryminatorem punktu końcowego. Różni jeden punkt końcowy od drugiego. Na poziomie sieci rozróżnia jedną aplikację od drugiej, dzięki czemu stos sieci może przekazywać informacje do odpowiedniej aplikacji.


2

Na to pytanie udzielono już teoretycznych odpowiedzi. Chciałbym podać praktyczny przykład tego pytania, które wyjaśni twoje zrozumienie dotyczące Socket i Port.

Znalazłem to tutaj

Ten przykład poprowadzi Cię przez proces łączenia się ze stroną internetową, taką jak Wiley. Otworzysz przeglądarkę internetową (np. Mozilla Firefox) i wpisz www.wiley.com w pasku adresu. Twoja przeglądarka korzysta z serwera DNS (Domain Name System), aby wyszukać nazwę www.wiley.com w celu zidentyfikowania jej adresu IP. W tym przykładzie adres to 192.0.2.100.

Firefox nawiązuje połączenie z adresem 192.0.2.100 i portem, na którym działa serwer WWW warstwy aplikacji. Firefox wie, jakiego portu się spodziewać, ponieważ jest to port dobrze znany. Portem dobrze znanym dla serwera WWW jest port TCP 80.

Gniazdo docelowe, które Firefox próbuje połączyć, jest zapisywane jako gniazdo: port lub w tym przykładzie 192.0.2.100:80. Jest to strona połączenia z serwerem, ale serwer musi wiedzieć, gdzie wysłać stronę internetową, którą chcesz wyświetlić w Mozilla Firefox, więc masz także gniazdo po stronie klienta połączenia.

Połączenie po stronie klienta składa się z adresu IP, takiego jak 192.168.1.25, i losowo wybranego dynamicznego numeru portu. Gniazdo powiązane z Firefoksem wygląda jak 192.168.1.25:49175. Ponieważ serwery WWW działają na porcie TCP 80, oba te gniazda są gniazdami TCP, natomiast jeśli łączysz się z serwerem działającym na porcie UDP, zarówno serwer, jak i klient będą gniazdami UDP.


Bardzo słaba jakość cytowania. Trzeci akapit niewłaściwie używa słowa „gniazdo”, jakby oznaczało „adres IP”. Tak nie jest.
user207421

2

Socket jest abstrakcją dostarczaną przez jądro dla aplikacji użytkownika dla danych I / O. Typ gniazda jest definiowany przez protokół jego obsługi, komunikację IPC itp. Jeśli więc ktoś utworzy gniazdo TCP, może wykonywać manipulacje, takie jak odczytywanie danych do gniazda i zapisywanie danych za pomocą prostych metod oraz obsługa protokołu niższego poziomu, np. Konwersja TCP i przekazywanie pakietów do protokołów sieciowych niższego poziomu odbywa się przez konkretną implementację gniazda w jądrze. Zaletą jest to, że użytkownik nie musi się martwić obsługą specyficznych dla protokołu azotów i powinien po prostu odczytywać i zapisywać dane w gniazdach jak normalny bufor. To samo dotyczy IPC, użytkownik po prostu odczytuje i zapisuje dane do gniazda, a jądro obsługuje wszystkie szczegóły niższego poziomu w zależności od typu utworzonego gniazda.

Port wraz z IP przypomina dostarczanie adresu do gniazda, chociaż nie jest to konieczne, ale pomaga w komunikacji sieciowej.


2

Pojedynczy port może mieć jedno lub więcej gniazd połączonych z różnymi zewnętrznymi adresami IP, jak wiele gniazdek elektrycznych.

  TCP    192.168.100.2:9001     155.94.246.179:39255   ESTABLISHED     1312
  TCP    192.168.100.2:9001     171.25.193.9:61832     ESTABLISHED     1312
  TCP    192.168.100.2:9001     178.62.199.226:37912   ESTABLISHED     1312
  TCP    192.168.100.2:9001     188.193.64.150:40900   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.23.194.149:43970   ESTABLISHED     1312
  TCP    192.168.100.2:9001     198.49.73.11:38842     ESTABLISHED     1312

2

Gniazdo to abstrakcja SW punktu końcowego sieci, używana jako interfejs do aplikacji. W Javie C # jest reprezentowany przez obiekt, w Linux, Unix jest to plik.

Port jest tylko właściwością gniazda, które określiłeś, jeśli chcesz nawiązać komunikację. Aby otrzymać pakiet z gniazda, musisz powiązać go z określonym portem lokalnym i kartą sieciową (z lokalnym adresem IP) lub wszystkimi kartami sieciowymi (INADDR_ANY jest określony w wywołaniu wiązania). Aby wysłać pakiet, musisz określić port i adres IP zdalnego gniazda.


1

Gniazdo jest w zasadzie punktem końcowym komunikacji sieciowej, składającym się przynajmniej z adresu IP i portu. W Javie / C # gniazdo jest implementacją wyższego poziomu jednej strony dwukierunkowego połączenia.

Ponadto definicja w dokumentacji Java .


Masz na myśli Java Turorial.
user207421,

1

Port:

Port może odnosić się do fizycznego punktu połączenia dla urządzeń peryferyjnych, takich jak porty szeregowy, równoległy i USB. Termin port odnosi się również do niektórych punktów połączeń Ethernet, takich jak te w koncentratorze, przełączniku lub routerze.

Gniazdo elektryczne:

Gniazdo reprezentuje pojedyncze połączenie między dwiema aplikacjami sieciowymi. Te dwie aplikacje nominalnie działają na różnych komputerach, ale gniazd można również używać do komunikacji międzyprocesowej na jednym komputerze. Aplikacje mogą tworzyć wiele gniazd do komunikacji między sobą. Gniazda są dwukierunkowe, co oznacza, że ​​każda strona połączenia może zarówno wysyłać, jak i odbierać dane.


Port TCP lub UDP nie odnosi się ani do fizycznych, ani do punktów połączeń Ethernet. Nie odpowiedziałeś na pytanie.
user207421,

1

Port oznacza punkt końcowy komunikacji w transporcie TCP i UDP dla protokołu sieciowego IP. Gniazdo jest abstrakcją oprogramowania dla punktu końcowego komunikacji powszechnie używanego w implementacjach tych protokołów (API gniazda). Alternatywną implementacją jest interfejs API XTI / TLI.

Zobacz też:

Stevens, WR 1998, Programowanie sieciowe UNIX: API sieciowe: Sockets i XTI; Tom 1, Prentice Hall.
Stevens, WR, 1994, Illustrated TCP / IP, Tom 1: The Protocols, Addison-Wesley.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.