Как сервер mDNS должен обрабатывать обратный запрос mDNS?
Во-первых, немного предыстории: avahid вызывал у меня проблемы на моем встроенном Linux-устройстве (в нем были ошибки, которые не выглядели так, как будто они будут исправлены в ближайшее время), и мне была нужна только минимальная функциональность mDNS (то есть достаточно, чтобы кто-то работал на Mac или ПК мог сделать "ping6 mydevicename.local." и разрешить это имя хоста для моего устройства), поэтому я написал свой собственный минималистский сервер mDNS (на C), который в основном просто прослушивает многоадресные DNS-пакеты и отвечает на них необходимым mDNS записей.
Это в основном работает - в частности, выполнение вышеупомянутого теста ping6 на Mac разрешается немедленно и работает просто замечательно.
Однако я заметил, что, если я делаю ping6 из коробки с Linux, это только отчасти работает. Особенно:
- Клиенту Linux требуется около 4 секунд для разрешения имени хоста
- Эта 4-секундная задержка происходит для каждого отправляемого пакета ping … т.е. вместо отправки одного ping в секунду, программа ping6 заканчивает тем, что отправляет один ping каждые 4 секунды. (Это действительно получить ожидаемый понг, хотя)
- Эта проблема не возникала, когда я запускал avahid на моем встроенном устройстве Linux, поэтому я думаю, что поведение должно быть вызвано тем, что мой новый сервер mDNS делает неправильно.
- Когда это происходит, мой сервер mDNS получает пакеты обратного mDNS от клиента, как показано в этом отладочном выводе:
[...]
RECEIVED 90 IPv6 BYTES FROM [fe80::21c:abff:fe00:a60] on s6#2 (sock=6)
--- Received IPv6 Data (90 bytes): -------------------------------------
0000: .............3.2 [00 00 00 00 00 01 00 00 00 00 00 00 01 33 01 32]
0016: .6.4.2.0.e.f.f.f [01 36 01 34 01 32 01 30 01 65 01 66 01 66 01 66]
0032: .b.2.0.6.2.0.0.0 [01 62 01 32 01 30 01 36 01 32 01 30 01 30 01 30]
0048: .0.0.0.0.0.0.0.0 [01 30 01 30 01 30 01 30 01 30 01 30 01 30 01 30]
0064: .0.0.0.8.e.f.ip6 [01 30 01 30 01 30 01 38 01 65 01 66 03 69 70 36]
0080: .arpa..... [04 61 72 70 61 00 00 0c 00 01]
HandlemDNSRequest: transID=0 flags=0 numQuestions=1 numAnswers=0 numAuthorityRRs=0 numAdditionalRRs=0
Ooh, a reverse-mDNS request for [3.2.6.4.2.0.e.f.f.f.b.2.0.6.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa] scope=3
Итак, мои вопросы:
Что может привести к тому, что клиентское программное обеспечение для разрешения имен хостов mDNS в Linux (NSS-resolver?) Будет иметь эту четырехсекундную задержку каждый раз, когда программа пытается разрешить имя хоста mDNS с помощью моего сервера mDNS?
Как правильно ответить на запрос mDNS, подобный приведенному выше? Я посмотрел в спецификациях mDNS и DNS, но не смог найти ничего конкретного о том, что требуется. Я пытался заставить его отвечать обычной информацией (имя хоста, IP-адреса и т. Д.), Но это не заставило задержку уйти.
Есть что-то еще, что я могу делать не так? (Кроме попытки накатить мой собственный сервер mDNS - но поверьте мне, я бы не стал этого делать, если бы почувствовал, что есть лучшая альтернатива; avahid просто не подрезал горчицу)
1 ответ
Я наконец-то смог выяснить, что происходит не так, используя устройство nTap и WireShark для захвата трафика mDNS, генерируемого устройством как Avahid, так и моей собственной программой. Поскольку avahid не создавал эту проблему, предположительно, ответы, которые ищет avahid, искали в Linux. Я обновил свою программу, чтобы генерировать похожие ответы, и это заставило 5-секундные задержки исчезнуть.
В частности, ответы обратного mDNS, сгенерированные avahid, содержали только 0 запросов и 1 ответ (типа hostname), как показано на прикрепленном снимке экрана wireshark.