Многоадресный пакет UDP перехвачен дампом tcmp, но не получен сокетом

Я занимаюсь исследованием больших данных. Для этого я разработал сеть с несколькими узлами, обменивающимися одноадресными и многоадресными пакетами UDP. Есть пакеты UDP с 33792 байтами и пакеты Ack с 37 байтами. MTU установлен на 1500. Все работает нормально некоторое время, скажем от 300 до 5000 обменяемых пакетов. Затем вдруг какая-то машина получает пакет (я вижу это с tcmpdump -i any -vvv -XX -e -s 64 > dump.txt 2>&1). Но сокет приложения его не получает (выбор не просыпается).

Я использую сокеты IPv4 с TTL, установленным на 1, т.е. локальная сеть.

После ночей, пытаясь решить, я в конечном итоге устанавливаю:

sudo sysctl -w  net.core.wmem_max=134217728
sudo sysctl -w  net.core.rmem_max=134217728
sudo sysctl -w  net.ipv4.udp_mem=1638400 1638400 1638400
sudo sysctl -w  net.core.somaxconn=4096
sudo sysctl -w  net.core.netdev_max_backlog=262144
sudo sysctl -w  net.core.optmem_max=134217728
sudo sysctl -w  net.ipv4.udp_rmem_min=65535
sudo sysctl -w  net.ipv4.udp_wmem_min=65535

The client sockets set SO_SNDBUF to 134217728 (128 M), and server socket sets SO_RCVBUF to same value.

Но похоже до сих пор не решили проблему. Есть предположения??? .... ТИА


person Edgard Lima    schedule 13.02.2017    source источник
comment
А? «Пойман tcpdump», но «не может видеть его с tcpdump» и «получен сокетом», но «сокет не получает его»? Прими решение.   -  person user207421    schedule 13.02.2017
comment
Спасибо за совет. Я отредактировал вопрос.   -  person Edgard Lima    schedule 13.02.2017
comment
Какую ОС вы используете? Что вы подразумеваете под тем, что какая-то машина получает пакет? Это другая машина, на которой запущено приложение с сокетом приложения?   -  person Johannes Overmann    schedule 16.02.2017


Ответы (2)


На самом деле кажется, что это решило проблему. Любой, кто хочет подробно рассмотреть (преимущества/недостатки/компромиссы) значения sysctl, которые я установил, очень приветствуется.

person Edgard Lima    schedule 14.02.2017

Вы должны присоединиться к группе многоадресной рассылки, чтобы надежно получать многоадресные пакеты.

В UN*X это делается с помощью чего-то вроде

struct ip_mreq mreq;
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

Подводный камень в том, что если что-то не так настроено (или работает некорректно, например коммутатор), то вы какое-то время сможете принимать мультикаст-трафик, а потом вдруг он перестанет. Поэтому, когда вы получаете пакеты, вы «не можете» сделать вывод, что «все в порядке».

Кроме того: вся потенциально прозрачная инфраструктура в вашей сети (например, коммутаторы уровня 2 == обычные коммутаторы) должна поддерживать версию IGMP, которую использует ваша ОС.

person Johannes Overmann    schedule 16.02.2017