To pytanie zadał jeden z inżynierów oprogramowania w mojej organizacji. Interesuje mnie najszersza definicja.
To pytanie zadał jeden z inżynierów oprogramowania w mojej organizacji. Interesuje mnie najszersza definicja.
Odpowiedzi:
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 .
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:80
i 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.
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.
Gniazdo składa się z trzech rzeczy:
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:
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
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 :)
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:
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_INET
moż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 sockaddr
strukturach 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:
/var/run/database.sock
.Voila! To wszystko porządkuje. Zatem w naszym schemacie
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;)
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?)
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.
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_DGRAM
to UDP (tylko wysyłanie wiadomości) i SOCK_STREAM
TCP (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).
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.
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.
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 w sieci to wirtualne urządzenie komunikacyjne powiązane z parą (ip, port) = (adres, usługa).
Uwaga:
Mam nadzieję, że rozwiąże to twoje wątpliwości
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
...
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.
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.
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.
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ć:
netstat
wyświetlacz jakiś czas. Wszystkie gniazda przyjęte z gniazda nasłuchującego mają ten sam port. Ergo port nie jest unikalnym identyfikatorem gniazda.
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:
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.
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 .
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.
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:
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.
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.
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.
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.
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.
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.
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
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.
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 .
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 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.