図 6.2 DASH-JS onloadメソッドの処理
しかし、NDN-JSではChunkでInterestとContent Objectの交換を行っている。Chunkと は 4096 バイトに分割されたデータを示し、元のファイル名にシーケンスナンバーのように 16 進数を付着している。これはNDN RouterにおいてコンテンツをNDNレポジトリに格納する 際に行われる処理で、一つのコンテンツにおける最後のChunkにはそれを示すためにヘッダの
中にFinalBlockID=1として格納される。一つのInterestは一つのChunkを指定して送られ、
データのやり取りはChunkで成立される。図6.3にはこれらの違いを表したものを示す。
図 6.3 SegmentとChunkの違い
DASH-JSとNDN-JSを統合させるためにはChunkの集合をSegmentとして結合する必要
があるため、取得したChunkをまとめてセグメント化を行った。Chunkを1から送り、順番 に配列に格納し、最後(FinalBlockID=1)の Chunk が来た際にはその配列をまとめて Segment
//非同期ダウンロード(Segmentのダウンロード完了時) xhr.onload = function(e)
{
//データの取得 (1 Segment)
data=new Uint8Array(this.response);
//帯域理論値の計算
mybps = endBitrateMeasurementByID(this.timeID,data.length);
//帯域の移動平均の計算
myBandwidth.calcWeightedBandwidth(parseInt(mybps));
//帯域に応じてRepresentationを変更
adaptation.switchRepresentation();
//バッファにデータをpush buffer.push(data, 2);
};
ファにプッシュする実装を行った。
Interestのタイムアウトが発生した場合、つまりInterestを満たすContent Objectがある一
定時間返ってこない場合には再送を行う。しかし、これではOut of OrderとなるChunkが発 生してしまう。Out of Orderとは図6.4に示すように要求した順番にコンテンツが返ってこな いことを示す。
図 6.4 Out of Orderの一例
Chunkの集合を元ファイルのSegmentに戻すためにはこのOut of Orderに対応して順番に
配列に格納する必要がある。一つずつのChunkは16進数の文字列が順番に含まれているので
受信したChunkの番号を取得することができるため、この番号をコンテンツの取得後に解析を
し、順番に配列に格納するような実装を行った。
6.3. ネットワーク帯域測定
図6.5に示すように帯域の測定方法は式(4.1)の測定方法を用い、重みをそれぞれ0.9と1.1と して移動加重平均で帯域の値を求めている。
図 6.5 帯域の測定方法
6.4. フロー制御
Interestを送る際はTCPのスロースタートフェーズと同じ制御で行っている。式(6.1)に示す
Chunk Number = 0 Chunk Number = 1 Chunk Number = 2 Chunk Number = 4
Chunk Number = 6 //Out of order (expected 4) Chunk Number = 7
Chunk Number = 8 Chunk Number = 4 Chunk Number = 5 Chunk Number = 9 Chunk Number = 10
//帯域測定
total_length: Segment Size (Total Chunk size) total_time: Receival Time for a segment _bps = ((total_length*8)/(total_time/1000));
//移動平均
this.weight_f = 0.9 this.weight_s = 1.1
this.bps = parseInt(((this.weight_f * this.bps) + (this.weight_s * _bps)) / 2) * 0.9
ように、Interestの初期値は1とし、Interestを満たすContent Objectが返ってきた際には輻 輳ウィンドウサイズ(送信するInterestの数)を1増やし、指数関数的に増加させている。最大の 輻輳ウィンドウサイズを32とし、最大値を達した場合には常に32個のInterestを送信してい る状態となる。
//max _𝑤𝑖𝑛𝑑𝑜𝑤 = 32
𝑐𝑤𝑛𝑑 = 1 (𝑖𝑛𝑖𝑡𝑖𝑎𝑙 𝑤𝑖𝑛𝑑𝑜𝑤 𝑠𝑖𝑧𝑒)
𝑐𝑤𝑛𝑑 = 𝑐𝑤𝑛𝑑 + 1 (𝑐𝑤𝑛𝑑 ≤ 𝑚𝑎𝑥 _𝑤𝑖𝑛𝑑𝑜𝑤)
(6.1)
また、式(6.2)に示すように Interest のタイムアウト(Interest を送って返ってこない時間間隔) は4秒と設定し、タイムアウトが発生した場合にはそのInterest の再送を行いかつ輻輳ウィン ドウサイズを初期値の 1 に戻す実装となっており、再度指数関数的に輻輳ウィンドウサイズを 増加させている。
//𝐼𝑛𝑡𝑒𝑟𝑒𝑠𝑡 𝑇𝑖𝑚𝑒𝑜𝑢𝑡 = 4
𝑐𝑤𝑛𝑑 = 1 (𝑖𝑓 𝐼𝑛𝑡𝑒𝑟𝑒𝑠𝑡 𝑇𝑖𝑚𝑒𝑑 𝑜𝑢𝑡) (6.2)
6.5. 画面レイアウト
図6.6はDASH-NDN-JSの画面レイアウトを示している。MPDファイルを記述するテキス
トフィールドを設け、入力することでMPDファイルを分析し動画コンテンツをNDN上で取得 を行って再生することが可能となる。現状ではDASH-JSがGoogle ChromeのMedia Source APIに依存しているのでGoogle Chromeのみで動作をすることができる。画面上には以下のロ グを出力させている。
送信したInterest名
取得したContent Objectの名
取得したContent Object(1 Segment分)のデータサイズ
Content Object(1 Segment分)を取得するまでに要した時間(RTT)
Content Object(1 Segment分)を取得した時のスループット値
Interest Timeoutが発生した数
再送したInterestの名
輻輳ウィンドウサイズ
帯域測定とコンテンツビットレートを現したグラフ
図 6.6 DASH-NDN-JS画面レイアウト