2010-11-12 3 views
21

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

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

ответ

14

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

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

+1

Хорошо, после вашей ссылки я нашел linux-специфическое объяснение в [этой теме] (http://www.mail-archive.com/[email protected]/msg00113.html).Таким образом, короткий упрощенный ответ: _Linux блокировать отправку sendto в полном буфере отправки_. –

+2

ОК, но теперь вопрос подталкивается еще на один шаг: при каких условиях Linux будет заполнять буфер сокета? (в отличие от удаления пакетов из него). Это, к сожалению, очень сложный вопрос. – MarcH

+0

@MarcH, как насчет recv, отправить, когда сокет блокируется? Думаю, в этом случае send и recv все равно заблокируют? – Bionix1441

9

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

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

Возможно, ваше поведение «блока» может быть в том, что ARP работает.

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

+0

Хорошо, хороший элемент ответа, интересно; но я заинтересован в основном блокировке (или отсутствии блокировки), связанной с перегрузкой/полным буфером. –

+0

ARP используется только для определения местонахождения хостов в одной подсети - обычно это маршрутизатор. И результаты кэшируются для последующих отправлений. – selbie

+2

Когда IP-пакет выключается, ему требуется IP-адрес удаленного хоста и MAC-адрес ** следующего перехода ** ... –

Смежные вопросы