2.9. 付録: 実装に関するインストラクション

本章では、 iSCP 仕様には含まれないものの iSCP のブローカーやノードのプログラムを実装するにあたって有益となり得る情報を提示することを目的とします。

2.9.1. 各種機能の実装範囲

iSCP のブローカーおよびノードは、必ずしも iSCP 仕様の全てを実装する必要はなく、単機能のみを実装しても構いません。 たとえば、上りストリームのみ、下りストリームのみサポートするする、特定の QoS のみサポートする、E2Eコールのみサポートする、などの選択肢を取ることができます。

受信されたメッセージが受信側でサポートされていない場合には、未知のメッセージを受信した扱いとなり、プロトコル違反が発生することに注意が必要です。

2.9.2. 基準時刻と相対時間からの絶対時刻生成

時系列データポイントを絶対時刻の時間軸で取り扱うには、基準時刻と相対時間から絶対時刻を算出しなければなりません。 本セクションは、その推奨方法を提示します。

データポイントを受信した際に、そのデータポイントが所属するセッションの基準時刻を受信していない場合、 ノードは自身のローカルクロックを使用して、データポイントの受信時刻から基準時刻を算出することが推奨されます。 基準時刻の算出式は、以下のようになります。

推定基準時刻 = (ローカルクロックを用いて取得したデータポイントの受信時刻) - (データポイントの経過時間)

初めて基準時刻を受信した場合は、無条件にその基準時刻を採用することが推奨されます。 すでに採用された基準時刻がある状態で新たに基準時刻を受信した場合は、 採用されていた基準時刻と新しい基準時刻のプライオリティを比較します。 プライオリティが同じかもしくは高い基準時刻を新たに受信した場合は、新しい基準時刻を採用すべきです。 プライオリティの低い基準時刻を新たに受信した場合は、新しい基準時刻は無視すべきです。

また、新しい基準時刻が採用された場合に、古い基準時刻から新しい基準時刻にどのように切り替えるかについても、 アプリケーションで自由に規定することができます。 時刻が巻き戻っても構わない場合は、以下のように即座に切り替えることができます。

base time
 ^
 | previously
 | adopted base time
 | -------------+
 |              :
 |              :
 |              : new base time
 |              +--------------
 |              :
-+--------------+--------------------> elapsed time
 |              ^
                |
    receive new base time


absolute time
 ^
 | based on     : based on
 | previous     : new base time
 | base time    :
 |<------------>:<------------>
 |              :            /
 |             /:         /
 |          /   :      /
 |       /      :   /
 |    /         :/
 | /            :
-+--------------+-------------------->
 |              ^
                |
    receive new base time

時刻が巻き戻ると問題になる場合は、以下のように、徐々に切り替える方法も選択できます。

base time
 ^
 | previously
 | adopted base time
 | -------------+
 |              :   `  .
 |              :          `  .    new base time
 |              :                 +--------------
 |              :                 :
 |              :                 :
-+--------------+-----------------+--> elapsed time
 |              ^
                |
    receive new base time


absolute time
 ^
 | based on     : transition      : based on
 | previous     : period          : new base time
 | base time    :                 :
 |<------------>:<--------------->:<------------>
 |              :                 :            /
 |              :                 :         /
 |              :                 :      /
 |              :                 :   /
 |              :                 :/
 |              :           .  `  ^
 |              :  .  `           | minimum transition rate
 |             /:<----------------+
 |          /   :
 |       /      :
 |    /         :
 | /            :
-+--------------+-------------------->
 |              ^
                |
    receive new base time

2.9.3. 受信側でのバッファリングとデータの発生タイミング再生

QoS=UNRELIABLE を使用してデータを伝送した場合や、複数のノードからのデータが混在する場合に、 iSCP ではデータの時系列順序やタイミングは保証されません。 本セクションは、受信したデータから時系列順序とタイミングを再生する方法の一例を提示します。

2.9.3.1. バッファへの入力と出力

ノードは、受信したデータポイントを整列させるためのバッファを持つこととします。 ノードが Downstream Chunk を受信すると、 受信した Downstream Chunk に格納されたデータポイントを分解し、 その時点で持つ基準時刻を使用して絶対時刻に引き直し、すぐにバッファに入力します。

バッファは、最大遅延時間を持ちます。 バッファ内のデータポイントは、以下の時刻になった時点でバッファから出力されることとします。

バッファからの出力時刻 = データポイントが持つ時刻 + 最大遅延時間

もし、Downstream Chunk を受信して、バッファに入力しようとした時点で、 以下の状態になっていた場合は、データポイントはバッファに入力せず破棄します。 この状態を OUTDATED した状態と呼びます。

現在時刻 > バッファからの出力時刻

これにより、現在時刻から最大遅延時間だけさかのぼった時刻までに発生したデータポイントは、 データが持つ時刻から最大遅延時間が経過したタイミングで順次出力されます。 ``OUTDATED``したデータポイントは、バッファ入力時点で破棄されます。

2.9.3.2. 最大遅延時間の自動調整

バッファを持つノードは、過去一定期間のデータポイントについて、 OUTDATED してバッファに入力されなかったデータも含めて、 以下の値の履歴を持つことができます。

経路遅延 = 受信時刻 - データポイントが持つ時刻

この履歴を用いることで、最大遅延時間のおおよその目安を立てることができます。 例えば、過去の履歴に照らして、全体の90%のデータを破棄せず出力させたい場合は、履歴のうち、 経路遅延が小さい側から 90% に位置するデータポイントの経路遅延( 90パーセンタイル値 )を最大遅延時間として採用します。

最大遅延時間を自動調整する場合は、定期的に最大遅延時間の見直しを行います。 履歴を使用して最大遅延時間を見直した結果、最大遅延時間が変更される場合は即座に反映します。 最大遅延時間が縮小される場合に、以下の式を満たすデータポイントがバッファにすでに存在する場合は、 即座にバッファから出力するか、破棄するかを選択することができます。

現在時刻 > バッファからの出力時刻 = データポイントが持つ時刻 + 最大遅延時間

iSCP のノードは、アプリケーションに対して、最大遅延時間の設定エンドポイントまたは、 自動調整をする場合のパーセンタイル値の設定エンドポイントを提供する事ができます。

2.9.3.3. タイミング再生

本機構により再生されるのはあくまで順序性であり、出力タイミングではないことに注意が必要です。 タイミングの再生が必要な場合は、iSCP のノードからデータポイントを受け取ったアプリケーションで実施する必要があります。