1.0 CCN Tutorial Demo を試してみた

#はじめに
必要に駆られて今頃Qiita に登録、せっかくなので初投稿してみる。
##CCN とは
CCN はContent-Centric Networking のこと。実装方式や立ち位置によって少し呼称が変わる。
ICN(Information-Centric Networking) とか、NDN(Named Data Networking) とか、
CON(Content Oriented Network) とかとか。

ネットワーク層をロケータベースからID ベースにしようという提案。
現在、**ネットワーク層**は**IP** をベースとして全ての機器が繋がっている。
つまり、ホストベースで通信している。
が、しかし、昨今のユーザはそういう**特定のホスト**に繋がることは求めてなくて
**「コンテンツ」**に繋がることを求めているんじゃないの？
アプリケーション層(主にWeb 通信)ではDNS 然り、LB 然り、
コンテンツを意識した動きをしてるよね？
だったら、ネットワーク層もコンテンツ中心の通信をしようよ！
・・・と言う感じの試みかと。

つまり、**「IPアドレスベースの通信からコンテンツIDベースの通信に変えよう」**
ということです。

コンテンツIDってなんぞ、ですが
これは実装方式によって色々あります。
**「コンテンツ」**に対してつけるID です。（そのまま）

ネットワークを成すプロトコルもコンテンツベースにしてしまった方が
色々と都合が良くない？という感じですね。
**色々**の部分はそれこそ色々と研究されてます。
セキュリティの観点からの試みもあります。

**「え IP どうするの？」**に対しては
IP は下層レイヤのプロトコルになるのだと思います。

この提唱は以下の論文が
世の中で注目を浴びた物の中では最初かなーと思います。

```
Jacobson, V. Networking named content. 
In Proceedings of the 5th International Conference on Emerging Networking Experiments and Technologies (New York, NY, USA, 2009), CoNEXT ’09, ACM, pp. 1–12.
```

TCP の輻輳回避アルゴリズムで有名な殿堂入りのVan Jacobson さんですね。
ですので、今回の1.0 CCN Tutorial Demo もPARC が公開しているモノです。

この技術、気づけばぼちぼち商用化(国内でも)もかなり進んでいるようなので
今回投稿してみました。

#試験環境
以下の環境を使用しました。

- VMware Fusion Pro 7.1.3

|||
|:---|:---|
|CPU|1 vCPU|
|Memory|1 GB|
|Disk|20 GB|
|OS|Ubuntu 16.04 Server|
|Package|standard system utilities, openssh server|

#環境構築
CCN Tutorial Demo を行うための環境を構築します。

## Package Install
追加で必要なパッケージをインストールします。

```Bash
$ sudo apt-get update
$ sudo apt-get install gcc make libevent-dev libssl-dev
```
## Software Download
[ここ](https://www.ccnx.org/software-archives/)からソフトウェアをダウンロードしてきます。
自分の環境に合った**CCN Developer Kit** と**Tutorial Demo sample application** が必要です。

- CCN Developer Kit

```Bash
$ wget http://www.ccnx.org/releases/ccnx-1.0-r20150302-x86_64.tgz
```

- Tutorial Demo sample application

```Bash
$ wget http://www.ccnx.org/releases/ccnx-1.0-tutorial-r20150302-all.tgz
```

## Software Install
1.CCN Developer Kit

- 解凍

```Bash
$ tar xvfz ccnx-1.0-r20150302-x86_64.tgz
```

- 移動

```Bash
$ sudo mv usr/local/ccn/ /usr/local/
```

2.Tutorial Demo sample application

- 解凍

```Bash
$ tar xvfz ccnx-1.0-tutorial-r20150302-all.tgz
```

- インストール

```Bash
$ cd ccnx-1.0-tutorial-r20150302/
$ ./configure --with-longbow=/usr/local/ccn  \
               --with-libparc=/usr/local/ccn \
               --with-libccnx=/usr/local/ccn \
               --prefix=$HOME/ccn
$ LD_RUN_PATH=/usr/local/ccn/lib make
$ make install
```

#やってみる
デモの内容はサーバプログラムとクライアントプログラムの間で
CCN を経由してコンテンツ（任意のファイル）のやり取りを行う、というものです。

## Metis の起動
Metis はCCNx forwarder です。

```Bash:Metis起動
$ cd ~/
$ /usr/local/ccn/bin/metis_daemon &
```

```Bash:Metis起動プロンプト
y-kawamata@ccn000:~$ Copyright 2015 Palo Alto Research Center (PARC), a Xerox company.
All Rights Reserved. Use is subject to license terms.
            __  __        _    _
           |  \/  |  ___ | |_ (_) ___
           | |\/| | / _ \| __|| |/ __|
           | |  | ||  __/| |_ | |\__ \
           |_|  |_| \___| \__||_||___/

metis running port 9695 configuration-port 2001

y-kawamata@ccn000:~$ 
```

## コンテンツの準備
適当なコンテンツをでっち上げます。
このファイル名がコンテンツIDになります。

```Bash:サーバ用フォルダ作成&コンテンツ作成
$ mkdir Server
$ cd Server/

$ vi hoge_hoge_video 
```

```Bash:hoge_hoge_video
y-kawamata@ccn000:~/Server$ cat hoge_hoge_video
 _________________
< Now I am a cock >
 -----------------
    \
     \  /\/\
       \   /
       |  0 >>
       |___|
 __((_<|   |
(          |
(__________)
   |      |
   |      |
   /\     /\
y-kawamata@ccn000:~/Server$
```

```Bash:MD5
y-kawamata@ccn000:~/Server$ ls -la
total 12
drwxrwxr-x 2 y-kawamata y-kawamata 4096 May  8 23:31 .
drwxr-xr-x 6 y-kawamata y-kawamata 4096 May  8 23:31 ..
-rw-rw-r-- 1 y-kawamata y-kawamata  194 May  8 23:31 hoge_hoge_video
y-kawamata@ccn000:~/Server$

y-kawamata@ccn000:~/Server$ md5sum hoge_hoge_video
ea3d16e3cd7e0e1f3e274ed5e0f320f2  hoge_hoge_video
y-kawamata@ccn000:~/Server$
```

## サーバの起動
コンテンツを作成した場所のパスを引数にして起動します。

```Bash:サーバ起動
$ $HOME/ccn/bin/tutorial_Server `pwd`
```

この時点でサーバのkeystore が生成されます。

```Bash:tutorialServer_keystore
y-kawamata@ccn000:~/Server$ ls -la
total 16
drwxrwxr-x 2 y-kawamata y-kawamata 4096 May  8 23:34 .
drwxr-xr-x 7 y-kawamata y-kawamata 4096 May  8 23:37 ..
-rw-rw-r-- 1 y-kawamata y-kawamata  194 May  8 23:31 hoge_hoge_video
-rw------- 1 y-kawamata y-kawamata 1662 May  8 23:34 tutorialServer_keystore
y-kawamata@ccn000:~/Server$
```

## クライアントでサーバからコンテンツを取ってくる
**別窓**を開きます。
同じホスト内でCCN を形成しています。

```Bash:クライアント用フォルダ作成
$ mkdir Client
$ cd Client/
```

フォルダの中身が空であることを確認します。

```Bash:Clientフォルダの中身
y-kawamata@ccn000:~/Client$ ls -la
total 8
drwxrwxr-x 2 y-kawamata y-kawamata 4096 May  8 23:37 .
drwxr-xr-x 7 y-kawamata y-kawamata 4096 May  8 23:37 ..
y-kawamata@ccn000:~/Client$
```

*hoge_hoge_video* (=コンテンツID) の取得をCCN 内に要求します。
つまり、この方式ではコンテンツID が既知であることが前提です。

```Bash:コンテンツ要求
$ $HOME/ccn/bin/tutorial_Client fetch hoge_hoge_video
File 'hoge_hoge_video' has been fully transferred in 1 chunks.
```

## 確認
クライアントのフォルダ内にサーバのフォルダ内で作ったコンテンツが
取得されている事を確認します。

```Bash:クライアントフォルダの中身
y-kawamata@ccn000:~/Client$ ls -la
total 16
drwxrwxr-x 2 y-kawamata y-kawamata 4096 May  8 23:38 .
drwxr-xr-x 7 y-kawamata y-kawamata 4096 May  8 23:37 ..
-rw-rw-r-- 1 y-kawamata y-kawamata  194 May  8 23:38 hoge_hoge_video
-rw------- 1 y-kawamata y-kawamata 1662 May  8 23:38 tutorialClient_keystore
y-kawamata@ccn000:~/Client$
```

```Bash:取得したコンテンツ
y-kawamata@ccn000:~/Client$ cat hoge_hoge_video
 _________________
< Now I am a cock >
 -----------------
    \
     \  /\/\
       \   /
       |  0 >>
       |___|
 __((_<|   |
(          |
(__________)
   |      |
   |      |
   /\     /\
y-kawamata@ccn000:~/Client$
```

```Bash:MD5の確認
y-kawamata@ccn000:~/Client$ md5sum hoge_hoge_video
ea3d16e3cd7e0e1f3e274ed5e0f320f2  hoge_hoge_video
y-kawamata@ccn000:~/Client$

> y-kawamata@ccn000:~/Server$ md5sum hoge_hoge_video
> ea3d16e3cd7e0e1f3e274ed5e0f320f2  hoge_hoge_video
> y-kawamata@ccn000:~/Server$
```

#さいごに
ざっくりとした説明、ざっくりとした動作確認でした。
これだけだとCDN か何かみたいですね。
ファイル共有とかファイル転送のアプリの様な・・・・。
次回は気が向いたらCCNx とか PyCCN の環境構築の記事でも書いてみようかなと思います。
PyCCN 使ってCCN らしいことをしました！って記事も書いてみたいですね。
何かアイデア無いかな。