В чем разница между потоками и дейтаграммами в сетевом программировании?

StackOverflow https://stackoverflow.com/questions/4688855

Вопрос

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

Это было полезно?

Решение

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

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

Гребень DataGRAM - это как прохождение заметки в классе. Рассмотрим случай, когда вы не находитесь прямо рядом с человеком, с которым вы передаете заметку; Примечание будет перемещаться от человека к человеку. Он может не достичь своего пункта назначения, и к тому времени, когда он туда попал. Если вы передадите две ноты одному и тому же человеку, он может прийти в приказ, который вы не собираетесь Анкет

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

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

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

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

Другие советы

Поток розетка:

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

Сокет DataGRAM:

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

Если бы это сетевое программирование, я думаю, что начнем с сокетов было бы хорошим началом.
сокет = ip + порт
Есть три типа гнезда
Поток (TCP, гарантировано заказ и доставка, без дублирования, без границ длины или символов для данных, ориентированное на соединение, надежное, параллелизм)
Datagram (UDP, пакетный, без соединения, ограничение размера DataGram, данные могут быть потеряны или дублированы, заказ не гарантирован, не надежный)
RAW (прямой доступ к протоколам нижнего уровня IP, ICMP)
Я не вижу какого -либо строгого правила для типа транспортного протокола относительно того, какой сокет должен использовать какой транспортный протокол и надежность не следует ошибаться, потому что UDP является реальным, если оба конца активны.
Надежность относится к большей как надежность доставки, поскольку существуют проверки номеров последовательностей с помощью TCP в качестве транспортного протокола, который не существует в UDP. Лучше использовать анализатор сетевого протокола, такой как Wireshark Tcpdump и т. Д., Чтобы увидеть, что именно ваше программное обеспечение; Вид проверки или теории слияния в статье с вашей работой в действии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top