Jaka jest różnica między gniazdami (strumieniem) a gniazdami (datagramami)? Dlaczego warto korzystać z jednego na drugim?Jaka jest różnica między strumieniami i datagramami w programowaniu sieciowym?
Odpowiedz
Dawno temu czytałem świetną analogię do wyjaśnienia różnicy między tymi dwoma. Nie pamiętam, gdzie to czytałem, więc niestety nie mogę przyznać autorowi pomysłu, ale i tak dodałem do mojej rdzennej analogii sporo mojej wiedzy. Więc tutaj:
Gniazdo strumieniowe jest jak połączenie telefoniczne - jedna strona nawiązuje połączenie, inne odpowiedzi, przywitasz się ze sobą (SYN/ACK w TCP), a następnie wymieniasz informacje. Gdy skończysz, pożegnasz się (FIN/ACK w TCP). Jeśli jedna ze stron nie usłyszy pożegnania, zwykle wywoła drugą, ponieważ jest to nieoczekiwane zdarzenie; zazwyczaj klient ponownie łączy się z serwerem. Istnieje gwarancja, że dane nie dotrą w innej kolejności niż wysłana, i istnieje uzasadniona gwarancja, że dane nie zostaną uszkodzone.
Gniazdo datagramowe przypomina przekazywanie notatki w klasie. Rozważ 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 miejsca docelowego i może zostać zmodyfikowany do czasu, kiedy się tam dostanie. Jeśli przekażesz dwie notatki tej samej osobie, mogą pojawić się w zamówieniu, którego nie zamierzałeś, ponieważ trasa, którą przechodzą notatki w klasie, może nie być taka sama, jedna osoba może nie przesłać notatki tak szybko, jak inna, itd.
Używasz więc gniazda strumieniowego, gdy ważne są informacje w porządku i nienaruszone. Protokoły przesyłania plików są tutaj dobrym przykładem. Nie chcesz pobrać jakiegoś pliku z jego zawartością losowo przetasowaną i uszkodzoną!
Używałbyś gniazda datagramowego, gdy zamówienie jest mniej ważne niż dostarczanie w odpowiednim czasie (pomyśl o protokołach VoIP lub protokołach gier), gdy nie chcesz wyższego narzutów strumienia (dlatego DNS jest przede wszystkim protokołem datagramowym, aby serwery mogły szybko odpowiadać na wiele, wiele próśb) lub gdy nie obchodzi ich zbyt wiele, jeśli dane kiedykolwiek dotrą do miejsca przeznaczenia.
Aby rozwinąć w przypadku VoIP/gier, takie protokoły zawierają własny mechanizm zamawiania danych. Ale jeśli jeden pakiet jest uszkodzony lub zagubiony, nie chcesz czekać na protokół strumienia (zwykle TCP), aby wysłać żądanie ponownego wysłania - musisz szybko odzyskać. Aby odzyskać protokół TCP, może minąć kilka minut, a dla 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 z takiego zdarzenia, po prostu ignorując utracone dane lub ponownie żądając go wcześniej niż TCP.
VoIP jest dobrym kandydatem do po prostu ignorowania utraconych danych - jedna strona usłyszałaby tylko krótką przerwę, podobną do tego, co dzieje się podczas rozmowy z kimś na telefonie komórkowym, gdy ma słaby odbiór. Protokoły gier są często nieco bardziej skomplikowane, ale najczęściej podejmowane działania polegają albo na zignorowaniu brakujących danych (jeśli później odebrane dane zastępują dane, które zostały utracone), ponownym zażądaniu brakujących danych, albo zażądaniu pełnej aktualizacji stanu do upewnij się, że stan klienta jest zsynchronizowany z serwerem.
Stream Gniazdo:
- Dedykowane & punkt-punkt kanał między serwerem a klientem.
- Użyj protokołu TCP do transmisji danych.
- Niezawodny i bezstratny.
- Dane wysyłane/odbierane w podobnej kolejności.
- Dawno do odzyskiwania utraconych/dane błędne
Datagram socket:
- Nie dedykowany & punkt-punkt kanał między serwerem a klientem.
- Użyj UDP do transmisji danych.
- Nie jest w 100% niezawodny i może utracić dane.
- danych wysłanych/odebranych zamówienie nie może być taka sama
- Nie obchodzi mnie czy szybkiego odzyskiwania utraconych/dane błędne
- 1. Jaka jest różnica między http i https w programowaniu
- 2. Różnica między strumieniami w języku Java 8 i strumieniami równoległymi
- 3. Jaka jest różnica między? : i ||
- 4. Jaka jest różnica między $ i $$?
- 5. Jaka jest różnica między = i: = w mysql?
- 6. Jaka jest różnica między! = I =! w Javie?
- 7. Jaka jest różnica między 'i "w PHP
- 8. Jaka jest różnica między! i !! w yaml?
- 9. jaka jest różnica między @ i @@ w module?
- 10. Jaka jest różnica między * i. * W Matlab?
- 11. Jaka jest różnica między | i || w MATLAB?
- 12. Jaka jest różnica między * i * | * w CSS?
- 13. Jaka jest różnica między transmisją synchroniczną i asynchroniczną w programowaniu gniazd TCP/IP?
- 14. Jaka jest różnica między kopiowaniem a klonowaniem?
- 15. Jaka jest różnica między System.Windows.Controls.Control i System.Windows.Forms.Control?
- 16. Jaka jest różnica między asersem i static_assert?
- 17. Jaka jest różnica między PropertyChangeListener i VetoableChangeListener?
- 18. Jaka jest różnica między Ja i Ja?
- 19. Jaka jest różnica między ATL i WTL?
- 20. Jaka jest różnica między FontMetrics.stringWidth() i FontMetrics.getStringBounds()?
- 21. Jaka jest różnica między "CompletionStage" i "CompletableFuture"?
- 22. Jaka jest różnica między CellClick i CellMouseClick?
- 23. Jaka jest różnica między ObjectResult i JsonResult
- 24. Jaka jest różnica między ssize_t i ptrdiff_t?
- 25. Jaka jest różnica między fn i fn *?
- 26. Jaka jest różnica między getMeasuredHeight i getHeight
- 27. Jaka jest różnica między beginTrackingWithTouch i touchBegan?
- 28. Jaka jest różnica między init() i window.init()?
- 29. Jaka jest różnica między WCF i WPF?
- 30. Jaka jest różnica między SQLite i SQL
prostu super na tym szczegół SYNACK. – LazerSharks
Ten przykład, lub bardzo podobny, pochodzi z Linux Programming Interface. Wersja 2010 zawiera te przykłady na stronach 1155 i 1159. – Josh