EpochLink Protocol
What time is it?
EpochLink Protocol
XX:XX.XX
XXXX/XX/XX
Welcome to EpochLink Protocol
EpochLinkはHTTP/HTTPS通信で時刻同期をできるように作られたプロトコルです。
世の中の様々なコンピューターの時刻は、常に同期されている必要があります。
なぜなら、正確な時刻がわからないと様々な処理が正しく動作しなくなる可能性があるからです。
事実、既に世の中にはNTPと呼ばれる優れた時刻同期プロトコルがありますが、このプロトコルはクライアントサイドのJavaScriptから利用ができなかったり、一つのStratum 1に多くのアクセスが集中しすぎていたり、NTPv3までは2036年に時刻がオーバーフローしてしまうなどの課題を抱えています。
JSON形式で、簡単に取り扱いができる時刻同期プロトコルのEpochLinkでは、これらの問題を解消し、クライアントサイドのJavaScriptから比較的正確な時刻を取得したり、何らかの事情でNTPが使用できない場合などに役立つことができます。
Specification
EpochLinkの仕様についてまとめました
通信方式: HTTP/HTTPS
リクエスト形式: HTTP GET
レスポンス形式: JSON
Server Side
EpochLinkサーバーからは、クライアントからのリクエストに対して以下のようなJSONコードをレスポンスとして返します。
{
"protocol": "EpochLink",
"version": "1.0.0",
"address": "https://elp.example.com/",
"time_zone": "UTC",
"iso8601_time": "2024-01-01T00:00:00.530",
"unix_time_ms": 1704034800530,
"unix_time": 1704034800
}
それぞれ、以下のようなデータが含まれます。
| Name | Data | Type |
|---|---|---|
| protocol | プロトコル名 | 文字列/String |
| version | プロトコルのバージョン | 文字列/String |
| address | サーバーのアドレス | 文字列/String |
| time_zone | 時刻のタイムゾーン | 文字列/String |
| iso8601_time | ISO8601に準拠した時刻 | 文字列/String |
| unix_time_ms | ミリ秒を含むunix時刻 | 数値型/int |
| unix_time | ミリ秒を含まないunix時刻 | 数値型/int |
Client Side
クライアントからは、EpochLinkサーバーに対してGETリクエストを送信し、JSONを取得します。
時刻の取得までに流れ
1. EpochLinkサーバーが正確な時刻を設定する(事前準備)
2. 正確な時刻を求めているクライアントがEpochLinkサーバーにリクエストをする
3. EpochLinkサーバーからレスポンスで時刻を含んだJSONが返ってくる
4. クライアント側で時刻を補正して使用する
補正について
正確な時刻の取得には、サーバーとクライアント間の通信速度などによる、ラグを求めて時刻を補正する必要があります。
EpochLinkでは、NTPほど高精度な補正は期待できないため、高精度でズレのほとんどない時刻取得を望んでいる方はNTPなどを使用してください。
1. EpochLinkサーバーにリクエストする直前の時刻を記録
2. EpochLinkからのレスポンスが返ってきた時刻を記録
3. 2と3の差を求め、2で割る(往復分あるため2で割る)
4. EpochLinkサーバーのレスポンスに含まれている時刻に3で求めた差を足す
これにより、通信時間分のラグを補正することができます。
補正するかしないかはクライアントにより処理が委ねられます。
How to useにてサンプルコードがありますのでぜひそちらもご確認ください!
How to use
EpochLinkの使用方法をまとめました
Server Side
Specificationにて記載した仕様に沿ったレスポンスをGETに対して行うものであれば、それはEpochLinkサーバーになります。
正確な時刻を取得し、それをJSONに含んでレスポンスを返す必要があります。
サンプルコードでは、時刻はサーバーを動作させているコンピューターから取得しています。
Node.js向けサンプルコード
var port = 8080
var http = require('http');
var server = http.createServer(function(request, response){
response.writeHead(200,{'Content-Type': 'application/json; charset=utf-8'},{'Access-Control-Allow-Origin': '*'});
var now = new Date();
time_json = {
"protocol": "EpochLink",
"version": "1.0.0",
"address": request.protocol + '://' + request.headers.host + request.url,
"time_zone": "UTC",
"iso8601_time": now.toISOString(),
"unix_time_ms": now.getTime(),
"unix_time": Math.floor(now.getTime() / 1000)
}
response.end(JSON.stringify(time_json));
})
server.listen(port);
console.log("Serving on port "+port+"...");
他のphp、pythonのサーバーのコードは、当ページ最下部のダウンロードにありますのでphpやpythonでのサーバー構築をお考えの方はそちらもご活用ください!
Client Side
Specificationにて記載した仕様に沿ってJSONを読み取って、時刻を取得できればOKです。
時刻の補正機能があるとなお良いでしょう。
ここでは、python向けのサンプルコードのみですが、当ページ最下部のダウンロードから取得できる、javascriptやphp、python向けのサンプルコードもあります。
また、取得を容易にするEpochLink.jsもありますのでそちらもご活用ください。
Python向けサンプルコード
import time
import requests
url = "https://elp.example.com/"
start_get_dt = int(time.time() * 1000)
response = requests.get(url)
json_data = response.json()
end_get_dt = int(time.time() * 1000)
now_unix_ms = json_data["unix_time_ms"] + ((end_get_dt - start_get_dt) / 2)
print(time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(now_unix_ms // 1000)))
EpochLink.js
EpochLinkではEpochLink.jsという簡単にEpochLinkを使用できるJavaScriptを配布しています。
以下のページから使用方法を確認できます。
About EpochLink.js
Q&A
よくある質問に回答しています。
Q. サーバーの時刻が信頼できるかどうかはどう判断するの?
現状、単一のサーバーから取得するだけでは、信頼できる時刻かは判断できません。
クライアント側で、複数のサーバーから時刻を取得して取得した時刻の平均値を使用するなどすると、より信頼できる時刻を使用できるでしょう。
また、サーバー側が信頼できる時計から時刻を取得していることを明記していれば、そう簡単にサーバーが狂うことはないでしょう。
Q. 今使用できるサーバーはあるの?
elp.emptybox.winにてEpochLink対応サーバーを公開しております。
以下のルールを守っていただいた上でどなたでも自由に使用していただけますが、予告なくサービスを終了する可能性があるためご注意ください。
禁止事項
- サーバーに意図して攻撃する行為
- 1時間に180回以上リクエストする行為
- 法令または公序良俗に違反する行為
- 本サービスを意図して破壊する、動作を妨害する行為
- その他サービス管理者が不適切と判断する行為
サーバー内の時刻の同期元はntp.nict.jpです。一日に一度同期しております。
Release Note
Version 1.0.0
EpochLinkの初回リリースです!
プロトコルの仕様と例を明確にすることで、利用者の方々がプロトコルについてを理解し、実装できるようになると考えています!
License
EpochLink及びこのサイトで配布しているサンプルコード、サーバーはすべてNYSLライセンスです。
同梱されているLicense.txtもご確認ください。
Public EpochLink server
私だいちまるが運営しているEpochLinkサーバーです。
以下のルールを守っていただいた上で自由に使用していただいて構いません。
なお、予告なくサービスを停止・終了したり、極稀に誤った時刻を発信してしまう可能性があるため、使用は自己責任でお願いいたします。
サーバーは一日に一度ntp.nict.jpと時刻を同期しております。
禁止事項
- サーバーに意図して攻撃する行為
- 1時間に180回以上リクエストする行為
- 法令または公序良俗に違反する行為
- 本サービスを意図して破壊する、動作を妨害する行為
- その他サービス管理者が不適切と判断する行為
- 生命に関わる時刻の同期に使用する行為
elp.emptybox.win
Push to Copy
Download
ここから様々なEpochLinkに関するプログラムをダウンロードできます。
ライセンスはすべてNYSLライセンスです。