IP-пакеты с TTL 0 не должны покидать хост.
Но когда я запускаю приложение, которое многоадресно передает UDP-пакеты с TTL 0, я вижу, что пакеты с TTL 0 покидают хост на несколько секунд и возвращаются к нормальному поведению с TTL 0. Это, скорее всего, происходит после перезагрузки и первого запуска приложения.
Я подтвердил пакеты с TTL 0 покидают хост с tcpdump:
05:31:39.048304 IP (tos 0x0, id 14487, offset 0, flags [DF], proto UDP (17), length 1344)
192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
05:31:39.049594 IP (tos 0x0, id 14488, offset 0, flags [DF], proto UDP (17), length 1344)
192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
05:31:39.051601 IP (tos 0x0, id 14489, offset 0, flags [DF], proto UDP (17), length 1344)
192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
05:31:39.053584 IP (tos 0x0, id 14490, offset 0, flags [DF], proto UDP (17), length 1344)
192.168.1.200.46968 > 239.0.0.1.1234: UDP, length 1316
Как мы видим, ttl
не отображается, что означает TTL 0, как подтверждено на странице руководства tcpdump: https://www.tcpdump.org /manpages/tcpdump.1.html (поиск ttl
, здесь четко указано: ttl - время жизни; если оно равно нулю, не сообщается .
Не работают правила iptables
.
uname -a
: Linux mydevice 4.15.0-101-generic # 102-Ubuntu SMP Пн, 11 мая, 10: 07:26 UTC 2020 x86_64 x86_64 x86_64 GNU / Linux
lsb_release -a
:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
В чем может быть причина такого поведения и как я могу решить эту проблему?
Решение состоит в том, чтобы присоединиться к группе многоадресной рассылки с помощью
setsockopt(sockFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast
перед многоадресной рассылкой с помощью отправить()
.
Я всегда предполагал, что мне не нужно присоединяться к многоадресной рассылке, когда мне нужно только отправлять многоадресную рассылку, то есть я никогда не буду вызывать recvfrom()
для получения многоадресной рассылки. Но независимо от того, только отправка/только получение, мы должны присоединиться к мультикасту.