Co to jest gniazdo, fizycznie?

Zawsze wolę pyhsical znaczenie pojęcia programowania niż jego logiczne znaczenie. Oto pytanie.

Przeglądając paradygmat programowania socket zauważyłem, że co bind(), funkcje connect () są podobne do strojenia gniazda utworzonego przez funkcję socket(). Domyślam się więc, że to, co robi funkcja socket () , to tylko tworzenie struktury danych (i ewentualnie struktury danych w jądrze spacja) do przechowywania informacji o ustawieniach komunikacji end-to-end pomiędzy Klientem a serwerem. I bind (), connect () {[4] } wystarczy wypełnić tę strukturę danych.

Nie jestem zaznajomiony z implementacją socket API, więc mam nadzieję, że ktoś rozwiąże moje obawy.

Author: Felix Kling, 2011-02-14

3 answers

Jest to bardzo zależne od platformy. Celem API jest to, abyś nie musiał znać tych szczegółów.

Jeśli naprawdę jesteś zainteresowany nauką tego (co nie powinno być tylko dla aplikacji i programowania aplikacji systemowych), możesz pobrać archiwum źródeł jądra Linuksa z kernel.org i zbadaj implementację TCP/IP Linuksa patrząc pod net / ipv4

Aby dodać trochę jasności,

Aby transportować dane przez sieć, zazwyczaj stosujemy się do standardów zdefiniowana przez Międzynarodową Organizację Normalizacyjną. Mają standard zwany OSI, lub Open Systems Interconnection, model.

Ten model definiuje 7 warstw abstrakcji dla aplikacji do przenoszenia danych przez sieć. Będę mówić tylko o pierwszych 4, ponieważ są one istotne dla Twojego pytania.

Warstwa Fizyczna:

Ta warstwa określa, w jaki sposób dane są faktycznie przesyłane przez media. Dostawcy sprzętu przestrzegają zdefiniowanych standardów dotyczących przenoszenia danych. Normy są zgodne co do sygnałów elektrycznych i elektronicznych aspektów przenoszenia danych.

Jak to pasuje do systemu:

Miejmy nadzieję, że dla tej warstwy jest bardzo mało wsparcia programistycznego. Jakiekolwiek programowanie jest tutaj wykonywane, prawdopodobnie będzie wykonywane w module, a nie w jądrze lub aplikacji.

Warstwa Łącza Danych:

Jest to pierwsza warstwa, która prawdopodobnie wymaga jakiegoś programowania. Warstwa ta definiuje protokoły liniowe, które działają na fizyczne linki. Ethernet to jeden protokół. Frame relay to kolejny. Token Ring jest inny. Na każdym końcu łącza musi być uruchomiony ten sam protokół łącza danych. Warstwa ta łączy zgodny standard warstwy fizycznej, aby zapewnić środki do rzeczywistego przesyłania danych z Jednego Hosta do drugiego. Pod wieloma względami może być to raczej dodatek do warstwy fizycznej, a nie jej własna warstwa, ale ponieważ protokoły poziomu łącza są tutaj zdefiniowane, nie jest to wielka analogia. Warstwa ta daje fizyczne adresy do węzłów w sieci.

Jak to pasuje do systemu:

Musisz napisać sterownik, aby rozmawiać z modułem interfejsu, który uruchamia te protokoły łącza danych. W zależności od modułu i systemu, moduł może mieć wszystko, czego potrzebuje do działania lub może potrzebować pomocy na poziomie systemu. Najlepiej byłoby po prostu utworzyć zestaw interfejsów kodowych (być może zaimplementowanych jako struktury zawierające Wskaźniki funkcji dla odpowiedniej obsługi We / Wy.. Naprawdę Nie wiem) i kiedy ty zainstaluj nowy moduł fizyczny, sterownik musi tylko zaimplementować te interfejsy kodu, a teraz twój moduł fizyczny jest użyteczny.

Warstwa Sieci

Jest to warstwa, która zapewnia możliwość przenoszenia danych między sieciami (w przypadku TCP/IP). Protokół internetowy jest zdefiniowany na tej warstwie. Warstwa ta daje logiczne adresy węzłom, dzięki czemu można je pogrupować w sieci. Wiedząc, jaka sieć (zwana także podsiecią, określana programowo za pomocą maski podsieci) , host jest włączony, uruchamiamy algorytmy, które poprawnie przenoszą dane z jednej sieci do drugiej. Jeśli jeden host znajduje się w sieci a w Chinach, a jeden w sieci B w Australii, algorytmy na tym poziomie są odpowiedzialne za zapewnienie ścieżki łączącej te sieci, a tym samym te hosty.

Ważną rzeczą w programowaniu dla tej warstwy jest to, że powinieneś być w stanie po prostu "podłączyć" dowolną warstwę łącza danych do transmisji. Oznacza to, że po utworzeniu kodu w systemie do przesyłania przez Ethernet, Token Ring, 3G lub Frame Relay, które powinny być w stanie korzystać z nich wszystkich bez potrzeby, aby warstwa sieciowa wiedziała, jakiej technologii łącza danych używa. Logika przenoszenia danych między sieciami nie powinna zależeć od rzeczywistego fizycznego połączenia, na którym działa.

Ta warstwa umieszcza twoje dane w pakietach, a pakiety są tym, co jest kierowane przez internet.

Jak to pasuje do systemu:

Cała ta warstwa musi być zakodowana jako część systemu. Jest to całkowicie konstruowania oprogramowania i powinny być w jak największym stopniu odizolowane od warstwy łącza danych. Nie jestem wystarczająco ekspertem, aby powiedzieć w praktyce, jak dobrze jest to osiągnąć. Ponieważ funkcjonalność tej warstwy jest zdefiniowana systemowo, mamy pełną kontrolę nad tym, co oprogramowanie musi obsługiwać. To sprawia, że budowa interfejsów kodowych, które umożliwiają korzystanie z tej warstwy przez protokoły wyższej warstwy, jest dość prosta w porównaniu do tych w warstwie łącza danych.

Warstwa Transportowa:

Ta warstwa definiuje segmentację danych (bo jeśli po prostu wysłać gigantyczne kawałki danych na raz, prawie nic nie będzie w porządku). Ta warstwa definiuje również TCP, który zapewnia ręczne potrząsanie, sumy kontrolne, kolejność pakietów, zmienne rozmiary okien danych i gwarantowaną niezawodność. TCP daje możliwość tworzenia wielu logicznych kanałów komunikacji za pomocą tego samego łącza fizycznego. To odróżnia jeden coversation na linku od innej rozmowy na tym samym linku. UDP jest również zdefiniowany w tym poziomu i może być uważany za niezwykle lekki TCP. UDP nie dostarczył prawie żadnych korzyści z TCP, ale nadal zapewnia fizyczne multipleksowanie kanałów.

Jeśli twoja warstwa transportowa jest dobrze napisana, Twoje aplikacje nie muszą (mówiąc z punktu widzenia architektury kodu) martwić się o to, czy warstwa transportowa używa TCP czy UDP (wystarczy wspomnieć te dwa b/c najbardziej popularne na IP). Podczas gdy możesz wybrać jedną lub drugą w zależności od potrzeb w zakresie wydajności czasu lub potrzeba niezawodności (a w praktyce aplikacje często zakładają, który z nich jest uruchomiony), Twoja aplikacja nie musi mieć dokładnej wiedzy o tym, który z nich jest uruchomiony.

Ponieważ ta warstwa jest zbudowana na warstwie sieciowej, nie musimy się martwić o to, jak nasze dane przedostają się z Jednego Hosta do drugiego, jeśli są w różnych sieciach. Jeśli router obsługuje standardowy protokół routingu, rozszerzony o niektóre statycznie zdefiniowane trasy, nie musimy się tym martwić. Wszystkim zajmuje się warstwa sieci. Jeśli konfiguracja warstwy sieciowej zmieni się na serwerze, na którym pracujemy, nie ma to znaczenia. Nie musimy zmieniać całej naszej aplikacji, aby to uwzględnić.

Jak to pasuje do systemu:

Bardzo podobny do warstwy sieciowej, z tym, że zapewnia inną funkcjonalność niż warstwa sieciowa. Ponadto interfejsy te są używane bardziej w przestrzeni użytkownika niż interfejsy warstwy sieciowej. Jest to warstwa, która w rzeczywistości definiuje gniazda używane w sieciach TCP / IP.


Mam nadzieję, że to pomoże i zrozumiesz, dlaczego twoje pytanie jest trochę mylące dla większości z nas.

 19
Author: San Jacinto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Czy znasz model OSI ? bind() określa lokalny adres IP i port (warstwa 4) do użycia, więc gdy pakiet jest fizycznie wysyłany, określa ten adres IP jako nadawcę, a connect() określa zdalny adres IP i port do fizycznego umieszczenia w tych pakietach.

Na marginesie, wiele programów jest czystą "logiką" i tak naprawdę nie ma "fizycznego" znaczenia, chyba że przez "fizyczne" masz na myśli "szczegóły implementacji" , które różnią się w zależności od platformy na platformę. Jeśli pytasz o fizyczną implementację, czyli jak" znaczenie " jest przekształcane w sygnały elektryczne, prawdopodobnie będziesz szczęśliwszy jako inżynier komputerowy niż jako programista.

 4
Author: Sam Skuce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 18:02:12

Moje 2 grosze warte:

Gniazdo jest zasadniczo zgodne z source IP, source Port, destination IP i destination Port. (Fizycznie, to naprawdę nic, jest to koncepcja oparta na oprogramowaniu) w ten sposób System Operacyjny może określić, która aplikacja (poprzez numer portu) musi odbierać pakiety lub wysyła pakiety.

Stos sieciowy (model TCP / IP lub OSI) jest zaimplementowany w różny sposób w zależności od systemu operacyjnego. Jeśli chcesz dowiedzieć się więcej jak pakiety są przesyłane i przetwarzane w modelu OSI lub stosie TCP / IP. Dzięki temu dowiesz się, co dzieje się z informacjami, które pozostawiają aplikację do wysłania przez sieć.

SYSTEM OPERACYJNY zajmuje się obsługą pakietów, więc jeśli jesteś programistą, jak wspomniano wcześniej, zwykle nie interesują Cię te szczegóły.

Jeśli jesteś ciekawy i chcesz wiedzieć tak jak ja, proponuję zacząć i czytać. :)

 3
Author: Tony The Lion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 10:00:02