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 Mon May 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<const char*>(&mcastJoinReq), sizeof(ip_mreq))
перед многоадресной рассылкой с sendto()
.
Мое предположение всегда заключалось в том, что мне не нужно присоединяться к многоадресной рассылке, когда мне нужно только отправлять многоадресную рассылку, т.е. я никогда не буду звонить recvfrom()
получать многоадресную рассылку. Но независимо от того, только отправка / только получение, мы должны подключиться к многоадресной рассылке.