web-dev-qa-db-ja.com

なぜ私のDADは遅いのですか?

Arch Linuxの最後の数回の起動で、ネットワークにアクセスできないことに気づきました。 netctlプロファイルを使用して、アダプターに静的IPv4アドレスを指定しています。これは、それ自体で正常に機能します。

だから私はログを見て、エラーは次のとおりでした:

インターフェイス 'enp0s25'で重複アドレスの検出に時間がかかりすぎています

次に、netctlはコード1で終了し、ネットワークを未構成の状態のままにします。

重複アドレス検出はIPv6の機能であり、プロファイルに次の行が含まれている場合、netctlはこれを使用します。

IPv6=stateless

IPv6を自動的に構成する必要があります。誰かがGithubプロジェクトで これに関する問題 を開きました。netctlの作者は次のように主張しています。

[...] DADに3秒(デフォルト)以上かかる場合は、ネットワークが非常に複雑であるか遅いか、構成が間違っています。

そして:

ネットワークの一部が正しく構成されていないようです。 [...]

しかし、私のネットワークのどこが間違っているのでしょうか。これは非常にシンプルなインフラストラクチャであり、2台のPC、少数のワイヤレスデバイス、およびいくつかのデジタルTVセットトップボックスを備えたISPのモデム/ルーターコンボだけがあります。私の家のネットワーク品質は全体的に完全に良好であり、問​​題はほんの数週間前に始まりました。

現在の回避策は、DADを無効にするか、タイムアウトを増やすことですが、どちらも私は本当に好きではありません。

5
MarioDS

DADはフィードバックなしで動作する必要があるため、本質的に低速です。

DADが機能する方法は、アドレスがインターフェイスでアクティブ化される前に、そのIPアドレスを持つホストのMACアドレスを要求する近隣探索要求が送信されることです。

アドレスが重複している場合、すでにアドレスを持っているホストが応答し、DADはすぐに失敗します。

ただし、アドレスが正しく構成されている場合、重複は発生しないため、要求に対する応答はありません。

送信者は返信がどれだけ早く返ってくるかわからないので、待たなければなりません。 DADが完了するまでの時間は、送信者が応答を待機するように構成されている時間によって異なります。

これは、要求の送信者の構成にのみ依存し、ネットワークの他の部分の構成には依存しないことに注意することが重要です。複雑なネットワークがDADの速度を低下させる可能性があることを示唆する人は、おそらくそれがどのように機能するかを理解していません。

遅延を挟んで複数の要求を送信し、応答なしで特定の秒数が経過した場合にのみアドレスを割り当てるようにマシンを構成することができます。このような構成では、明らかにDADの速度が低下します。

インターフェイスにIPアドレスを割り当てるためのシステムコールは、DADが完了するのを待つことをブロックしません。ただし、DADが完了する前にソケットをアドレスにバインドしようとすると、失敗します。これにより、競合状態が発生し、起動中にサービスが起動しなくなる可能性があります。表示されているエラーメッセージは、このような競合状態を回避するためにDADが完了するのを待つことを目的としたコードによって生成された可能性があります。このようなコードで簡単に導入できるバグの1つは、アドレスが重複しているためにDADが実際にすでに失敗している場合に、DADが完了するのを待機し続けることです。

状況によっては、DADによって引き起こされる問題に対処する最適な方法は、単にDADを無効にすることです。ただし、もちろん、最初に、実際に重複したアドレスがないことを確認する必要があります。アドレスが重複している場合、DADを有効化、無効化、または再構成しても問題は解決しません。

システムがIPアドレスの唯一の正当なユーザーであると想定され、他のノードがそのIPのND要求に応答している場合、直面している問題はNDスプーフィングであり、これが最初に対処する必要のある問題です。

ただし、IPアドレスが動的に構成され、IPアドレスが複数のノードのいずれかによって正当に要求される可能性があるシナリオがある場合は、DADを使用すると競合を回避できるため、無効にしないでください。

3
kasperd