どちらのノードが誰であるか(つまり、メッセージの遅延がより長いノード)を発見し、片道のトリップ遅延を推定する方法を見つけました。他の答えは正しいが、直接クロック測定が近づいたことを考慮しているだけであり、もちろん機能しません。しかし、ここで証明しているように、これは上記の私の作業アルゴリズムであるため、これは物語の一部にすぎません:
実生活のように仮定する:
各ノードは、独自のパケット(それぞれAまたはBでマーク)でチャネルを埋めるか、次のように他のノードから受信したパケットを転送します。
Always fill the channel with my own packets except:
if I receive a packet from another node then
Randomly choose to
either forward that packet from the other node
or discard that packet and forward my own packet
直感的な説明
Aのbandwidth * latency製品の方が高い(レイテンシが大きいため)ため、AはBよりも多くのパケットを受信できるため、各ノードは図にある人を知ることができます。
さらに、上記のアルゴリズムを実行するのに十分な収束時間で、AからBへのパケットの比率は、AからBへのRTT遅延の実際の比率、したがって望ましいOTTを示します。
シミュレーション結果のトレース上記は、Aが3秒の遅延に向かって収束し、Bが約1秒の遅延に収束する方法を証明するシミュレーションです。
図の説明:
各行は1秒の時間を表します(わかりやすくするために、1秒の送信時間を持つようにパケットサイズが選択されています)。各ノードは、特定の順序や時間ではなく、いつでもアルゴリズムを開始できることに注意してください。列は次のとおりです。
ノードAが受信する:ノードAが受信側で見るもの(これは以下のP4でもあります)
ノードAが注入する:ノードAが送信するもの(これはA、またはランダムにAまたはBであることに注意してください)
P1、P2、P3:AとBの間で(順番に)転送中の3つのパケット(1秒の送信は3つのパケットが3のレイテンシーで転送中であることを意味します)
NODE Bが受信します:Bが受信側で見るもの(これはP3です)
ノードBが注入する:Bが送信するもの(これはBであるか、アルゴリズムごとにランダムにAまたはBであることに注意してください)
P4:BからAへの転送中のパケット(P1、P2、P3も参照)
AはAを数えます:Aがそれが見たAパケットのために数えるもの
AがBをカウントする:Aがそれが見たBパケットに対してカウントするもの
BはAを数えます:Bがそれが見たAパケットのために数えるもの
BはBを数えます:Bがそれが見たBパケットのために数えるもの
A-> B:AがBに向かって推定するレイテンシ(見られたパケットに基づく4秒のRTTの比率)
B-> A:BがAに向かって推定するレイテンシ(見られたパケットに基づいた4秒のRTTの比率)
両方のノードが収束し、実際のレイテンシを維持していることがわかります(実際には、Aの場合、収束するのにより多くの秒が必要ですが、Bと同じ動作を収束するため、それはわかりません)
より良いフィルターはより速く収束することができますが、遅延の正しい値を中心に両方が収束する方法を明確に見ることができます。したがって、それらは遅延を正確に知ることができます(説明のためだけに推定を示しています)。
また、リンク間の帯域幅が異なっていても、パケットペアを使用して帯域幅の推定値を把握し、上記の比例式に適用するだけで、上記の方法を維持できます(より確実に考える必要があります)。
結論
上記の図では、AとBの両方がネットワーク内での位置を把握し、他のノードへの待ち時間を把握するためのアルゴリズムを提供しました。クロックベースのアプローチではなく、ネットワーク測定の推定方法を使用しましたが、実際には再帰的なクロック同期の問題のために解決策になりません。
注:最初のコメントでわかるように、誰も私がそれを解決したと信じていないので、すべてのシミュレーションを提供するこの回答を編集しました。これらの結果により、誰かがこのネットワーク測定パズルで少なくとも1つのエラーまたは正しさを見つけるのに役立つと確信し、承認できることを願っています!