В чем разница между потоками и датаграммами в сетевом программировании? - PullRequest
120 голосов
/ 14 января 2011

В чем разница между сокетами (потоком) и сокетами (датаграммами)?Зачем использовать один над другим?

Ответы [ 3 ]

285 голосов
/ 14 января 2011

Давным-давно я прочитал замечательную аналогию для объяснения различий между ними. Я не помню, где я его читал, поэтому, к сожалению, я не могу отдать должное автору за идею, но я все равно добавил много своих собственных знаний в основную аналогию. Итак, вот так:

Потоковая розетка похожа на телефонный звонок - одна сторона отвечает на вызов, другая отвечает, вы здороваетесь друг с другом (SYN / ACK в TCP), а затем вы обмениваетесь информацией. Когда вы закончите, вы попрощаетесь (FIN / ACK в TCP). Если одна сторона не слышит прощания, она обычно перезванивает другой, так как это неожиданное событие; обычно клиент переподключается к серверу. Существует гарантия того, что данные не будут доставлены в другом порядке, чем вы их отправили, и есть разумная гарантия того, что данные не будут повреждены.

Сокет датаграммы похож на передачу заметки в классе. Рассмотрим случай, когда вы не находитесь непосредственно рядом с человеком, которому вы передаете записку; заметка будет путешествовать от человека к человеку. Возможно, он не достигнет своего пункта назначения и может быть изменен к тому времени, когда он туда доберется. Если вы передадите две заметки одному и тому же человеку, они могут поступить в том порядке, который вы не намеревались, поскольку маршрут, по которому проходят заметки через классную комнату, может не совпадать, один человек может пропустить заметку не так быстро, как другой, и т. Д. .

Таким образом, вы используете потоковый сокет, когда важно иметь информацию в порядке и нетронутой. Протоколы передачи файлов являются хорошим примером здесь. Вы не хотите загружать какой-либо файл с его содержимым, случайно перемешанным и поврежденным!

Вы бы использовали сокет дейтаграммы, когда порядок менее важен, чем своевременная доставка (например, протоколы VoIP или игровые протоколы), когда вы не хотите более высоких издержек потока (именно поэтому DNS является в первую очередь протоколом дейтаграмм, поэтому эти серверы могут отвечать на множество запросов одновременно очень быстро) или когда вас не слишком волнует, когда данные когда-либо достигнут пункта назначения.

Для расширения возможностей VoIP / игр такие протоколы включают в себя собственный механизм упорядочения данных. Но если один пакет поврежден или потерян, вам не нужно ждать, пока потоковый протокол (обычно TCP) выдаст запрос на повторную отправку - вам нужно быстро восстановиться. Для восстановления TCP может потребоваться некоторое количество минут, а для протоколов реального времени, таких как игры или VoIP, даже три секунды могут оказаться неприемлемыми! Использование протокола дейтаграмм, такого как UDP, позволяет программному обеспечению очень быстро восстанавливаться после такого события, просто игнорируя потерянные данные или повторно запрашивая их раньше, чем TCP.

VoIP является хорошим кандидатом для простого игнорирования потерянных данных - одна сторона просто услышит короткий разрыв, аналогичный тому, что происходит при разговоре с кем-то по мобильному телефону, когда у них плохой прием. Игровые протоколы часто немного сложнее, но обычно предпринимаются следующие действия: либо игнорировать отсутствующие данные (если полученные впоследствии данные заменяют потерянные), либо повторно запрашивать отсутствующие данные или запрашивать полное обновление состояния для убедитесь, что состояние клиента синхронизировано с состоянием сервера.

26 голосов
/ 30 апреля 2014

Потоковое гнездо:

  • Выделенный и сквозной канал между сервером и клиентом.
  • Использование протокола TCP для передачи данных.
  • Надежный и без потерь.
  • Данные отправляются / принимаются в аналогичном порядке.
  • Долгое время для восстановления потерянных / ошибочных данных

Гнездо дейтаграммы:

  • Не выделенный и сквозной канал между сервером и клиентом.
  • Использовать UDP для передачи данных.
  • Не надежен на 100% и может потерять данные.
  • Данные отправлены /полученный заказ может не совпадать.
  • Не волнует или быстро восстанавливает потерянные / ошибочные данные.
0 голосов
/ 01 июня 2019

Если это сетевое программирование, думаю, было бы неплохо начать с сокетов.
socket = ip + port
есть три типа сокетов
stream (TCP, заказ и доставка гарантированы, нетдублирование, отсутствие длины или границ символов для данных, ориентированные на соединение, надежные, параллелизм)
датаграмма (UDP, на основе пакетов, без установления соединения, ограничение размера датаграммы, данные могут быть потеряны или дублированы, порядок не гарантирован, не надежен)
raw (прямой доступ к протоколам нижнего уровня IP, ICMP)
Я не вижу строгого правила для типа транспортного протокола относительно того, какой сокет должен использовать, какой транспортный протокол и надежность не должны ошибаться, потому что UDP является реальным в случаеоба конца активны.
Надежность относится больше к надежности доставки, поскольку существуют проверки порядкового номера с использованием TCP в качестве транспортного протокола, которого нет в UDP. Лучше использовать анализатор сетевых протоколов, например, wireshark tcpdump и т. д.программное обеспечение точно делает;своего рода проверка или слияние теории на бумаге с вашей работой в действии.

...