Получение пакетов в UDP - PullRequest
9 голосов
/ 24 октября 2009

Допустим, моя программа отправляет 1000 байтов по сети (UDP). Гарантируется ли, что получатель получит 1000 байтов в одной «партии»? Или, возможно, ему нужно будет выполнить несколько чтений, пока он не получит все сообщение? если последнее верно, как я могу убедиться, что порядок пакетов для одного и того же сообщения не «перепутан» (по порядку), или, возможно, протокол это гарантирует? Редактировать : то есть возможно ли, что мое сообщение будет разбито на несколько пакетов? (что если я попытаюсь отправить сообщение размером 10000 МБ, что произойдет?)

Ответы [ 5 ]

13 голосов
/ 25 октября 2009

Вы получите все или ничего.

Но нет особой гарантии, что вы будете получать пакеты ровно один раз в порядке их передачи; потеря пакетов, переупорядочение и (реже) дублирование возможны.

Максимальный размер кадра (65 507 байт), при отправке () пакетов большего размера будет возвращена ошибка.

Вы должны предоставить достаточно буфера для приема всего кадра за один вызов.

UDP-пакеты МОГУТ быть фрагментированы на несколько IP-фрагментов, но ОС отбросит неполный пакет. Поэтому это прозрачно для приложения.

4 голосов
/ 25 октября 2009

Получатель получит весь пакет за один вызов. Длина пакета ограничена даже в теории :

Длина 16-битное поле, которое определяет длину в байтах всего датаграмма: заголовок и данные. Минимум длина составляет 8 байтов, так как это длина заголовка. Размер поля устанавливает теоретический предел 65 535 байт (8-байтовый заголовок + 65527 байт data) для дейтаграммы UDP. практический предел для длины данных который наложен базовым Протокол IPv4 составляет 65 507 байт.

Однако реальный предел намного ниже, обычно можно предположить 512 байт. См. Какой самый большой размер безопасного UDP-пакета в Интернете .

1 голос
/ 24 января 2010

С UDP Lite вы можете запросить получение частично поврежденных пакетов. Это может быть полезно для видео и услуг VoIP.

1 голос
/ 25 октября 2009

UDP, в отличие от TCP, не является надежным протоколом. Он не предоставляет встроенного механизма, который гарантировал бы, что пакеты прибывают в правильном порядке или даже прибывают вообще. Тем не менее, вы можете написать свои подпрограммы send / recv в виде шага блокировки, где каждый раз, когда пакет отправляется, отправитель должен ждать получения ACK, прежде чем отправить снова. Если ACK не получен после определенного времени ожидания, пакет должен быть повторно отправлен. Таким образом вы гарантируете, что пакеты получены в правильном порядке. (Для получения дополнительной информации посмотрите RFC для протокола TFTP , который использует эту стратегию.)

Наконец, если возможно, вы можете рассмотреть возможность использования TCP.

1 голос
/ 25 октября 2009

Данные, отправленные с использованием UDP, сгруппированы в пакеты , поэтому, если вы отправите х количество байтов, то, если получатель получит пакет, он получит х количество байтов.

Тем не менее, ваши пакеты могут даже не прийти, или они могут прийти не в порядке.

...