Jaka jest różnica między strumieniami a datagramami w programowaniu sieciowym?

132

Jaka jest różnica między gniazdami (strumień) a gniazdami (datagramami)? Po co używać jednego nad drugim?

RoR
źródło

Odpowiedzi:

307

Dawno temu przeczytałem świetną analogię wyjaśniającą różnicę między nimi. Nie pamiętam, gdzie go przeczytałem, więc niestety nie mogę przypisać autorowi tego pomysłu, ale i tak dodałem też sporo własnej wiedzy do podstawowej analogii. Więc oto idzie:

Gniazdo strumieniowe jest jak połączenie telefoniczne - jedna strona nawiązuje połączenie, druga odbiera, witacie się ze sobą (SYN / ACK w TCP), a następnie wymieniacie informacje. Gdy skończysz, żegnasz się (FIN / ACK w TCP). Jeśli jedna strona nie słyszy pożegnania, zwykle oddzwoni do drugiej, ponieważ jest to nieoczekiwane wydarzenie; zazwyczaj klient łączy się ponownie z serwerem. Istnieje gwarancja, że ​​dane nie dotrą w innej kolejności niż je wysłałeś, i istnieje rozsądna gwarancja, że ​​dane nie zostaną uszkodzone.

Gniazdo datagramowe jest jak przekazywanie notatki w klasie. Weź pod uwagę przypadek, w którym nie jesteś bezpośrednio obok osoby, do której przekazujesz notatkę; notatka będzie podróżować od osoby do osoby. Może nie dotrzeć do celu i może zostać zmodyfikowany, zanim tam dotrze. Jeśli przekażesz dwie notatki tej samej osobie, mogą one przyjść w kolejności, której nie zamierzałeś, ponieważ trasa, którą notatki pokonują w klasie, może nie być taka sama, jedna osoba może nie przekazać notatki tak szybko, jak inna itd. .

Więc używasz gniazda strumieniowego, gdy ważne jest, aby informacje były uporządkowane i nienaruszone. Dobrym przykładem są tutaj protokoły przesyłania plików. Nie chcesz pobierać jakiegoś pliku, którego zawartość jest losowo przetasowana i uszkodzona!

Używałbyś gniazda datagramowego, gdy kolejność jest mniej ważna niż terminowa dostawa (pomyśl o protokołach VoIP lub gier), gdy nie chcesz wyższego narzutu strumienia (dlatego DNS jest przede wszystkim protokołem datagramowym, więc serwery mogą bardzo szybko odpowiadać na wiele, wiele żądań naraz) lub gdy nie przejmujesz się zbytnio, czy dane kiedykolwiek dotrą do celu.

Aby rozszerzyć sprawę VoIP / gry, takie protokoły zawierają własny mechanizm porządkowania danych. Ale jeśli jeden pakiet zostanie uszkodzony lub utracony, nie chcesz czekać na protokół strumienia (zwykle TCP), aby wysłać żądanie ponownego wysłania - musisz szybko odzyskać. Przywrócenie TCP może zająć kilka minut, a w przypadku protokołów czasu rzeczywistego, takich jak gry lub VoIP, nawet trzy sekundy mogą być niedopuszczalne! Korzystanie z protokołu datagramowego, takiego jak UDP, pozwala oprogramowaniu bardzo szybko odzyskać dane po takim zdarzeniu, po prostu ignorując utracone dane lub wysyłając żądanie ponownie wcześniej niż TCP.

VoIP jest dobrym kandydatem do po prostu ignorowania utraconych danych - jedna ze stron usłyszyłaby po prostu krótką przerwę, podobną do tego, co dzieje się podczas rozmowy z kimś przez telefon komórkowy, gdy ma słaby odbiór. Protokoły gier są często nieco bardziej złożone, ale podejmowane działania zwykle polegają na zignorowaniu brakujących danych (jeśli otrzymane później dane zastępują dane, które zostały utracone), ponownym zażądaniu brakujących danych lub zażądaniu pełnej aktualizacji stanu do upewnij się, że stan klienta jest zsynchronizowany ze stanem serwera.

cdhowie
źródło
3
Po prostu wspaniały, jeśli chodzi o uwzględnienie szczegółów SYNACK.
LazerSharks
2
Ten przykład lub bardzo podobny pochodzi z The Linux Programming Interface. Wydanie z 2010 roku zawiera te przykłady na stronach 1155 i 1159.
Josh
31

Gniazdo strumieniowe:

  • Dedykowany i kompleksowy kanał między serwerem a klientem.
  • Użyj protokołu TCP do transmisji danych.
  • Niezawodny i bezstratny.
  • Dane wysłane / odebrane w podobnej kolejności.
  • Długi czas na odzyskanie utraconych / błędnych danych

Gniazdo datagramowe:

  • Niededykowany i kompleksowy kanał między serwerem a klientem.
  • Użyj protokołu UDP do transmisji danych.
  • Brak 100% niezawodności i może spowodować utratę danych.
  • Dane wysłane / otrzymane zamówienie mogą się różnić.
  • Nie przejmuj się ani szybkim odzyskiwaniem utraconych / błędnych danych.
Alejandro Blasco
źródło
Czy dane nie są przesyłane w tej samej kolejności (a nie tylko „podobne”)? to znaczy. to nie ma sensu budować mechanizm zamawiania pakietu do gniazda strumienia
Matthew D. Scholefield
Pakiety w komunikacji strumieniowej są wysyłane i odbierane w „podobnej” kolejności w tym sensie, że same pakiety NIE mają gwarancji, że zostaną dostarczone do hosta odbierającego w kolejności, ale TCP wykrywa rozbieżności, przestawiając pakiety w miarę ich nadejścia i żądając czegokolwiek wydaje się, że zaginęło po drodze.
Alejandro Blasco
To ma sens. Może po prostu usuń to jako różnicę i umieść to poniżej (ponieważ jeśli dobrze to rozumiem, odnosząc się tylko do kolejności, w jakiej pakiety są wysyłane, w obu przypadkach kolejność wysyłania / odbierania danych może nie być to samo).
Matthew D. Scholefield
@Rick Mówiąc dokładniej, gniazda są nazywane punktami końcowymi, ponieważ protokoły transportowe są odpowiedzialne za dostarczanie wiadomości do jednego lub wielu punktów końcowych sieci.
Alejandro Blasco
0

Jeśli chodzi o programowanie sieciowe, myślę, że rozpoczęcie od gniazd byłoby dobrym początkiem.
socket = ip + port
istnieją trzy typy
strumieni gniazd (TCP, gwarantowana kolejność i dostawa, brak duplikacji, brak granic długości i znaków dla danych, zorientowany na połączenie, niezawodny, współbieżny)
datagram (UDP, pakietowy, bezpołączeniowy, datagram limit rozmiaru, dane mogą zostać utracone lub zduplikowane, kolejność nie jest gwarantowana, niewiarygodne)
raw (bezpośredni dostęp do protokołów niższych warstw IP, ICMP)
Nie widzę ścisłej reguły dla typu protokołu transportowego, które gniazdo ma używać jakiego protokołu transportowego i niezawodności nie należy mylić, ponieważ UDP jest niezawodny w przypadku, gdy oba końce są aktywne.
Niezawodność odnosi się bardziej do niezawodności dostawy, ponieważ istnieją kontrole numerów sekwencyjnych przy użyciu protokołu TCP jako protokołu transportowego, którego nie ma w UDP. Lepiej jest używać analizatora protokołów sieciowych, takich jak wireshark tcpdump itp., Aby zobaczyć, co dokładnie robi oprogramowanie; rodzaj weryfikacji lub połączenia teorii na papierze z twoją pracą w akcji.

hakkican
źródło