Я планирую отправлять большие объемы данных через UDP (потоковое видео), и я подумал о системе, которая должна определять, когда интерфейс достиг максимальной полосы пропускания загрузки.

Я знаю, что когда я сбрасываю выходные данные в сокет, он блокируется до тех пор, пока не будет очищен буфер, но почему сокет блокируется? Отправка большего, чем полоса загрузки, является одним из этих ограничений? Я имею в виду, например, мгновенно отправляю 100 Кбайт данных через сокет; скорость загрузки 10 кбит / с блокирует сокет за 10 секунд? Или он будет сброшен на другой интерфейс (скажем, на маршрутизатор) и вернется, хотя данные не были отправлены в Интернет?

Помните, что мы говорим о UDP, поэтому никаких ACK.

2 ответа2

2

Есть пропускная способность Вашего сервера и пропускная способность маршрутизатора. Ваш сервер будет посылать данные так же быстро, как он может поместить их на провод своего интерфейса (блоки UDP, когда буфер сокета на сервере заполнен).

Насколько я знаю, маршрутизатор будет отбрасывать лишние пакеты (как именно они будут выбраны, зависит от ОС маршрутизатора), когда его буферы заполнены. Ваше приложение должно правильно работать с потерянными пакетами или реализовать некоторую логику для управления потоком пакетов (в случае потерянных пакетов обратная связь отсутствует - UDP - ненадежный транспорт).

SCTP может быть лучшей альтернативой, если это приемлемый вариант.

0

Если полоса пропускания между вами и вашим маршрутизатором составляет 10 Кбит / с, сокет действительно будет заблокирован на некоторое время, то есть на время отправки электрических сигналов на устройство "следующего перехода". Если ваше интернет-соединение ограничено до 10 Кбит / с, ваш сокет будет освобожден довольно быстро, но маршрутизатору придется иметь дело с самим следующим узлом, поэтому его сокет будет занят, а ваш пустой будет освобожден.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .