Вопрос

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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