NICT開発のCeforeの話

#初めに
最初に書いたのが2019/08だったのですが、現在(2019/11/01)NICTのサイトからファイルがダウンロードできない状態です。そのため今読んでも実験をすることはできません。また何か更新があればここも更新する予定です。
- 2019/11/08　追記：現在はDLできるようです。

#Ceforeとは
NICT開発のICN/CCN開発用オープンソースプラットフォーム
ICN/CCNに関しては、ざっくりいうとIPではなく、URIで経路制御できるようにしようね。URIで経路制御するから、同一のURI要求に対しては経路上のノードにキャッシュがあればそこから引っ張れて人気コンテンツに対してトラフィック減らせるね。現状のCDNと違って、すべてのパケットが対象になるから公平性が云々みたいな話。超適当なので詳しいことはググってほしい。2件くらいQiitaにCCN関係の記事があるので興味がある方はそっちを見た方がいいかも。
当記事ではCCNで用いられる用語である**interest**、**Data**、**CS**、**PIT**、**FIB**辺りは既知であることを前提に進めますので悪しからず。

Ceforeについて、転送用のデーモンとして**cefnetd**、コンテンツキャッシュ用のデーモンとして**csmgrd**が用意されています。独立した動作をするため、動作させるノードによって処理に幅を持たせ、スケーラブルな環境構築ができるのも特徴。基礎としてcefnetdがあるのだが、csmgrd以外にもプラグインを追加して様々な機能を追加することも可能である。

#記事を書く目的
悪口ではないんですが、NICTのリファレンスが個人的にいまいちわかんなかったので、適当に記録しておこうという話。単純に情報源が公式しかないので、記事が全くなくて非常につらい。簡単に遊べるので気軽に触ってほしい……。
また、PCウルトラ初心者なので基本的に間違いが散見されると思いますが、嘲りながら指摘していただければ幸いです。
また、この記事はあくまでも簡単にCeforeを動かそうと言う記事で、どう言う動作をしてるみたいな部分はだいぶ省いてます。細かい設定等がしたい場合には公式のパワポを参照するといいと思いますが、ちょっと古いので変更点が結構あります。よくわかんないことがあったら聞いてみてください。答えれられる範囲で答えるか頑張って調べます。

#環境
まずは、NICT側が出してる動作環境

|OS|OSバージョン|コンパイラ|ライブラリ|
|:-----------:|:------------:|:------------:|:---:|
|Ubuntu|16.05LTS|gcc 5.4.0 or later|libssl-dev|
|MacOS|El Capitan, Sierra, HighSierra|Xcode 7.3.1 or later|libssl-dev|

当方が執筆中(2019/08/24)に使用している環境

|OS|OSバージョン|コンパイラ|ライブラリ|
|:-----------:|:------------:|:------------:|:---:|
|Ubuntu|18.04.3LTS|gcc 7.4.0|libssl-dev|

一応MacやらRasberry-piやらでも動かしましたが、かったるいしメイン環境ではないので、今回はその説明は省きます。
また、今回話す具体的手順についてはUbuntu用のもので、MacOS上では多少手順が異なります。Rasberry-pi上では同一です。
- 2019/11/08追記：Ubuntu19.10でも元気に動きます。
- 2019/12/02追記：raspberry pi4 4GBモデルでUbuntu19.10を動かせば問題なく動きます。

使用するマシンは、とりあえずMEMが4GB載ってるノードが2台あればこの記事に書いてあることは一通りできるはずです。動作確認で4GB以上のノードが1台は欲しいので、もう一台はラズパイでも大丈夫です。
- 2019/12/02追記：ラズパイでの使用時、csmgrdプラグインを有効化しようとする場合はraspianでは無理みたいです。Ubuntu19.10では動作してくれました……よかった。

#Cefore導入
- 必要なパッケージのDL
 - 公式ホームページ( https://www.ieice.org/~icn/cefore )のDownloadから、**source code(cefore-x.x.x.zip)**のリンクを拾ってきてwgetでもして取得してください。(たまにURLが変わるので「Cefore nict」とでも検索するといいです)
 - 大きな変更がなければzipファイルだと思いますので、適当にunzipして好きなディレクトリに保管してください。とりあえず著者はhome/username/以下に置いてます。解凍後は、とりあえずcefore-x.x.xのディレクトリができると思うのでその場所に移動した上で以下ビルドと必要ライブラリのインストールをして行きます。

- 必要なライブラリ、コンパイラのインストール、ビルド

```code:install_lib
$ sudo apt-get install libssl-dev automake make gcc
$ autoconf
$ aclocal
$ automake
$ ./configure --enable-csmgr
$ make
$ sudo make install
$ sudo ldconfig
```
- リビルド時には必ず`make clean`コマンドを走らせてから行うようにしてください。

-  設定調整
  - 初回起動時前にやることは2つ
     - */usr/local/cefore/cefnetd.conf*の*CS_MODE*を2に変更
     - 起動前に以下のシェルでバッファを調整すること。PCの起動毎にリセットされるため、毎度毎度実行する必要があるので注意。

```shell:buffer.sh
#!/bin/bash
_cef_mem_size=10000000
sudo sysctl -w net.core.rmem_default=$_cef_mem_size
sudo sysctl -w net.core.wmem_default=$_cef_mem_size
sudo sysctl -w net.core.rmem_max=$_cef_mem_size
sudo sysctl -w net.core.wmem_max=$_cef_mem_size
```

- Cefore主要デーモンの起動

```code:wakeup
$sudo csmgrdstart
$sudo cefnetdstat
```

csmgrdに関して、MEMが2GB以下のノードだと動作しないらしい(未確認)ので、注意。推奨は4GB以上です。
- 追記の未確認情報なんですが、Hyper-V環境下で2048MBにメモリを制限した場合にはcsmgrdが起動しません。4096MBだとすんなり動くので、仮想環境下で動かす場合にはケチらず4G強用意するのが良さそうです。

- 各デーモンのステータス確認

```code:status
$ cefstatus
$ csmgrstatus
```

これ叩いて動けば多分問題ないです。*cefstatus*実行後、*Cache Mode : Excange*になっていれば無問題のはず。

#Cefore動作確認
では簡単に動作確認をやっていきます。
1台でも動作自体はしますが、2台のノード(IPを持つ端末が2つの意味)を利用するので、あれば上記手順を2台分済ませておいてください。
また、今回はテストとしてなんか適当なファイルを使用するのでechoコマンドとかで生成してもいいです。文中では先程作った(であろう)シェルスクリプト(buffer.sh)を使いますが、別に何でもいいです。できれば30MB以下だといいです。混乱しないと思うので。(理由は後述)
以下コンテンツを配信する側をnodeP、受信側をnodeCと呼称して話を進めます。
各ノードのIPはそれぞれnodeP:192.168.1.111, nodeC:192.168.1.222

```code:nodeP
$ cefputfile ccn:/test/buffer.sh #URIとファイルを指定して、コンテンツのアップロード
---cefputfile log---
```

```code:nodeC
$ sudo cefroute add ccn:/test/ udp 192.168.1.111 #FIBへ経路登録。パーミッションの関係でsudoしないと弾かれます
$ cefgetfile ccn:/test/buffer.sh
---cefgetfile log---
```

成功していれば、nodeC上でcefgetfileコマンド実行時のカレントディレクトリにbuffer.shがあるはずです。
また、nodeA上で動作するcsmgrdにbuffer.shがキャッシュされている間はcsmgrstatus ccn:/とスキームまで指定すればキャッシュしているコンテンツの情報が見られます。nodeCからアクセスすると、アクセスカウントの欄が増加しますので、確認してみて下さい。
怠惰なので試してないんですが、30MB以上のサイズを持つファイルをアップロードした場合にはcsmgrstatusコマンドを走らせた際に複数のコンテンツが見えるはずです。これは1つのキャッシュコンテンツのサイズが30MBで管理されてるという話で、設定ファイル(cefnetd.conf)から変更可能です。

#最後に
ここまで読んでくださって助かります。本当に恐ろしく記事がないし動作に関して何もわからないし細かいこともマニュアルが公開されてない( https://cefore.net/instruction )しで詰みで死ぬほど非効率に動いてます。助けて。
今後、またちまちま更新する予定ではありますが、とりあえずPythonで動作制御を行えるCefpycoを動かそうと奮闘してます。興味がある、何かわからない場所があると言うところがあればコメントで共有してもらえれば頑張るので触って……多分解決できないとは思いますが………