
HabrにはPTPv2が
どのように機能
するかについてのメモが既にありました。 この高精度同期の方法がデバイスに実装された方法と理由について説明します。
それは何のためですか?
私はロシアの会社NTTs-Metrotekで働いています。NTTS-Metrotekは、イーサネットネットワーク用のテスターを含む通信システム用の機器(スイッチ、テスター、バランサーなど)を開発および製造しています。 たとえば、
このように 。 このデバイスで測定されるパラメーターの1つは、テスト中のネットワークでパケットを渡す際の遅延です。 Ha、Habrahabrの読者は言うでしょう-遅延はpingで測定することもできます。 ですから、ネットワークの輻輳が異なると、遅延が異なる場合があります。 このデバイスは、数ナノ秒の精度で遅延を測定し、同時に最大10 Gb / sの負荷を作成できます。
遅延を測定するために、アナライザーによって生成された各パケットにタイムスタンプが挿入され、このパケットを受信すると、現在の時間とタグからのデータの差が決定されます。 この違いは遅延です。 ただし、通常、アナライザーからのトラフィックはこのトラフィックをテスターにラップする特別なデバイス(ループ)に送られるため、測定される遅延は、テスターからループ(上流)およびループからテスター(下流)へのパケット通過時間の合計です。 チャネルが対称である場合、つまり、そのパラメーターが両方向で等しい場合、測定値を2で除算するだけで、一方向の遅延を取得できます。

チャネルが対称ではない場合、各方向で個別に遅延を測定する必要があります。 この場合、2つのアナライザーが使用されます。 1つはテストトラフィックを生成し、2つ目はそれを受信して分析します。

ここでは、遅延を正確に判断するために、両方のデバイスの時間カウンタが同じ値を持っている必要があるため、高精度の時間同期が必要でした。
当社での実装方法
デバイスの簡略図は、次のように表すことができます。

FPGAはタイミングを担当し、125 MHzの周波数で動作するタイムカウンターを備えています(精度は8 nsです)。 タイムカウンターは、基準時間とオフセットが異なる場合があります。 遅れるか、一定の値に急ぎます。 また、変化の速度も異なる場合があります。つまり、理想的なカウンターは1秒で1 * 10 ^ 9ナノ秒をカウントし、実際のカウンターは多少増減します。その結果、バイアスは常に増加または減少しています。 これらのエラーを修正するために、次のスキームがFPGAに実装されています。

現在のカウンタ値は、オフセットレジスタを使用して所定の値に変更できます。 スムーズなチューニングのために、追加のカウンターが使用され、設定値に達すると(ドリフト)、タイムカウンターは1ビートをスキップするか、1ではなく2ずつ増加します。 10を設定すると、10サイクルでタイムカウンターが11に変わり、22サイクルで20サイクルになります。 負の数、たとえば-10を指定すると、10サイクルでタイムカウンターが9に変わり、18で20サイクルなどになります。
このデバイスは、8ビットavr-atmega2561マイクロコントローラーで実行される
NutOsオペレーティングシステムのネットワークスタックを使用します。 そして、このマイクロコントローラー上で他の多くのタスクが回転し、8 MHzで動作することを考慮すると、このシステムのパフォーマンスが非常に小さいことが明らかになります。 したがって、高精度を必要とするアクションのその部分はFPGAによって実行され、PTPv2プロトコルのロジックのみがマイクロコントローラーに実装されます。
交換図を見ると、PTPv2クライアント(スレーブ)を実装するときに、パケットがサーバーから到着した時刻(t2)と応答が送信された時刻(t3)を正確に知る必要があることがわかります。

これらの目的のために、FPGAのMACコアを変更しました。 ネットワークパケットを受信すると、タイムスタンプ(t2)が各パケットに追加されます。 パケットを送信するとき、タイムカウンタの現在の値(t3)は特別なレジスタに配置されます。 これらの値に基づいて、マイクロコントローラーは基準ソースとデバイス間の現在の時間の不一致も計算します。
PTPv2サーバーとしての実装をテストするために、まず
ptpdデーモンが
実行されている通常のコンピューターを使用しました。 デーモンがイーサネット経由でPTPで動作するには(デフォルトでは、UDP経由でのみ動作します)、libpcapを有効にする必要があります。 これを行うには、構成中に-with-pcap-configスイッチを指定する必要があります。
ptpdを起動するとき、たとえば次のように構成ファイルを指定する必要があります。
ptpengine:interface = eth0
ptpengine:preset = masteronly
ptpengine:トランスポート=イーサネット
ptpengine:use_libpcap = Y
ptpengine:delay_mechanism = E2Eまず、周波数調整を行わなかった場合、コンピューターとデバイスの時間カウンターがどのように分岐するかを確認することにしました。

依存関係はほぼ線形であり、デバイスのカウンターが20マイクロ秒を超えて1秒間進みます。
次に、計算された不一致値がオフセット補正レジスタに書き込まれました。

このグラフは、平均で1秒あたり約22マイクロ秒の誤差があることも示しています。 オフセットによる調整を使用することはあまり良くありません。これはカウンターの段階的な変化を引き起こし、この変化は2つのデバイスで非同期的に発生するため、遅延の測定に大きな誤差をもたらす可能性があります。 スムーズな周波数調整を使用してドリフトレジスタに書き込み、FPGAのカウンターが1秒で22マイクロ秒調整されるような値を使用することをお勧めします。
自動チューニングのために、PIコントローラーを実装しました。 積分成分の場合、係数は0.01に設定され、比例係数の場合は0.05に設定されました。
これにより、不一致の時間依存性は次のようになります。

ミスマッチは「ノイズを発生」させ、20マイクロ秒以上に達することがわかります。 通常のコンピューターがPTPサーバーとして使用されるため、これは驚くことではありません。
PTPハードウェアサポートを実装する
Metronom-50正確なタイムサーバーで実装を確認したところ、数十ナノ秒の不一致がありました。これは、非対称チャネルの遅延を正確に測定するのに十分です。

結論
テストしたチャネルの遅延がミリ秒単位で測定される場合、ptpdデーモンを備えた通常のコンピューターをPTPサーバーとして使用できます。 ネットワーク遅延が数マイクロ秒の場合、ハードウェアPTPサポートを備えたサーバーなしでは実行できません。