Допустим, моя программа отправляет 1000 байт по сети (UDP). Гарантируется ли, что получатель получит 1000 байт за один "пакет"? Или, возможно, ему нужно будет выполнить несколько «прочтений», пока он не получит все сообщение? если последнее верно, как я могу гарантировать, что порядок пакетов для одного и того же сообщения не "перепутается" (по порядку), или, возможно, протокол гарантирует это?
Редактировать: то есть возможно ли, что мое сообщение будет разбито на несколько пакетов? (что, если я попытаюсь отправить сообщение размером 10000 МБ, что тогда произойдет?)
Прием пакетов в UDP
Ответы (5)
Вы получите все или ничего.
Но нет особой гарантии, что вы получите пакеты ровно один раз в том порядке, в котором они были переданы; возможны потеря пакетов, переупорядочивание и (реже) дублирование.
Существует максимальный размер кадра (65 507 байт), отправка () пакетов большего размера вернет ошибку.
Вы должны предоставить достаточный буфер для приема всего кадра за один вызов.
UDP-пакеты МОГУТ быть фрагментированы на несколько IP-фрагментов, но ОС отбрасывает неполный пакет. Поэтому это прозрачно для приложения.
Получатель получит весь пакет за один вызов. Длина пакета ограничена даже в теории:
Длина 16-битное поле, указывающее длину в байтах всей дейтаграммы: заголовка и данных. Минимальная длина составляет 8 байт, так как это длина заголовка. Размер поля устанавливает теоретический предел в 65 535 байт (8 байтов заголовка + 65 527 байтов данных) для дейтаграммы UDP. Практический предел длины данных, налагаемый базовым протоколом IPv4, составляет 65 507 байт.
Однако реальный предел намного ниже, обычно можно с уверенностью предположить 512 байт. См. Каков самый большой размер безопасного пакета UDP на Интернет.
UDP, в отличие от TCP, не является надежным протоколом. Он не предоставляет встроенного механизма, гарантирующего, что пакеты прибывают в правильном порядке или вообще прибывают. Тем не менее, вы можете написать свои подпрограммы отправки/получения в виде шага блокировки, где каждый раз, когда пакет отправляется, отправитель должен ждать получения ACK перед повторной отправкой. Если ACK не получен по истечении заданного тайм-аута, пакет необходимо отправить повторно. Таким образом вы гарантируете, что пакеты будут получены в правильном порядке. (Для получения дополнительной информации ознакомьтесь с RFC для протокола TFTP, в котором используется эта стратегия. .)
Наконец, если возможно, вы можете вместо этого рассмотреть возможность использования TCP.
Данные, отправляемые с использованием UDP, группируются в пакеты, поэтому, если вы отправляете x количество байтов затем, ЕСЛИ получатель получит пакет, он получит x байтов.
Однако ваши пакеты могут даже не приходить или приходить не по порядку.
С помощью UDP Lite вы можете запросить получение частично поврежденных пакетов. Это может быть полезно для видео и услуг VoIP.