Gniazdo sieciowe - Network socket

Gniazdko sieciowe jest strukturą oprogramowania obrębie węzła sieci z siecią komputerową , która służy jako punkt końcowy dla wysyłania i odbierania danych przez sieć. Struktura i właściwości gniazda są definiowane przez interfejs programowania aplikacji (API) dla architektury sieci. Gniazda są tworzone tylko w okresie istnienia 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 dla innych hostów przez jego adres gniazda , który jest triadą protokołu transportowego , adresu IP i numeru portu .

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

Posługiwać się

Użycie terminu gniazdo w oprogramowaniu jest analogiczne do funkcji elektrycznego złącza żeńskiego , sprzętowego urządzenia do komunikacji między węzłami połączonymi kablem elektrycznym . Podobnie termin port jest używany dla 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 określanego jako deskryptor gniazda . W systemach operacyjnych podobnych do Uniksa 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ą 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, które reprezentują inny typ struktury oprogramowania węzła. Są one używane jako typy usług i po utworzeniu przez proces służą jako zewnętrznie (z sieci) adresowalny komponent lokalizacji, dzięki czemu inne hosty mogą nawiązywać połączenia.

Gniazda sieciowe mogą być dedykowane 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 korzystania z protokołu internetowego (IP). Dlatego często nazywa się je również 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 uchwyt dostępu do gniazda sieciowego skierowany do sieci. 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życia przez aplikację.

Realizacja

Stos protokołu , zazwyczaj świadczone przez system operacyjny (a nie jako oddzielne biblioteki, na przykład), to zestaw usług, które umożliwiają komunikację procesów przez sieć z wykorzystaniem protokołu, że narzędzia robocze stos. System operacyjny przekazuje ładunek przychodzących pakietów IP do odpowiedniej aplikacji, wyodrębniając informacje o adresie gniazda z nagłówków protokołu IP i protokołu transportowego oraz usuwając nagłówki z danych aplikacji.

Interfejs programowania aplikacji (API), które programy wykorzystują do komunikowania się ze stosu protokołów, używając gniazd sieciowych, nazywa się gniazdo API . Tworzenie aplikacji wykorzystujących ten interfejs API jest nazywane programowaniem gniazd lub programowaniem sieciowym . Interfejsy API gniazd internetowych są zwykle oparte na standardzie gniazd Berkeley . W standardzie gniazd Berkeley gniazda są formą deskryptora pliku , ze względu na filozofię Uniksa, że "wszystko jest plikiem" oraz analogie między gniazdami a plikami. Oba mają funkcje czytania, pisania, otwierania i zamykania. W praktyce różnice obciążają analogię, a w 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 konkretnego 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. Gniazdko 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, surowe IP. Oznacza to, że (lokalne lub zdalne) punkty końcowe z portem TCP 53 i portem UDP 53 są odrębnymi gniazdami, podczas gdy IP nie ma portów.
  • Gniazdo, które zostało połączone z innym gniazdem, np. podczas nawiązywania połączenia TCP, również ma adres gniazda zdalnego.

Definicja

Różnice między gniazdem (reprezentacja wewnętrzna), deskryptorem gniazda (identyfikatorem abstrakcyjnym) i adresem gniazda (adresem publicznym) są subtelne i nie zawsze są rozróżniane w codziennym użyciu. Co więcej, poszczególne 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 roku, „gniazdo jest określone jako liczba 32-bitowa z parzystymi gniazdami identyfikującymi gniazda odbiorcze i nieparzystymi gniazdami identyfikującymi gniazda nadawcze”. Obecnie jednak komunikacja przez gniazda 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 "Hello, world!" przez TCP do portu 80 hosta o adresie 1.2.3.4. Obrazuje tworzenie gniazda (getSocket), podłączenie go do zdalnego hosta, przesłanie ciągu, a na koniec zamknięcie gniazda:

Socket mysocket = getSocket(type = "TCP")
connect(mysocket, address = "1.2.3.4", port = "80")
send(mysocket, "Hello, world!")
close(mysocket)

Rodzaje

Dostępnych jest kilka rodzajów gniazd internetowych:

Gniazda datagramowe
Gniazda bezpołączeniowe korzystające z protokołu UDP ( User Datagram Protocol ). Każdy pakiet wysłany lub odebrany w gnieździe datagramowym jest indywidualnie adresowany i trasowany. Gniazda datagramowe nie gwarantują porządku i niezawodności, więc wiele pakietów wysyłanych z jednej maszyny lub procesu do drugiej może dotrzeć w dowolnej kolejności lub wcale. Do wysyłania rozgłoszeń w gnieździe datagramowym może być wymagana specjalna konfiguracja . 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 sekwencyjny i unikalny przepływ danych bez błędów bez granic rekordów, z dobrze zdefiniowanymi mechanizmami tworzenia i niszczenia połączeń oraz zgłaszania błędów. Gniazdo strumienia przesyła dane niezawodnie , w kolejności i z możliwościami pozapasmowymi . W Internecie gniazda strumieniowe są zazwyczaj implementowane przy użyciu protokołu TCP, dzięki czemu aplikacje mogą działać w dowolnych sieciach przy użyciu protokołu TCP/IP.
Gniazda surowe
Zezwalaj na bezpośrednie wysyłanie i odbieranie pakietów IP bez formatowania warstwy transportowej specyficznego dla protokołu. W przypadku innych typów gniazd ładunek jest automatycznie hermetyzowany zgodnie z wybranym protokołem warstwy transportowej (np. TCP, UDP), a użytkownik gniazda nie jest świadomy istnienia nagłówków protokołu, które są rozgłaszane z ładunkiem. Podczas odczytu z surowego gniazda zwykle uwzględniane są nagłówki. Podczas przesyłania pakietów z surowego gniazda automatyczne dodawanie nagłówka jest opcjonalne.
Większość interfejsów programowania aplikacji (API) z gniazdami , na przykład te oparte na gniazdach Berkeley , obsługuje gniazda surowe. Windows XP został wydany w 2001 roku z obsługą surowych gniazd zaimplementowanych w interfejsie Winsock , ale trzy lata później Microsoft ograniczył obsługę surowych gniazd w Winsock ze względów bezpieczeństwa.
Gniazda surowe 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ą zazwyczaj dostępne w sprzęcie sieciowym i są używane w protokołach routingu, takich jak Internet Group Management Protocol (IGMP) i Open Shortest Path First (OSPF) oraz w Internet Control Message Protocol (ICMP) używanym między innymi przez narzędzie ping .

Inne typy gniazd są implementowane przez inne protokoły transportowe, takie jak Systems Network Architecture i gniazda domeny Unix do wewnętrznej komunikacji między procesami.

Stany gniazd w modelu klient-serwer

Procesy komputerowe udostępniające usługi aplikacji nazywane są serwerami i podczas uruchamiania tworzą gniazda, które są w stanie nasłuchiwania . Te gniazda czekają na inicjatywy z programów 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 ustanowienia, gdy połączenie wirtualne gniazdo-gniazdo lub obwód wirtualny (VC), znany również jako sesja TCP , zostaje nawiązany ze zdalnym gniazdem, zapewniając dupleksowy strumień bajtów .

Serwer może utworzyć kilka jednocześnie ustanowionych gniazd TCP o tym samym lokalnym numerze portu i lokalnym adresie IP, z których każde jest odwzorowane 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 gniazda zdalnego (adres IP klienta lub numer portu) jest inny; tj. ponieważ mają różne krotki 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 przez adres zdalny, ale tylko przez adres lokalny, chociaż każdy komunikat ma skojarzony adres zdalny, który można pobrać z każdego datagramu za pomocą sieciowego interfejsu programowania aplikacji (API).

Pary gniazd

Komunikujące się gniazda lokalne i zdalne nazywane są parami gniazd . Każda para gniazd jest opisana przez unikalną 4-krotkę składającą się ze źródłowego i docelowego adresu 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 to był używany w ARPANET. Większość nowoczesnych implementacji gniazd jest oparta na gniazdach Berkeley (1983) i innych stosach, takich jak Winsock (1991). Berkeley Sockets API w Berkeley Software Distribution (BSD) wywodzi się z systemu operacyjnego 4.2BSD Unix jako API. Jednak dopiero w 1989 roku UC Berkeley mogło wydać wersje swojego systemu operacyjnego i biblioteki sieciowej wolne od ograniczeń licencyjnych związanych z chronionym prawem autorskim Uniksem AT&T .

W ok. 1987, AT & T wprowadzeniem STRUMIENIE -na warstwę transportową interfejsu (TLI) w System V wydanie 3 (SRV3). i kontynuowano w wersji 4 (SVR4).

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

Gniazda w sprzęcie sieciowym

Gniazdo to przede wszystkim pojęcie używane w warstwie transportowej z protokołu internetowego łazienką lub sesji warstwy w modelu OSI . Sprzęt sieciowy, taki jak routery , które działają w warstwie internetowej , oraz 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łącznikach wielowarstwowych i obsłudze jakości usług (QoS) w routerach przepływy pakietów mogą być identyfikowane przez wydobycie informacji o parach gniazd.

Gniazda surowe są zazwyczaj dostępne w sprzęcie sieciowym i są używane w protokołach routingu, takich jak IGRP i OSPF oraz w protokole ICMP ( Internet Control Message Protocol ).

Zobacz też

Bibliografia

Dalsza lektura

Linki zewnętrzne