Co to jest gniazdo?


49

Czy ktoś mógłby mi wyjaśnić, co to jest gniazdo? Widzę to w wielu akronimach w kontekście SSL itp.

Ponadto, dlaczego nazywa się to gniazdem? Czy to tylko dlatego, że wymyślili to imię? A może to imię, które wymyślili?


9
Mówiąc w skrócie: gniazdo to telefon. To coś, co trzymasz w dłoni, pozwala rozmawiać z innym telefonem. Ta analogia nieco się psuje: większość rozmów telefonicznych odbywa się w trybie peer-to-peer. Połączenia gniazd są klientami do serwera. Klient (np. Oprogramowanie stacji roboczej, takie jak przeglądarki) łączy się z serwerem (takim jak serwer WWW, serwer plików, serwer uwierzytelniania lub inny). Kolejna wada w analogii: kiedy zamykasz połączenie gniazda, gniazdo jest niszczone i musisz utworzyć nowe gniazdo, zanim będziesz mógł ustanowić nowe połączenie.
G-Man mówi „Przywróć Monikę”

Dla analogii nie jest tak źle. Serwer to tylko call-center i może wykonywać wiele setek aktywnych połączeń jednocześnie.
MSalters

Odpowiedzi:


42

Gniazdo jest tylko logicznym punktem końcowym komunikacji. Istnieją na warstwie transportowej. Możesz wysyłać i odbierać rzeczy na gnieździe, możesz powiązać i słuchać gniazda. Gniazdo jest specyficzne dla protokołu, maszyny i portu i jako takie jest zaadresowane w nagłówku pakietu.

Przewodniki Beej dotyczące programowania sieci i komunikacji między procesami zawierają dobre informacje na temat korzystania z gniazd, a nawet odpowiadają na to dokładne pytanie .


64

Mówiąc najprościej, gniazdo jest pseudoplikiem reprezentującym połączenie sieciowe. Po utworzeniu gniazda (przy użyciu odpowiednich prymitywów i odpowiednich parametrów do identyfikacji drugiego hosta) zapisy do gniazda są przekształcane w pakiety sieciowe, które są wysyłane, a dane otrzymywane z sieci mogą być odczytywane z gniazda.

Pod jednym względem gniazda są bardzo podobne do potoków: wyglądają jak pliki programów, które ich używają, ale nie powodują odczytu ani zapisu na dysku; pozwalają raczej komunikować się z innym programem (lokalnym w przypadku potoków i ewentualnie zdalnym w przypadku gniazd). Oferują one również, jak wspomniałeś, dwukierunkową komunikację (podobnie jak para prawidłowo podłączonych rur).

Wreszcie programy na jednym komputerze często komunikują się przy użyciu standardowych protokołów sieciowych, takich jak TCP; marnotrawstwem byłoby pójść do sprzętu sieciowego (jeśli istnieje!), obliczania sum kontrolnych itp., aby wrócić do tego samego hosta: tam właśnie wkraczają gniazda domen uniksowych. Są one podobne do zwykłych gniazd, z wyjątkiem łączą procesy na tym samym hoście, a nie procesy zdalne, i nie próbują w ogóle używać żadnych zasobów sieciowych. W ten sposób są one środkiem komunikacji między procesami.

Jak wspomniano trzyosobowy, w trakcie historii BSD rury wprowadzono wcześniej niż gniazda i ponownie wprowadzono za pomocą gniazd, gdy już istniały. To samo odniesienie, Projekt i implementacja systemu operacyjnego FreeBSD , wspomina, że ​​rury zostały następnie przywrócone do implementacji innej niż podstawowa ze względu na wydajność: to z pewnością podkreśla fakt, że potoki mają podobieństwa.


3
Być może wspomnę również, że rury są wcześniejsze niż gniazda, ale kiedy interfejs gniazda został dodany do Uniksa, sensowne było ponowne wdrożenie rur przy użyciu lokalnych gniazd.
tripleee

@tripleee: To świetny historyczny punkt. Chcesz podać referencje?
dhag

Szybkie wyszukiwanie w Google pojawia się na stronie 40 w „Projekcie i implementacji systemu operacyjnego FreeBSD” ; tekst wspomina o tej zmianie w 4.2BSD, ale wyjaśnia również, że nie jest to już tak ze względu na wydajność.
tripleee

Doskonale, dodam to do mojej odpowiedzi.
dhag

Najlepsza odpowiedź techno we wszystkich
chaosguru

7

Gniazdo abstrakcja. Zapewnia interfejs dla aplikacji do korzystania z zasobu systemowego (w tym przypadku połączenia sieciowego) w sposób, który pozwala systemowi operacyjnemu pośredniczyć i organizować użycie ograniczonego zasobu przez dowolną liczbę aplikacji.

Jeśli dane przesyłane przez gniazdo można uznać za koperty pocztowe, wówczas gniazdem będzie Twoja skrzynka pocztowa. Dołączasz skrzynkę pocztową (gniazdo) do domu (programu) i umieszczasz w niej pocztę wychodzącą (dane). O ustalonej godzinie pojawia się listonosz (system operacyjny), odbiera pocztę wychodzącą i wysyła pocztę przychodzącą do tej samej skrzynki pocztowej. Twoja poczta wychodząca jest przekazywana w Twoim imieniu do odbiorcy za pośrednictwem ciężarówki listonosza (połączenie sieciowe) wraz z pocztą wszystkich sąsiadów. Dzięki temu możesz korespondować z ludźmi daleko, bez konieczności poświęcania pieniędzy, czasu, trudności itp. Na samodzielne dostarczenie listu.

Jeśli chodzi o powód, dla którego nazywane są one „gniazdami”, pomysł, że wynalazcy mogą nazywać to, co chcą, prawdopodobnie odgrywa tutaj dużą rolę. Choć moim zdaniem nie jest to złe imię :)


7

Co to jest?

Gniazdo lub „gniazdo” może składać się z kilku rzeczy:

Przede wszystkim jest to model myślowy i interfejs programowania aplikacji (API) . Oznacza to, że masz zestaw zasad, których musisz przestrzegać, oraz zestaw funkcji, których możesz używać do pisania programów, które coś robią, zgodnie z ściśle określoną umową. W tym konkretnym przypadku coś oznacza wymianę danych z innym programem.

Interfejs API gniazd ogólnie abstrahuje szczegóły „komunikacji” w ogóle. Zawiera informacje o tym, z kim rozmawiasz i w jaki sposób, za pośrednictwem jednego (prawie) spójnego i identycznego formularza do usuwania plików cookie.
Możesz tworzyć gniazda w różnych „domenach” (takich jak np. „Gniazdo unixowe” lub „gniazdo internetowe”) i różnych rodzajów komunikacji (np. Gniazdo „datagramowe” lub „strumieniowe”) i rozmawiać z różnymi odbiorcami i wszystko działa dokładnie tak samo (cóż, 99%, są oczywiście drobne różnice, które należy uwzględnić).

Nie musisz wiedzieć (a nawet nie chcesz wiedzieć!), Czy rozmawiasz z innym programem na tym samym komputerze lub na innym komputerze, czy między tymi komputerami znajduje się sieć IPv4 lub IPv6, a może jakiś inny protokół, o którym nigdy nie słyszałeś.

socketjest także nazwą funkcji bibliotecznej (lub syscall), która tworzy „gniazdo ”, które jest specjalnym rodzajem pliku (wszystko w Uniksie jest plikiem).

Jak to się ma do ...

gniazda należą do tej samej kategorii co rury i rury nazwane

Potok jest sposobem jednokierunkowej komunikacji między czytnikiem a pisarzem (oba są programami) na tym samym komputerze. Symuluje strumień danych (tak jak np. TCP).
Oznacza to, że z punktu widzenia potoku nie istnieją pojedyncze „wiadomości” ani „bloki danych”. Możesz skopiować dowolną ilość danych na „jeden koniec”, a ktoś inny może odczytać dowolną ilość danych (niekoniecznie to samo i niekoniecznie za jednym razem) na „drugim końcu” w tej samej kolejności bajtów, co Ty wepchnął to.

Nazwie rura jest, dobrze, po prostu rura , która jest właścicielem nazwy w systemie plików . Oznacza to, że jest to coś, co wygląda i zachowuje się jak plik, pojawia się na liście katalogów i można go otworzyć, zapisać do niego itp. Należy pamiętać, że można również tworzyć specjalne pliki z gniazdami (byłoby to nazwane gniazdo) .

Z drugiej strony, gniazdo jest środkiem komunikacji dwukierunkowej („dupleks”), co oznacza, że ​​możesz pisać i czytać z tego samego gniazda i nie potrzebujesz dwóch oddzielnych gniazd do komunikacji dwukierunkowej.
Ponadto gniazdo może działać jako strumień (identyczny z potokiem) lub może wysyłać dyskretne, niewiarygodne wiadomości lub może wysyłać dyskretne, uporządkowane wiadomości (pierwsze dwa działają w dowolnej domenie, ostatnie tylko w „domenie unix” ). Może wysyłać wiadomości (lub symulować strumień) do kogoś na zupełnie innym komputerze. W pewnych warunkach gniazdo może nawet mieć formę komunikacji jeden do wielu (multiemisja).

Mając to na uwadze, jasne jest, że gniazda robią coś o wiele bardziej skomplikowanego i generalnie mają większy narzut niż rury (które są w zasadzie nie więcej niż proste memcpydo i z bufora!), Ale jeśli tworzysz lokalne gniazda (tj. Na tym samym komputer), system operacyjny zwykle stosuje mocno zoptymalizowaną szybką ścieżkę, więc naprawdę nie ma dużej różnicy.

komunikacja międzyprocesowa czasami wymieniana w odniesieniu do sieci

Tak, gniazda są jednym z możliwych sposobów komunikacji między procesami (pamięć wspólna i potoki są przykładami alternatyw). Jednocześnie są one wykorzystywane do „tworzenia sieci”, jak wyjaśniono powyżej.


1

W przypadku udp lub tcp przez IP,

Adres gniazda jest kombinacją adresu IP i numeru portu.

Adres IP to adres maszyny w Internecie, np unix.stackexchange.com has address 198.252.206.140

Jednak każdy komputer musi być w stanie świadczyć więcej niż jedną usługę, więc większość komputerów będzie zapewniać http (strony internetowe) na porcie 80 i ssh na porcie 22 itd.

Tak unix.stackexchange.com:80Port 80of unix.stackexchange.com(gniazdo) jest punkt dostępowy z tej strony internetowej.

Istnieją jednak inne typy gniazd, patrz komentarze poniżej.


5
tcp / ip jest tylko jednym rodzajem gniazda. Są inne, które nie mają nic wspólnego z tcp / ip.
psusi

ile jest różnych rodzajów gniazd?
Abdul Al Hazred

1
@AbdulAlHazred, znam cztery popularne typy używane w sieciach ip, to samo z ip6, dwa z unixem i dwa z IPX. Nie patrzyłem na ax25, bankomat lub appletalk. Istnieją inne protokoły obsługiwane w systemie Linux i istnieją protokoły, których system Linux nie obsługuje. W większości przypadków każdy protokół ma gniazda stream (tcp) i datagram (udp). Surowe gniazda są również powszechne, a imcp może również mieć interfejs gniazda.
hildred

Chodzi o to, że ta odpowiedź jest niepełna, ponieważ obejmuje tylko jeden typ gniazda, i wprowadza w błąd, ponieważ reprezentuje gniazda ogólnie tak, jakby zawsze były gniazdami sieciowymi, a konkretnie AF_INETgniazdami IP ( ).
tripleee

0

Myślę, że zapytałeś o sieci. Tak więc usługi TCP używają gniazd jako punktu komunikacji i składają się z adresu IP, protokołu i numeru portu.

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.