まず、いくつかの背景: avahid が組み込み Linux デバイスで問題を引き起こしていました (クラッシュするバグがあり、すぐに修正されるようには見えませんでした)。最小限の mDNS 機能しか必要としませんでした (つまり、Mac の誰かがまたは、PC で「ping6 mydevicename.local.」を実行して、そのホスト名をデバイスに解決することもできます)、そのため、基本的にマルチキャスト DNS パケットをリッスンし、必要な mDNS で応答するだけの最小限の mDNS サーバーを (C で) 作成しました。記録。
これはほとんどの場合機能します。特に、前述の ping6 テストを Mac から実行するとすぐに解決され、うまく機能します。
ただし、Linux ボックスから ping6 を実行しても、ある程度しか機能しないことに気付きました。特に:
- Linux クライアントがホスト名を解決するのに約 4 秒かかります
- この 4 秒の遅延は、送信されるすべての ping パケットに対して発生します。つまり、ping6 プログラムは、1 秒ごとに 1 つの ping を送信する代わりに、4 秒ごとに 1 つの ping を送信することになります。(ただし、期待されるポンは得られます)
- この問題は、組み込み Linux デバイスで avahid を実行していたときには発生しなかったため、この動作は、新しい 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 サーバーを使用して mDNS ホスト名を解決しようとするたびに、Linux mDNS ホスト名解決クライアント ソフトウェア (NSS-resolver?) にこの 4 秒の遅延が発生する原因は何ですか?
上記のような mDNS リクエストに応答する適切な方法は何ですか? mDNS と DNS の仕様を調べましたが、何が必要かについて明示的なものは見つかりませんでした。通常の情報 (ホスト名、IP アドレスなど) で応答するようにしましたが、それでも遅延は解消されませんでした。
私が間違っているかもしれないことは他にありますか?(自分のmDNSサーバーをロールしようとする以外は-しかし、より良い代替手段があると感じた場合、それは私がすることではないことを信じてください; avahidはマスタードをカットしていませんでした)