Подтвердить что ты не робот

Когда выполняется блок sendto() UDP?

При использовании поведения по умолчанию (блокировка) в соке UDP, и в этом случае будет вызов для sendto()? Меня интересует в основном поведение Linux.

Для TCP я понимаю, что управление перегрузкой делает блокировку send() блокировкой, если окно отправки заполнено, но что относительно UDP? Может ли он иногда блокироваться или просто отбрасывать пакеты на более низких уровнях?

4b9b3361

Ответ 1

Это может произойти, если вы заполнили свой буфер сокетов, но он сильно зависит от операционной системы. Поскольку UDP не дает никаких гарантий, ваша операционная система может решить, что делать, когда ваш буфер сокетов заполнен: блокировать или удалять. Вы можете попытаться увеличить SO_SNDBUF для временного облегчения.

Это может даже зависеть от тонкой настройки вашей системы, например, это может также зависеть от размера кольца TX в драйвере вашего сетевого интерфейса. В списке рассылки iperf есть несколько обсуждений по этому поводу, но вы действительно хотите обсудить это с разработчиками вашей операционной системы. Обратите особое внимание на O_NONBLOCK и EAGAIN/EWOULDBLOCK.

Ответ 2

Возможно, это связано с тем, что ваша операционная система пытается выполнить запрос ARP, чтобы получить аппаратный адрес удаленного хоста.

В принципе, всякий раз, когда пакет выходит из строя, заголовок требует IP-адрес удаленного хоста и MAC-адрес удаленного хоста. 192.168.1.34 и AB: 32: 24: 64: F3: 21.

Поведение вашего "блока" может заключаться в том, что ARP работает.

Я слышал в более старых версиях Windows (думаю, 2k), что 1-й пакет иногда отбрасывается, если запрос занимает слишком много времени, и вы отправляете слишком много данных. Пакет обновления, вероятно, исправил это с тех пор.