サーバー時間 — 秒までしか見えない時計を、ミリ秒で測る
チケットの発売が20時00分00秒だとして、大事なのは自分のパソコンが何時だと思っているかではありません。サーバーが何時だと思っているかです。ところがサーバーが時刻を教えてくれる通路は秒単位のヘッダーひとつしかなく、しかも切り捨てです。一度読むだけでは、平均0.5秒必ず遅れます。
端末の時計はNTPで合わせていますが、その値はずれていきます。スリープから復帰した直後、混んだ回線、一日中モバイル回線だけで使ったスマートフォン。どれもずれる条件です。
問題は、ウェブサーバーが自分の時計を精密に公開していないことです。取れるのは応答の Date ヘッダーだけで、仕様上この値は秒単位。ミリ秒の桁はそもそも送られてきません。
ヘッダーを一度読むと必ずずれる理由
このヘッダーは四捨五入ではなく切り捨てです。実際の時刻が09:30:00.900のサーバーも「09:30:00」と書きます。小数以下を近いほうに寄せるのではなく、捨てます。
つまり一度読んだ値は、不正確なのではなく偏っています。常に0〜1000ミリ秒だけ遅れていて、平均は500ミリ秒、方向はいつも同じ。何度読み直しても同じ向きに偏っているので、100回平均しても「0.5秒遅い値」に正確に収束するだけです。
サーバー時刻を表示するページを見たときは、この失敗を疑ってみてください。誤差について何も書かずに時刻だけを大きく表示しているなら、ヘッダーをそのまま出している可能性が高いです。
答えではなく、範囲を受け取る
解き方は、応答から答えを得ようとせず、範囲を得ることです。自分の時刻sで要求を出し、rで応答が届き、ヘッダーの値がDだったとします。サーバーがそのヘッダーを書いた瞬間はsとrのあいだにあり、実際の時刻はDとD+1秒のあいだにあります。
この二つを重ねると、自分の時計とサーバーの時計のずれが取りうる幅が決まります。往復が速いほど幅が狭くなるので、何度も測って最も狭い範囲を残していきます。
だから画面には時刻だけでなく誤差の幅も出しています。±40ミリ秒と出ていれば、その範囲のどこかにサーバーの時刻がある、という意味です。数字ひとつを断定するより正直で、実際に役に立つのはこちらです。
日本のチケットサイトを測るとき
チケットぴあ、e+、楽天チケット、CNプレイガイド、チケットJFA を一覧から選べます。自分で入力してもかまいません。測るのはそのドメインを預かるサーバーの時計です。
ただし、発売の可否を決めているサーバーと、時刻を返すサーバーが同じとは限りません。大きなサイトは複数の機械で動いており、時計が数十ミリ秒ずれていることがあります。この道具が示すのは「その名前で応答する機械の時計」で、それ以上のことは分かりません。
測定に失敗する場合は、そのサイトがブラウザからの読み取りを許していないためです。そのときは代わりに測った先を画面に表示します。黙って別の機械の時計を出すのは誤解のもとなので、必ずどこを測ったかを書きます。
実際の使い方
発売の数分前に開いて、何度か同期させてください。測るほど誤差の幅が狭まります。回線が安定しているときほど早く落ち着きます。
アラームは00秒ちょうどのほか、1分前・2分前・3分前と任意の時刻に設定できます。カウントダウンの音も出せます。ブラウザのタブを切り替えても動き続けます。
端末の時計そのものを直す必要はありません。この道具が示すのは「サーバーの時計で今何時か」であり、ずれを頭の中で補正する必要はないように作ってあります。
こんなときに使います
- •コンサートやイベントのチケット発売に合わせるとき
- •数量限定の商品の販売開始に合わせるとき
- •応募や申請の受付開始時刻を待つとき
- •自分の端末の時計がどれだけずれているか確かめたいとき
- •オークションの終了間際に入札するとき
よくある質問
端末の時計を合わせ直す必要はありますか。
ありません。表示しているのはサーバーの時計に合わせた時刻で、端末とのずれはすでに補正済みです。
誤差の幅はどのくらいまで狭まりますか。
回線しだいです。有線や安定したWi-Fiなら数十ミリ秒、モバイル回線では100ミリ秒を超えることもあります。狭まらない場合は回線が混んでいます。
測定できないサイトがあります。
ブラウザからの読み取りを許していないサイトです。その場合は代わりに測った先を表示します。どこの時計なのかを隠したまま数字だけ出すことはしません。
このサイト自身の時刻とサーバーの時刻は違いますか。
違うことがあります。測っているのは指定したサイトのサーバーであって、このサイトのサーバーではありません。どの機械の時計かは画面に表示されます。
入力したアドレスは保存されますか。
いいえ。測定はその場で行われ、履歴は残りません。
