Есть ли какое-либо преимущество в объединении нескольких пакетов UDP в один, а не в отправке их всех один за другим? Я знаю, что если большой пакет будет поврежден, я потеряю их все, но есть ли какие-то преимущества в отправке их всех в одном? например, более низкая вероятность того, что большой будет потерян?
Объединение пакетов UDP?
Ответы (4)
Это будет на усмотрение отправляющего приложения.
Обратите внимание, что ваш большой пакет ограничен MTU базовой сети. например теоретический размер пакета UDP составляет 64 КБ, но кадр Ethernet составляет всего ~ 1500 байт. Так что я подозреваю, что это не практическая функция.
Как правило, сетевые каналы будут ограничены скоростью пакетов, которые могут быть отправлены в секунду. Таким образом, если вы хотите отправлять миллионы сообщений в секунду, вы, как правило, хотите объединить их в меньшее количество пакетов, чтобы работать без значительной потери пакетов.
В качестве чрезмерного обобщения Windows не любит> 10 000 пакетов в секунду для UDP, но вы можете насытить гигабитную сеть пакетами с большим MTU.
Есть ли какое-либо преимущество в объединении нескольких пакетов UDP в один, а не в отправке их всех один за другим?
Можно сэкономить на заголовке UDP, который составляет 8 байтов на дейтаграмму, что уменьшает объем данных, отправляемых по сети. Просто убедитесь, что вы не отправляете больше, чем MTU без размеров заголовков IP и UDP, чтобы избежать фрагментации на уровне IP.
Кроме того, стандартный API сокетов POSIX требует одного системного вызова send/sendto/sendmsg()
для отправки или получения одной дейтаграммы, поэтому, отправляя меньше дейтаграмм, выполняется меньше системных вызовов, что снижает общую задержку (порядка нескольких микросекунд на вызов). Ядра Linux, начиная с 3.0, предоставляют sendmsg()
и recvmmsg()
для отправки и получения нескольких дейтаграмм в одном системном вызове.
Я знаю, что если большой пакет будет поврежден, я потеряю все
Истинный. Однако, если протокол вообще не может справиться с потерей дейтаграммы UDP, это может не иметь большого значения - как только одна дейтаграмма потеряна, она все равно сломана.
Это важно для ситуаций, когда размер пакета небольшой (менее 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
Это - в некоторых приложениях - экономит значительную часть полосы пропускания.