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

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

Author: cdhowie, 2011-01-14

3 answers

Dawno temu czytałem wielką analogię do wyjaśnienia różnicy między nimi. Nie pamiętam, gdzie to przeczytałem, więc niestety nie mogę przypisać autorowi pomysłu, ale i tak dodałem sporo własnej wiedzy do podstawowej analogii. No to zaczynamy:

Gniazdo strumieniowe jest jak połączenie telefoniczne - jedna strona umieszcza połączenie, druga odpowiada, witasz się ze sobą (SYN / ACK w TCP), a następnie wymieniasz informacje. Kiedy skończysz, mówisz Żegnaj (FIN / ACK w TCP). Jeśli jedna strona nie usłyszy pożegnania, Zwykle oddzwoni do drugiej, ponieważ jest to nieoczekiwane wydarzenie; Zwykle klient ponownie połączy się z serwerem. Istnieje gwarancja, że dane nie dotrą w innej kolejności niż wysłane przez Ciebie i istnieje uzasadniona gwarancja, że dane nie zostaną uszkodzone.

Gniazdo datagramów jest jak przekazanie notatki w klasie. Rozważ przypadek, gdy nie jesteś bezpośrednio obok osoby, której przekazujesz notatkę; notatka będzie podróżować od osoby do osoby. Może nie dotrzeć do celu i może zostać zmodyfikowany do czasu, gdy tam dotrze. Jeśli przekażesz dwie notatki tej samej osobie, mogą one dotrzeć w kolejności, której nie zamierzałeś, ponieważ trasa, którą notatki przechodzą przez klasę, może nie być taka sama, jedna osoba może nie przekazać notatki tak szybko, jak inna itp.

Więc używasz gniazda strumienia, gdy ważne jest, aby informacje były w porządku i nienaruszone. Dobrym przykładem są tutaj protokoły transferu plików. Nie chcesz Pobierz jakiś plik z jego zawartością losowo przetasowane i uszkodzone!

Używasz gniazda datagramowego, gdy zamówienie jest mniej ważne niż terminowe dostarczenie (pomyśl o protokołach VoIP lub gier), gdy nie chcesz mieć większego obciążenia strumienia (dlatego DNS jest przede wszystkim protokołem datagramów, dzięki czemu serwery mogą reagować na wiele, wiele żądań na raz bardzo szybko), lub gdy nie dbasz zbytnio o to, czy dane dotrą do celu.

Aby rozszerzyć sprawę VoIP/gry, takie protokoły zawierają własny mechanizm zamawiania danych. Ale jeśli jeden pakiet jest uszkodzony lub utracony, nie chcesz czekać na protokole stream (Zwykle TCP), aby wysłać żądanie ponownego wysłania -- musisz szybko odzyskać. Odzyskanie TCP może zająć do pewnej liczby minut, a w przypadku protokołów czasu rzeczywistego, takich jak gry lub VoIP, nawet trzy sekundy mogą być nie do przyjęcia! Korzystanie z protokołu datagramowego, takiego jak UDP, pozwala oprogramowaniu bardzo szybko odzyskać dane po takim zdarzeniu, po prostu ignorując utracone dane lub ponowne żądanie tego wcześniej niż TCP.

VoIP jest dobrym kandydatem do ignorowania utraconych danych . jedna strona usłyszy tylko krótką lukę, podobną do tego, co dzieje się podczas rozmowy z kimś przez telefon komórkowy, gdy ma słaby zasięg. Protokoły gier są często nieco bardziej złożone, ale podejmowane działania zazwyczaj polegają na ignorowaniu brakujących danych (Jeśli następnie odebrane dane zastępują utracone dane), ponownym żądaniu brakujących danych lub żądaniu pełnego stanu zaktualizuj, aby upewnić się, że stan klienta jest zsynchronizowany z serwerem.

 311
Author: cdhowie,
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
2013-04-29 13:47:27

Stream Socket:

  • dedykowany kanał między serwerem a klientem.
  • Użyj protokołu TCP do transmisji danych.
  • Niezawodne i bezstratne.
  • Dane wysłane/odebrane w podobnej kolejności.
  • długi czas odzyskiwania utraconych / błędnych danych

Gniazdo Datagramowe:

  • nie dedykowany & end-to-end kanał między serwerem a klientem.
  • Użyj UDP do transmisji danych.
  • Nie w 100% wiarygodny i może stracić data.
  • Dane wysłane / odebrane zamówienie mogą nie być takie same.
  • nie dbaj o to lub szybkie odzyskiwanie utraconych / błędnych danych.
 31
Author: Alejandro Blasco,
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
2019-05-23 10:04:52

Jeśli chodzi o programowanie sieciowe, myślę, że start z gniazd byłby dobrym początkiem.
socket = ip + port
istnieją trzy rodzaje gniazd
stream (TCP, order and delivery guaranteed, no duplikation, no length or char boundaries for data,connection-oriented, reliable, concurrency)
datagram (UDP, packet-based, connectionless, limit rozmiaru datagramu, dane mogą być utracone lub zduplikowane,kolejność nie jest gwarantowana, nie jest niezawodna)
raw (bezpośredni dostęp do protokołów niższych warstw IP, ICMP)
Nie widzę żadnej surowej reguły dla typu protokołu transportowego co do tego, jakie gniazdo ma używać jaki protokół transportowy i niezawodność nie powinna być mylona, ponieważ UDP jest realne w przypadku, gdy oba końce są aktywne.
Niezawodność odnosi się bardziej do niezawodności dostawy, ponieważ istnieją kontrole numerów sekwencyjnych za pomocą TCP jako protokołu transportowego, które nie istnieją w UDP.It lepiej jest używać analizatora protokołów sieciowych, takiego jak wireshark tcpdump itp., aby zobaczyć, co dokładnie robi twoje oprogramowanie; rodzaj weryfikacji lub połączenie teorii na papierze z pracą w działaniu.

 0
Author: hakkican,
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
2019-06-01 16:56:21