ページ 11

ミリ秒取得関数による時間同期について

Posted: 2015年5月15日(金) 00:03
by coco
現在異なる端末同士(Android同士とAndroid-IPhone間)においてUDP通信のパケット到達時間を計測しようとしております。

プログラム処理としては簡単なものですが

【送信部分】

A端末からB端末へUDPを送信する
(送るデータはA端末で送信直前に取得したエポックからのミリ秒
(JavaであればSystem.currentTimeMillis();で取得出来る値です)
この値をαとします。

同様にB端末からもA端末へパケットを投げます。
こちらのミリ秒をβとします。


【受信部分】

A端末ではB端末から受け取ったβと
受信時に新しく取得したミリ秒α2の差分を取ります。

α2 - β = B端末からA端末への通信に要した時間

同じ事をB端末でも行い、両者の通信時間が判明した段階で求めた時間をお互いの端末へ返しております。


こうして求めた時間を見てみると、片方の通信時間がマイナスとなってしまいます。
受信時に新しくミリ秒を取得しているため、送信時のミリ秒よりも小さな値となる事はまず無いと思い色々原因を調べておりました。

ひょっとして1970年1月1日午前0時からのミリ秒取得関数を同時に呼び出したとしても端末間でズレが生じるのでしょうか?
(OS起動時の時刻に左右されるという文献もチラっと目にしましたが、根拠が書いてなかったため信じて良いものか判断出来ない状態です。

試しにタップした瞬間のミリ秒を表示させてみましたが、端末毎にそれぞれ若干異なっている様でした。
(正確な同時タップは不可能のため、ミリ秒という事もあり誤差の範囲内かなとも思える程度のズレでしたが・・・。)

仮に端末毎に取得出来るミリ秒が異なる場合、どの様にしてパケット通信時間を求めれば宜しいでしょうか?

Re: ミリ秒取得関数による時間同期について

Posted: 2015年5月15日(金) 00:19
by h2so5
基本的に端末の時計はそんなに正確ではないのでミリ秒では同期していません。

一般的にはパケットの往復にかかった時間を測ることが多いです。
つまりA端末からB端末へパケットを送信し、B端末はパケットを受け取った時に即座にA端末にパケットを送り返します。
A端末からパケットを送った時間とB端末から帰ってきたパケットの到達時刻の差を求めると、往復時間がわかります。
送受信の速度に偏りがないと仮定すれば、片道の速度はだいたいその半分くらいということになります。

Re: ミリ秒取得関数による時間同期について

Posted: 2015年5月15日(金) 00:20
by みけCAT
coco さんが書きました:ひょっとして1970年1月1日午前0時からのミリ秒取得関数を同時に呼び出したとしても端末間でズレが生じるのでしょうか?
確証は無いですが、本体の時計がずれていればずれる可能性が高そうです。
例えばSNTP ClientでNTPサーバーから時刻を取得すると、端末間のズレがわかるかもしれません。
※このアプリの取得結果も同じ端末でやってかなりずれるので、わからないかもしれません
coco さんが書きました:仮に端末毎に取得出来るミリ秒が異なる場合、どの様にしてパケット通信時間を求めれば宜しいでしょうか?
例えば、SNTPと同様に((A端末で取得した受信時刻-A端末で取得した送信時刻)-(B端末で取得した送信時刻-B端末で取得した受信時刻))/2で近似する、とかでしょうか?

Re: ミリ秒取得関数による時間同期について

Posted: 2015年5月15日(金) 09:14
by coco
h2so5さん、みけCatさん御回答有難う御座います。
教えて頂いた往復時間を二分する方法で試してみたいと思います。

有難う御座いました!