Объединение пакетов UDP?

Есть ли какое-либо преимущество в объединении нескольких пакетов UDP в один, а не в отправке их всех один за другим? Я знаю, что если большой пакет будет поврежден, я потеряю их все, но есть ли какие-то преимущества в отправке их всех в одном? например, более низкая вероятность того, что большой будет потерян?


person Lauer    schedule 09.10.2012    source источник
comment
udp - это лучший протокол. занятые маршрутизаторы могут решить отбросить большой пакет udp, в то время как маленький пакет может проскользнуть через перерыв в трафике. никаких гарантий в любом случае.   -  person Marc B    schedule 09.10.2012
comment
Я бы дал этот лучший ответ, если бы это не был комментарий   -  person Lauer    schedule 09.10.2012


Ответы (4)


Это будет на усмотрение отправляющего приложения.

Обратите внимание, что ваш большой пакет ограничен MTU базовой сети. например теоретический размер пакета UDP составляет 64 КБ, но кадр Ethernet составляет всего ~ 1500 байт. Так что я подозреваю, что это не практическая функция.

person Brian Agnew    schedule 09.10.2012
comment
Теоретический максимальный размер полезной нагрузки пакета IPv4 UDP составляет 65535-20-8, вычитая сначала заголовок IP, а затем заголовок UDP, что дает 65509 байт. - person user207421; 11.10.2012

Как правило, сетевые каналы будут ограничены скоростью пакетов, которые могут быть отправлены в секунду. Таким образом, если вы хотите отправлять миллионы сообщений в секунду, вы, как правило, хотите объединить их в меньшее количество пакетов, чтобы работать без значительной потери пакетов.

В качестве чрезмерного обобщения Windows не любит> 10 000 пакетов в секунду для UDP, но вы можете насытить гигабитную сеть пакетами с большим MTU.

person Steve-o    schedule 09.10.2012

Есть ли какое-либо преимущество в объединении нескольких пакетов UDP в один, а не в отправке их всех один за другим?

Можно сэкономить на заголовке UDP, который составляет 8 байтов на дейтаграмму, что уменьшает объем данных, отправляемых по сети. Просто убедитесь, что вы не отправляете больше, чем MTU без размеров заголовков IP и UDP, чтобы избежать фрагментации на уровне IP.

Кроме того, стандартный API сокетов POSIX требует одного системного вызова send/sendto/sendmsg() для отправки или получения одной дейтаграммы, поэтому, отправляя меньше дейтаграмм, выполняется меньше системных вызовов, что снижает общую задержку (порядка нескольких микросекунд на вызов). Ядра Linux, начиная с 3.0, предоставляют sendmsg() и recvmmsg() для отправки и получения нескольких дейтаграмм в одном системном вызове.

Я знаю, что если большой пакет будет поврежден, я потеряю все

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

person Maxim Egorushkin    schedule 09.10.2012

Это важно для ситуаций, когда размер пакета небольшой (менее 100 байт). Заголовок IP/UDP имеет размер не менее 28 байт.

Представьте, что у вас есть потоковое соединение с сервером, каждый пакет содержит 50 байт, и ваше программное обеспечение отправляет пакеты со скоростью 1000 пакетов в секунду.

Фактическая полезная нагрузка: 1000 * 50 bytes = 50000 bytes. Заголовки 1000 * 28 = 28000 bytes Всего байтов: 50000 + 28000 = 87000 ==> 87 KBps

Представьте, что вы можете объединить каждые 3 пакета UDP в один пакет:

Служебные заголовки 1000 / 3 * 28 = 9333 Всего байтов: 50000 + 9333 ===> 60 KBps

Это - в некоторых приложениях - экономит значительную часть полосы пропускания.

person ItsMe    schedule 11.11.2014