CCNxとの戯れ(その1)

Content-Centric Networking の導入とCeforeの基本操作

はじめに

CCNxはCCN (Content-Centric Networking)、あるいは情報指向ネットワークICN (Information-Centric Networking) のプロトコルです。このプロトコルで遊んでみましょう。

このプロトコルの実装としてはNICTが開発しているCefore (https://github.com/cefore) があります。このプログラムを導入してCCNxを実際に使ってみましょう。

dockerで導入するといろいろ遊べるのですが、まずは素のLinuxにCeforeを導入する手順から確認していきましょう。Ubuntu 22.04を対象に進めてみます。

Ceforeのインストール

コードの取得

まずは github からコードをcloneしていきます。

git clone https://github.com/cefore/cefore.git

これでコード一式が取得できます。2025年9月20日時点でmasterブランチのHEADはバージョン0.11.0になっています。

バージョンの互換性について

実は前バージョンである0.10.0gと0.11.0は互換性がありません。最新機能を試してみたい場合は0.11.0の系統、ほかに開発されたプログラムが0.10.0gを想定しているなら0.10.0gの系統を使ったほうがよいでしょう。

  • 0.10.0gまでのT_CHUNKなど、チャンク番号の取り決めは古いinternet-draft(期限切れ)に沿っています。
    draft-mosko-icnrg-ccnxchunking-02
  • 0.11.0のT_CHUNKなどは次のinternet-draftに沿っていますが、これも期限切れです。
    draft-mosko-icnrg-ccnxchunking-03
    draft-irtf-icnrg-ccnxchunking-01
  • 現在有効なinternet-draftではT_CHUNKがさらに変更になっているので注意しておきましょう。
    draft-irtf-icnrg-ccnxchunking-02

ビルド手順

それでは0.11.0を導入する手順をみていきます。基本的にはgithubのページにある通りです。


sudo apt install libssl-dev
sudo apt install automake
cd $CEFORE  # ceforeを展開したディレクトリ
# ※0.10.0gを導入するには以下のcheckoutを実行してから次に進みます
# (git checkout 0.10.0g)
autoconf
automake
./configure
make
sudo make install
sudo ldconfig

基本操作

Ceforeデーモンの起動

ceforeの本体はcefnetdというデーモンプログラムです。これを起動するためにcefnetdstartというコマンドを実行します。

cefnetdstart

問題なく起動できればcefstatusという状態表示コマンドで動作状態が確認できます。

起動中の例

$ cefstatus
CCNx Version     : 1
Port             : 9896
Rx Interest      : 0 (RGL[0], SYM[0], SEL[0])
Tx Interest      : 0 (RGL[0], SYM[0], SEL[0])
Rx ContentObject : 0
Tx ContentObject : 0
Cache Mode       : None
FWD Strategy     : None
Interest Return  : Disabled
Faces : 7
  faceid =   4 : IPv4 Listen face (udp)
  faceid =   0 : Local face
  faceid =  32 : Local face
  faceid =   5 : IPv6 Listen face (udp)
  faceid =   6 : IPv4 Listen face (tcp)
  faceid =   7 : IPv6 Listen face (tcp)
  faceid =   8 : Local face (for cefbabeld)
FIB(App) :
  Entry is empty
FIB :
  Entry is empty
PIT(App) :
  Entry is empty
PIT :
  Entry is empty

一方、cefnetdを終了させるにはcefnetdstopとします。起動していないときのcefstatus表示は以下のようになるでしょう。

起動中でないときの例

$ cefstatus
2025-09-21 14:13:35.298 [cefctrl] ERROR: cef_client_connect (connect:No such file or directory)
[cef_ctrl] ERROR: Failed to connect to cefnetd.

ファイル操作の実践

さて単独ホストでできることは限られるのですが、とりあえずファイルの取得をやってみましょう。cefputfileというコマンドで、指定されたファイルのデータにccnx:形式のURIを付与してCeforeに登録できます。

ファイルの登録

cefputfile ccnx:/test -f test.txt

この例ではtest.txtというファイルの中身を読み込み、ccnx:/test というURIでアクセス可能になります。なおデフォルトではブロックサイズが1024バイトのため、これより大きいファイルは1024バイトごとにチャンク番号をつけて管理されます。

ファイルの取得

cefgetfile ccnx:/test -f output.dat

この例ではccnx:/test というURIでCeforeにアクセスし、取得できたデータはoutput.datというファイル名で保存します。

実際の動作例

実際にcefputfileを試してみましょう。

$ cefputfile ccnx:/test -f test.txt
[cefputfile] Start
[cefputfile] Parsing parameters ... OK
[cefputfile] Init Cefore Client package ... OK
[cefputfile] Conversion from URI into Name ... OK
[cefputfile] Checking the input file ... OK
[cefputfile] Connect to cefnetd ... OK
[cefputfile] URI         = ccnx:/test
[cefputfile] File        = test.txt
[cefputfile] Rate        = 5.000 Mbps
[cefputfile] Block Size  = 1024 Bytes
[cefputfile] Cache Time  = 300 sec
[cefputfile] Expiration  = 3600 sec
[cefputfile] Start creating Content Objects
[cefputfile] Unconnect to cefnetd ... OK
[cefputfile] Terminate
[cefputfile] Tx Frames  = 1
[cefputfile] Tx Bytes   = 21
[cefputfile] Duration   = 0.004 sec
[cefputfile] Throughput = 51756 bps

以上のようにデフォルトでは5Mbpsで登録されたことがわかります。

キャッシュ機能の問題と対処

それではこのファイルを取得してみましょう。

$ cefgetfile ccnx:/test -f output.dat
[cefgetfile] Start
[cefgetfile] Parsing parameters ...OK
[cefgetfile] Init Cefore Client package ... OK
[cefgetfile] Conversion from URI into Name ... OK
[cefgetfile] Checking the output file ... OK
[cefgetfile] Connect to cefnetd ... OK
[cefgetfile] URI=ccnx:/test
[cefgetfile] Start sending Interests
[cefgetfile] Suspended to retrieve the content because the number of Interest retransmission has reached its limit, 5.
[cefgetfile] Unconnect to cefnetd ... OK
[cefgetfile] Terminate
[cefgetfile] Rx Frames (All)           = 0
[cefgetfile] Rx Frames (ContentObject) = 0
[cefgetfile] Received frame ... NG
[cefgetfile] Could not receive anything

このように、5回再送したが取得できなかったという結果になることでしょう。これはなぜかというと、ceforeの設定がCS_MODE=0になっており、キャッシュを利用しないようになっているからです。

キャッシュが無効な状態での取得方法

この状態でも取得したいなら、以下の手順を踏むことになります:

  1. cefgetfileで取得開始(5回までの再送状態に入る)
  2. cefgetfileがあきらめるまでのあいだにcefputfileを実行

このようにすると、cefgetfileが成功します。これはcefgetfileから来たinterestの有効期間(デフォルトで2秒)内に、要求されたccnxコンテンツがcefputfileでceforeに入ってきたと解釈できます。このときPITにそのオブジェクトのinterestが登録されているので、contentを返送します。

キャッシュ機能の設定

これだといかにも不便ですね。キャッシュ機能が特徴であるCCNを最大限に活用するにはキャッシュを有効にするのがよいでしょう。このため、先に述べたCS_MODEを変更します。

Ceforeをインストールすると、デフォルトで/usr/local/cefore/cefnetd.confというパスに設定ファイルが置かれます。適当なエディタを使い、管理者権限で編集しましょう。

設定ファイルの内容

# Content Store used by cefnetd
# 0 : No Content Store
# 1 : Use cefnetd's Local cache
# 2 : Use external Content Store (use csmgrd)
# 3 : Use external Content Store (use conpubd)
#CS_MODE=0
CS_MODE=1

デフォルトではCS_MODE=0なのでCS_MODE=1のように追記します。行頭に#があるとコメントとなって無効行になるので注意しましょう。

編集を終えたらcefnetdを起動し直します。


cefnetdstop
cefnetdstart

今度はcefnetdにキャッシュされるので、先にcefputfileをしてからcefgetfileをしても問題なくファイルデータが取得できます。


$ cefputfile ccnx:/test -f test.txt
$ cefgetfile ccnx:/test -f output.dat

補足: CS_MODE=2にすると、キャッシュ専用のプログラムであるcsmgrdを使うようになります。

まとめ

いずれにしてもCCNxではCCNx URIを指定してinterestという要求パケットを送り、それに対してcontent objectが返ってくるという動きになります。

実際に2ノード以上のあいだでCCNxパケットを飛ばすのは(その2)にしたいと思います。