ミリ秒取得関数による時間同期について
Posted: 2015年5月15日(金) 00:03
現在異なる端末同士(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起動時の時刻に左右されるという文献もチラっと目にしましたが、根拠が書いてなかったため信じて良いものか判断出来ない状態です。
試しにタップした瞬間のミリ秒を表示させてみましたが、端末毎にそれぞれ若干異なっている様でした。
(正確な同時タップは不可能のため、ミリ秒という事もあり誤差の範囲内かなとも思える程度のズレでしたが・・・。)
仮に端末毎に取得出来るミリ秒が異なる場合、どの様にしてパケット通信時間を求めれば宜しいでしょうか?
プログラム処理としては簡単なものですが
【送信部分】
A端末からB端末へUDPを送信する
(送るデータはA端末で送信直前に取得したエポックからのミリ秒
(JavaであればSystem.currentTimeMillis();で取得出来る値です)
この値をαとします。
同様にB端末からもA端末へパケットを投げます。
こちらのミリ秒をβとします。
【受信部分】
A端末ではB端末から受け取ったβと
受信時に新しく取得したミリ秒α2の差分を取ります。
α2 - β = B端末からA端末への通信に要した時間
同じ事をB端末でも行い、両者の通信時間が判明した段階で求めた時間をお互いの端末へ返しております。
こうして求めた時間を見てみると、片方の通信時間がマイナスとなってしまいます。
受信時に新しくミリ秒を取得しているため、送信時のミリ秒よりも小さな値となる事はまず無いと思い色々原因を調べておりました。
ひょっとして1970年1月1日午前0時からのミリ秒取得関数を同時に呼び出したとしても端末間でズレが生じるのでしょうか?
(OS起動時の時刻に左右されるという文献もチラっと目にしましたが、根拠が書いてなかったため信じて良いものか判断出来ない状態です。
試しにタップした瞬間のミリ秒を表示させてみましたが、端末毎にそれぞれ若干異なっている様でした。
(正確な同時タップは不可能のため、ミリ秒という事もあり誤差の範囲内かなとも思える程度のズレでしたが・・・。)
仮に端末毎に取得出来るミリ秒が異なる場合、どの様にしてパケット通信時間を求めれば宜しいでしょうか?