2009-10-24 6 views
9

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

ответ

13

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

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

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

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

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

1

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

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

+0

, но возможно ли, что программа сначала увидит, что она имеет только 500 байтов, и через некоторое время она получит остальные 500 байт? – 2009-10-24 20:04:00

+0

а что, если мое сообщение размером в 1 миллион байт ... что тогда? (спасибо) – 2009-10-24 20:06:29

+0

Нет, это не так! – Charles

1

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

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

4

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

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

Однако реальный предел намного ниже, обычно безопасно принимать 512 байт. См. What is the largest Safe UDP Packet Size on the Internet.

+0

так что произойдет, если вы пытаетесь отправить 1024 байта? я получу ошибку при отправке или будет ли мое сообщение разбито на разные пакеты? (и порядок между ними?) – 2009-10-24 20:23:50

+0

512 минимально * безопасный * размер. 1024 может преуспеть. Или ошибка во время отправки в лучшем случае. Хуже того, пакет будет удален некоторым маршрутизатором в трафике, и вы никогда не узнаете. В UDP нет фрагментации и реконструкции, для чего нужен протокол TCP. –

+3

Ремус: Это неправильно. Фрагментация и повторная сборка выполняются на уровне IP, что означает, что она применяется к UDP. С UDP вы либо увидите, что вся датаграмма правильно собрана, когда она была отправлена, или вообще ничего. TCP дополнительно добавляет порядок и подтверждение/повторную передачу. – caf

1

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

+0

надеюсь, мы получим реализацию для Windows, чтобы ее можно было использовать в настольных приложениях для конечных пользователей – mbx