mcjoinによるMLDv2 IPv6マルチキャスト簡易検証

## 概要
MLDv2の理解のため、Ubuntu上で、network namespace + mcjoinを用いて、簡易動作検証を行う。

## 環境
* osxのmultipass上で動作するUbuntu20.04
* mcjoin version 2.1

## 準備
* mcjoinをインストールする
公式のbuilding for gitの手順でgitからソースコード取得して、ビルドする。

https://github.com/troglobit/mcjoin

<pre>git clone https://github.com/troglobit/mcjoin.git
cd mcjoin/
./autogen.sh
./configure && make
sudo make install-strip</pre>

なお、事前に以下インストールをしておくこと。

$ sudo apt-get install automake autoconf gcc make 

mcjoinのusageは以下の通り。

<pre>$ mcjoin -h
Usage: mcjoin [-dhjosv] [-c COUNT] [-f MSEC ][-i IFACE] [-l LEVEL] [-p PORT]
              [-r SEC] [-t TTL] [-w SEC]
              [[SOURCE,]GROUP0[:PORT] .. [SOURCE,]GROUPN[:PORT] |
               [SOURCE,]GROUP[:PORT]+NUM]</pre>

* network namespaceでレシーバとセンダーを作成する。
以下sunがマルチキャストのセンダー、moonがマルチキャストのレシーバである。

<pre>sudo ip netns add moon
sudo ip netns add sun
sudo ip link add sun-veth0 type veth peer name moon-veth0
sudo ip link set sun-veth0  netns sun
sudo ip link set moon-veth0  netns moon

sudo ip netns exec sun ip link set sun-veth0 up
sudo ip netns exec moon ip link set moon-veth0 up

sudo ip netns exec sun sysctl net.ipv6.ip_forward=1
sudo ip netns exec moon sysctl net.ipv6.ip_forward=1

sudo ip netns exec sun ip addr add 2001:db8::1/64 dev sun-veth0
sudo ip netns exec moon ip addr add 2001:db8::2/64 dev moon-veth0</pre>

## 検証
### (1)チャネル（*,G）: ASM(Any Source Multicast)

* マルチキャスト の配信を開始する。ソースアドレス（配信サーバのアドレス）は 2001:db8::1、グループアドレスはff2e::42。
<pre>sudo ip netns exec sun mcjoin -s ff2e::42 -i sun-veth0</pre>

* レシーバでグループに参加する。
<pre>sudo ip netns exec moon mcjoin ff2e::42</pre>

* レシーバを終了する。
<pre>ctrl + c</pre>

* tcpdumpでキャプチャ
以下のようにセンダーからマルチキャストパケットが配信される。

<pre>1	0.000000	2001:db8::1	ff2e::42	UDP	162	41888	41888 → 1234 Len=100</pre>

以下レシーバからReport(changed to exclude,グループアドレス ff2e::42 )が送信されている。
<pre>15	1.698231	fe80::9c81:aeff:fecd:bd8f	ff02::16	ICMPv6	90		Multicast Listener Report Message v2
Internet Control Message Protocol v6
    Type: Multicast Listener Report Message v2 (143)
    Code: 0
    Checksum: 0x67be [correct]
    [Checksum Status: Good]
    Reserved: 0000
    Number of Multicast Address Records: 1
    Multicast Address Record Changed to exclude: ff2e::42
        Record Type: Changed to exclude (4)
        Aux Data Len: 0
        Number of Sources: 0
        Multicast Address: ff2e::42</pre>

レシーバでmcjoin停止時、以下のようにReport(Changed to include)が送信されている。

<pre>48	5.865150	fe80::9c81:aeff:fecd:bd8f	ff02::16	ICMPv6	90		Multicast Listener Report Message v2
Internet Control Message Protocol v6
    Type: Multicast Listener Report Message v2 (143)
    Code: 0
    Checksum: 0x68be [correct]
    [Checksum Status: Good]
    Reserved: 0000
    Number of Multicast Address Records: 1
    Multicast Address Record Changed to include: ff2e::42
        Record Type: Changed to include (3)
        Aux Data Len: 0
        Number of Sources: 0
        Multicast Address: ff2e::42</pre>

### (2)チャネル（S,G）: SSM(Source Specific Multicast)
* マルチキャスト の配信を開始する。ソースアドレス（配信サーバのアドレス）は 2001:db8::1、グループアドレスはff2e::42。
<pre>sudo ip netns exec sun mcjoin -s ff2e::42 -i sun-veth0</pre>

* レシーバでグループに参加する。ソースアドレスに2001:db8::1を指定、グループアドレスにff2e::42を指定。
<pre>sudo ip netns exec moon mcjoin  2001:db8::1,ff2e::42</pre>

* レシーバを終了する。
<pre>ctrl + c</pre>

* tcpdumpでキャプチャ

以下のようにセンダーからマルチキャストパケットが配信される。

<pre>1	0.000000	2001:db8::1	ff2e::42	UDP	162	41888	41888 → 1234 Len=100</pre>

以下レシーバからReport(Allow new sources,ソースアドレス 2001:db8::1グループアドレス ff2e::42 )が送信されている。

<pre>22	2.779693	fe80::9c81:aeff:fecd:bd8f	ff02::16	ICMPv6	106		Multicast Listener Report Message v2
Internet Control Message Protocol v6
    Type: Multicast Listener Report Message v2 (143)
    Code: 0
    Checksum: 0x38f3 [correct]
    [Checksum Status: Good]
    Reserved: 0000
    Number of Multicast Address Records: 1
    Multicast Address Record Allow new sources: ff2e::42
        Record Type: Allow new sources (5)
        Aux Data Len: 0
        Number of Sources: 1
        Multicast Address: ff2e::42
        Source Address: 2001:db8::1</pre>

レシーバでmcjoin停止時、以下のようにReport(Block old sources)が送信されている。

<pre>52	6.486825	fe80::9c81:aeff:fecd:bd8f	ff02::16	ICMPv6	106		Multicast Listener Report Message v2
Internet Control Message Protocol v6
    Type: Multicast Listener Report Message v2 (143)
    Code: 0
    Checksum: 0x37f3 [correct]
    [Checksum Status: Good]
    Reserved: 0000
    Number of Multicast Address Records: 1
    Multicast Address Record Block old sources: ff2e::42
        Record Type: Block old sources (6)
        Aux Data Len: 0
        Number of Sources: 1
        Multicast Address: ff2e::42
        Source Address: 2001:db8::1</pre>


## 参考
https://journal.ntt.co.jp/backnumber2/0610/files/jn200610008.pdf

https://ipv4.kokatsu.jp/blog/ipv4/event/course/IPv6-multicast-textbook-jp.pdf