Gniazdo sieciowe

Gniazdo sieciowe to struktura oprogramowania w węźle sieciowym sieci komputerowej , która służy jako punkt końcowy do wysyłania i odbierania danych w sieci. Struktura i właściwości gniazda są definiowane przez interfejs programowania aplikacji (API) dla architektury sieciowej. Gniazda są tworzone tylko podczas życia procesu aplikacji działającej w węźle.

Ze względu na standaryzację protokołów TCP/IP w rozwoju Internetu , termin „ gniazdo sieciowe” jest najczęściej używany w kontekście zestawu protokołów internetowych i dlatego często jest również określany jako „ gniazdo internetowe” . W tym kontekście gniazdo jest zewnętrznie identyfikowane przez inne hosty na podstawie adresu gniazda , który jest triadą protokołu transportowego , adresu IP i numeru portu .

Termin gniazdo jest również używany w odniesieniu do punktu końcowego oprogramowania wewnętrznej komunikacji między procesami (IPC), która często korzysta z tego samego interfejsu API co gniazdo sieciowe.

Używać

Użycie terminu gniazdo w oprogramowaniu jest analogiczne do funkcji elektrycznego złącza żeńskiego , urządzenia sprzętowego do komunikacji między węzłami połączonymi kablem elektrycznym . Podobnie termin port jest używany w odniesieniu do zewnętrznych fizycznych punktów końcowych w węźle lub urządzeniu.

Interfejs programowania aplikacji (API) dla stosu protokołów sieciowych tworzy uchwyt dla każdego gniazda utworzonego przez aplikację, powszechnie nazywany deskryptorem gniazda . W systemach operacyjnych typu Unix ten deskryptor jest rodzajem deskryptora pliku . Jest on przechowywany przez proces aplikacji do wykorzystania przy każdej operacji odczytu i zapisu w kanale komunikacyjnym.

W momencie tworzenia za pomocą interfejsu API gniazdo sieciowe jest powiązane z kombinacją typu protokołu sieciowego, który ma być używany do transmisji, adresu sieciowego hosta i numeru portu . Porty to ponumerowane zasoby reprezentujące inny rodzaj struktury oprogramowania węzła. Są one używane jako typy usług, a po utworzeniu przez proces służą jako adresowalny zewnętrznie (z sieci) komponent lokalizacyjny, dzięki czemu inne hosty mogą nawiązywać połączenia.

Gniazda sieciowe mogą być przeznaczone do trwałych połączeń do komunikacji między dwoma węzłami lub mogą uczestniczyć w komunikacji bezpołączeniowej i multiemisji .

W praktyce, ze względu na rozpowszechnienie protokołów TCP/IP używanych w Internecie, termin gniazdo sieciowe zwykle odnosi się do używania z protokołem internetowym (IP). Dlatego często jest również nazywany gniazdem internetowym .

Adresy gniazd

Aplikacja może komunikować się ze zdalnym procesem, wymieniając dane z protokołem TCP/IP, znając kombinację typu protokołu, adresu IP i numeru portu. Ta kombinacja jest często nazywana adresem gniazda . Jest to skierowany do sieci uchwyt dostępu do gniazda sieciowego. Zdalny proces ustanawia gniazdo sieciowe we własnej instancji stosu protokołów i używa sieciowego interfejsu API do łączenia się z aplikacją, prezentując własny adres gniazda do użytku przez aplikację.

Realizacja

Stos protokołów , zwykle dostarczany przez system operacyjny (a nie na przykład jako oddzielna biblioteka), to zestaw usług, które umożliwiają procesom komunikację w sieci przy użyciu protokołów implementowanych przez stos. System operacyjny przekazuje ładunek nadchodzących pakietów IP do odpowiedniej aplikacji przez wyodrębnienie informacji o adresie gniazda z nagłówków IP i protokołów transportowych oraz usunięcie nagłówków z danych aplikacji.

Interfejs programowania aplikacji (API), którego programy używają do komunikacji ze stosem protokołów przy użyciu gniazd sieciowych, nosi nazwę gniazda API . Tworzenie aplikacji korzystających z tego interfejsu API nazywa się programowaniem gniazd lub programowaniem sieciowym . Interfejsy API gniazd internetowych są zwykle oparte na gniazd Berkeley . W standardzie gniazd Berkeley gniazda są formą deskryptora plików , ze względu na filozofię systemu Unix że „wszystko jest plikiem” oraz analogie między gniazdami a plikami. Oba mają funkcje odczytu, zapisu, otwierania i zamykania. W praktyce różnice obciążają analogię, a na gnieździe używane są różne interfejsy (wysyłanie i odbieranie). W komunikacji międzyprocesowej każdy koniec ma zwykle swoje własne gniazdo.

W standardowych protokołach internetowych TCP i UDP adres gniazda jest kombinacją adresu IP i numeru portu , podobnie jak jeden koniec połączenia telefonicznego jest kombinacją numeru telefonu i określonego numeru wewnętrznego . Gniazda nie muszą mieć adresu źródłowego, na przykład tylko do wysyłania danych, ale jeśli program powiąże gniazdo z adresem źródłowym, gniazdo może być używane do odbierania danych wysyłanych na ten adres. Na podstawie tego adresu gniazda internetowe dostarczają przychodzące pakiety danych do odpowiedniego procesu aplikacji .

Gniazdo często odnosi się konkretnie do gniazda internetowego lub gniazda TCP. Gniazdo internetowe charakteryzuje się minimalnie następującymi cechami:

  • lokalny adres gniazda, składający się z lokalnego adresu IP oraz (dla TCP i UDP, ale nie IP) numeru portu
  • protokół: Protokół transportowy, np. TCP, UDP, nieprzetworzony adres IP. Oznacza to, że (lokalne lub zdalne) punkty końcowe z portem TCP 53 i portem UDP 53 są odrębnymi gniazdami, podczas gdy protokół IP nie ma portów.
  • Gniazdo, które zostało połączone z innym gniazdem, np. podczas nawiązywania połączenia TCP, ma również zdalny adres gniazda.

Definicja

Rozróżnienia między gniazdem (reprezentacją wewnętrzną), deskryptorem gniazda (identyfikatorem abstrakcyjnym) i adresem gniazda (adresem publicznym) są subtelne i nie zawsze są rozróżniane w codziennym użytkowaniu. Ponadto określone definicje gniazda różnią się między autorami. W IETF Request for Comments , Internet Standards , w wielu podręcznikach, a także w tym artykule, termin gniazdo odnosi się do jednostki, która jest jednoznacznie identyfikowana przez numer gniazda. W innych podręcznikach termin gniazdo odnosi się do lokalnego adresu gniazda, tj. „kombinacji adresu IP i numeru portu”. W pierwotnej definicji gniazda podanej w RFC 147, odnoszącej się do sieci ARPA w 1971 r., „gniazdo jest określone jako 32-bitowa liczba z parzystymi gniazdami identyfikującymi gniazda odbiorcze i nieparzystymi gniazdami identyfikującymi gniazda wysyłające”. Jednak obecnie komunikacja przez gniazdo jest dwukierunkowa.

W systemie operacyjnym i aplikacji, która utworzyła gniazdo, gniazdo jest określane przez unikalną wartość całkowitą zwaną deskryptorem gniazda .

Narzędzia

W systemach operacyjnych typu Unix i Microsoft Windows narzędzia wiersza poleceń netstat lub ss są używane do wyświetlania utworzonych gniazd i powiązanych informacji.

Przykład

Ten przykład, modelowany zgodnie z interfejsem gniazda Berkeley, wysyła ciąg znaków „Witaj, świecie!” przez TCP do portu 80 hosta o adresie 1.2.3.4. Ilustruje tworzenie gniazda (getSocket), łączenie go ze zdalnym hostem, wysyłanie ciągu znaków i wreszcie zamykanie gniazda:

Socket mysocket = getSocket(type = "TCP") connect(mysocket, adres = "1.2.3.4", port = "80") send(mysocket, "Witaj, świecie!") close(mysocket)

typy

Dostępnych jest kilka rodzajów gniazd internetowych:

Gniazda datagramowe Gniazda
bezpołączeniowe , które używają protokołu UDP (User Datagram Protocol ). Każdy pakiet wysłany lub odebrany w gnieździe datagramowym jest indywidualnie adresowany i trasowany. Porządek i niezawodność nie są gwarantowane w przypadku gniazd datagramowych, więc wiele pakietów wysyłanych z jednej maszyny lub procesu do innej może dotrzeć w dowolnej kolejności lub może nie dotrzeć wcale. rozgłoszeń może być wymagana specjalna konfiguracja na gnieździe datagramowym. Aby odbierać pakiety rozgłoszeniowe, gniazdo datagramowe nie powinno być powiązane z określonym adresem, chociaż w niektórych implementacjach pakiety rozgłoszeniowe mogą być również odbierane, gdy gniazdo datagramowe jest powiązane z określonym adresem.
Gniazda strumieniowe Gniazda
zorientowane na połączenie , które wykorzystują protokół kontroli transmisji (TCP), protokół transmisji sterowania strumieniem (SCTP) lub protokół kontroli przeciążenia datagramów (DCCP). Gniazdo strumienia zapewnia sekwencjonowanie i unikalny przepływ bezbłędnych danych bez granic rekordów, z dobrze zdefiniowanymi mechanizmami tworzenia i niszczenia połączeń oraz raportowania błędów. Gniazdo strumieniowe przesyła dane niezawodnie , po kolei i z możliwościami poza pasmem . W Internecie gniazda strumieniowe są zazwyczaj implementowane przy użyciu protokołu TCP, dzięki czemu aplikacje mogą działać w dowolnej sieci korzystającej z protokołu TCP/IP.
Surowe gniazda
Umożliwiają bezpośrednie wysyłanie i odbieranie pakietów IP bez formatowania warstwy transportowej specyficznej dla protokołu. W przypadku innych typów gniazd ładunek jest automatycznie enkapsulowany zgodnie z wybranym protokołem warstwy transportowej (np. TCP, UDP), a użytkownik gniazda nie jest świadomy istnienia nagłówków protokołów, które są rozgłaszane z ładunkiem. Podczas czytania z surowego gniazda nagłówki są zwykle dołączane. Podczas przesyłania pakietów z surowego gniazda automatyczne dodawanie nagłówka jest opcjonalne.
Większość interfejsów programowania aplikacji (API), na przykład opartych na gniazdach Berkeley , obsługuje gniazda surowe. Windows XP został wydany w 2001 roku z obsługą surowych gniazd zaimplementowaną w Winsock interfejs, ale trzy lata później Microsoft ograniczył obsługę surowego gniazda Winsock ze względów bezpieczeństwa.
Surowe gniazda są używane w aplikacjach związanych z bezpieczeństwem, takich jak Nmap . Jednym z przypadków użycia surowych gniazd jest implementacja nowych protokołów warstwy transportowej w przestrzeni użytkownika . Gniazda surowe są zwykle dostępne w sprzęcie sieciowym i używane w protokołach routingu , takich jak Internet Group Management Protocol (IGMP) i Open Shortest Path First (OSPF), a także w Internet Control Message Protocol (ICMP) używany między innymi przez narzędzie ping .

Inne typy gniazd są implementowane w innych protokołach transportowych, takich jak Systems Network Architecture i gniazda domeny Unix do wewnętrznej komunikacji między procesami.

Stany gniazd w modelu klient-serwer

Procesy komputerowe świadczące usługi aplikacji nazywane są serwerami i podczas uruchamiania tworzą gniazda w stanie nasłuchiwania . Te gniazda czekają na inicjatywy ze strony klienckich .

Serwer TCP może obsługiwać kilku klientów jednocześnie, tworząc unikalne dedykowane gniazdo dla każdego połączenia klienta w nowym procesie potomnym lub wątku przetwarzania dla każdego klienta. Są one w stanie ustalonym , gdy ze zdalnym gniazdem ustanawiane jest połączenie wirtualne typu gniazdo-gniazdo lub obwód wirtualny (VC), znany również jako sesja TCP , zapewniając dupleksowy strumień bajtów .

Serwer może utworzyć kilka współbieżnie ustanowionych gniazd TCP z tym samym lokalnym numerem portu i lokalnym adresem IP, z których każde jest mapowane na własny proces potomny serwera, obsługujący własny proces klienta. Są one traktowane przez system operacyjny jako różne gniazda, ponieważ adres zdalnego gniazda (adres IP klienta lub numer portu) jest inny; tj. ponieważ mają różne par gniazd .

Gniazda UDP nie mają ustalonego stanu , ponieważ protokół jest bezpołączeniowy . Proces serwera UDP obsługuje przychodzące datagramy od wszystkich zdalnych klientów sekwencyjnie przez to samo gniazdo. Gniazda UDP nie są identyfikowane na podstawie adresu zdalnego, a jedynie adresu lokalnego, chociaż każda wiadomość ma powiązany adres zdalny, który można pobrać z każdego datagramu za pomocą interfejsu programowania aplikacji sieciowych (API).

Pary gniazd

Komunikujące się lokalne i zdalne gniazda nazywane są parami gniazd . Każda para gniazd jest opisana przez unikalną 4-krotkę składającą się ze źródłowych i docelowych adresów IP oraz numerów portów, tj. lokalnych i zdalnych adresów gniazd. Jak omówiono powyżej, w przypadku TCP para gniazd jest powiązana na każdym końcu połączenia z unikalną 4-krotką.

Historia

Termin gniazdo pochodzi z publikacji RFC 147 w 1971 roku, kiedy był używany w ARPANET. Większość współczesnych implementacji gniazd opiera się na gniazdach Berkeley (1983) i innych stosach, takich jak Winsock (1991). Interfejs API gniazd Berkeley w Berkeley Software Distribution (BSD) pochodzi z systemu operacyjnego Unix 4.2BSD jako interfejs API. Jednak dopiero w 1989 roku UC Berkeley mogło wypuścić wersje swojego systemu operacyjnego i biblioteki sieciowej wolne od ograniczeń licencyjnych AT&T Chroniony prawem autorskim Unix .

w ok. 1987, AT&T wprowadził interfejs warstwy transportowej (TLI) oparty na STREAMS w systemie UNIX System V Release 3 (SVR3). i kontynuowano w wydaniu 4 (SVR4).

Inne wczesne implementacje zostały napisane dla TOPS-20 , MVS , VM , IBM-DOS (PCIP).

Gniazda w sprzęcie sieciowym

Gniazdo jest przede wszystkim koncepcją stosowaną w warstwie transportowej zestawu protokołów internetowych lub warstwie sesyjnej modelu OSI . Urządzenia sieciowe, takie jak routery , które działają w warstwie internetowej i przełączniki , które działają w warstwie łącza , nie wymagają implementacji warstwy transportowej. Jednak stanowe zapory sieciowe , translatory adresów sieciowych i serwery proxy śledzą aktywne pary gniazd. W przełączniki wielowarstwowe i obsługa jakości usług (QoS) w routerach, przepływy pakietów mogą być identyfikowane poprzez wyodrębnianie informacji o parach gniazd.

Gniazda surowe są zwykle dostępne w sprzęcie sieciowym i są używane przez protokoły routingu , takie jak IGRP i OSPF , oraz przez Internet Control Message Protocol (ICMP).

Zobacz też

Dalsza lektura

  •   Jones, Anthony; Ohlund, Jim (2002). Programowanie sieciowe dla systemu Microsoft Windows . ISBN 0-7356-1579-9 .

Linki zewnętrzne