IPv6テストツールを用いてIPv6の疎通確認を行う

# はじめに
コンピューター間でIPv6で疎通確認を行うツールの作成方法、環境構築手順などをまとめました。

本記事で紹介しているツールで、IPv4の疎通確認を行うことも可能です。

IPv6の仕様については、本記事での説明は割愛します。
以下のサイトに詳しくまとめられていました。

https://www.geekpage.jp/ipv6/


# サンプルコード

下記のMicrosoftのサンプルコードを使用しました。

https://learn.microsoft.com/ja-jp/windows/win32/winsock/ipv6-enabled-server-code-2

https://learn.microsoft.com/ja-jp/windows/win32/winsock/ipv6-enabled-client-code-2



## オプション

上記のサンプルコードをそのまま実行する場合に使用できるオプションを紹介します。

|オプション|概要|値|説明|
|-|-|-|-|
|-f|通信プロトコルを指定する|PF_INET<br>PF_INET6<br>PF_UNSPEC★|IPv4を指定<br>IPv6を指定<br>IPv4 または IPv6|
|-t|トランスポート層でのプロトコルを指定する|TCP★<br>UDP|TCPを指定する<br>UDPを指定する|
|-p|ポート番号を指定する|5001★|任意のポート番号を指定する|
|-a|バインドするIPアドレスを指定する|デフォルトでは未指定で実行される|任意のIPアドレスを指定する|

* クライアント

|オプション|概要|値|説明|
|-|-|-|-|
|-s|サーバーのIPアドレスを指定する|::1★|サーバーのIPアドレスを指定する|
|-f|通信プロトコルを指定する|PF_INET<br>PF_INET6<br>PF_UNSPEC★|IPv4を指定<br>IPv6を指定<br>IPv4 または IPv6|
|-t|トランスポート層でのプロトコルを指定する|TCP★<br>UDP|TCPを指定する<br>UDPを指定する|
|-p|ポート番号を指定する|5001★|任意のポート番号を指定する|
|-b|送信する追加のバイト数|0★|任意の追加バイト数を指定する※|
|-n|実行する送信の数|1★|任意の数を指定する|

★のついた値がオプションで指定しなかった場合のデフォルト値となります。

※クライアントのオプション「-b」で任意の値を指定した場合、デフォルトで送信される10バイトに加算されて送信が実行されます。

例：`Client.exe -b 5`を実行した場合、10+5バイトの送信が行われます。
`Sent 15 bytes (out of 15 bytes) of data: [Message #1 !"]`


# ビルド方法

* VisualStudio2022を使用しました。
* 今回は、サーバーとクライアントの２つのプロジェクトを作成・ビルドします。
以下の手順をそれぞれのプロジェクトで行ってください。

1.　VisualStudio2022を起動し「新しいプロジェクトの作成」→「空のプロジェクト(C++)」を選択し、任意のプロジェクト名・作業場所を指定し、プロジェクトを作成

2.　ソリューションエクスプローラーから「ソースファイル」を右クリックし、「追加」→「新しい項目」を選択し、ソースファイルを作成

3.　2で作成したソースファイルに、サーバーまたはクライアントのMicrosoftのサンプルコードをコピー&ペーストする

4.　エラーがない状態で、構成：Release、プラットフォーム：x64を選択し、ビルドを実行する



# IPv6環境構築方法

サーバー・クライアント間でIPv6の疎通確認を行うために、以下の環境設定を行いました。

https://atmarkit.itmedia.co.jp/ait/articles/1207/05/news118.html

* 上記の記事の「IPv6アドレスの手動設定」の方法で設定しました。
※ デフォルトゲートウェイの設定はDHCPにより自動で適用されるため、空欄で設定しました。

# 実行環境

## サーバー側

|||
|-|-|
|**OS**|**Windows11**|
|**バージョン**|**22h2**|

```
イーサネット アダプター Ethernet0:

   接続固有の DNS サフィックス . . . . .:
   IPv6 アドレス . . . . . . . . . . . .: 2001:db8:beef:beef::1001
   リンクローカル IPv6 アドレス. . . . .: fe80:xxxx::
   IPv4 アドレス . . . . . . . . . . . .: 192.168.xxx.xxx
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: ::
                                         192.168.xxx.xxx
```
* サーバー側環境で実行するサーバーツールを、`Server.exe`とします。

## クライアント側
|||
|-|-|
|**OS**|**Windows11**|
|**バージョン**|**22h2**|

```
イーサネット アダプター Ethernet0:

   接続固有の DNS サフィックス . . . . .:
   IPv6 アドレス . . . . . . . . . . . .: 2001:db8:beef:beef::1002
   リンクローカル IPv6 アドレス. . . . .: fe80:xxxx::
   IPv4 アドレス . . . . . . . . . . . .: 192.168.xxx.xxx
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 
```

* クライアント側環境で実行するクライアントツールを、`Client.exe`とします。

# 使用例

## 実行方法
前提：前項と同じ手順で環境構築を行っていること
1. サーバー環境、クライアント環境でビルドしたサーバーツールまたはクライアントツールを配置する
2. サーバー環境で、server.exeをダブルクリックして実行する(引数などの指定は不要)
3. クライアント環境で、コマンドプロンプトを起動し、Client.exeが存在するディレクトリに移動し、以下のコマンドを実行する
```
Client.exe -s 2001:db8:beef:beef::1001(サーバーのIPv6アドレス) -f PF_INET6
```

## 実行結果

* サーバー
```
'Listening' on port 5001, protocol TCP, protocol family PF_INET6
'Listening' on port 5001, protocol TCP, protocol family PF_INET

---受信---
Accepted connection from 2001:db8:beef:beef::1002
Received 10 bytes from client: [Message #1]
Echoing same data back to client
Client closed connection
```

* クライアント
```
C:\Users\xxx\Desktop\Client.exe -s 2001:db8:beef:beef::1001 -f PF_INET6
socket call with family: 23 socktype: 1, protocol: 0
Attempting to connect to: 2001:db8:beef:beef::1001
Connected to 2001:db8:beef:beef::1001, port 5001, protocol TCP, protocol family PF_INET6
Using local address 2001:db8:beef:beef::1002, port 65279
Sent 10 bytes (out of 10 bytes) of data: [Message #1]
Received 10 bytes from server: [Message #1]
Done sending
Server closed connection
```

# おわりに
IPv4の疎通確認方法やツール紹介している記事は見つけられましたが、IPv6の場合の手順やツールを紹介している記事が見つけられなかったため、本記事がIPv6関連の開発を行う方の役に立てばいいなと思います。

IPv6について、まだまだ学ぶべきことがたくさんあるため、引き続き勉強をしていきたいと思います。


# 参考

https://www.geekpage.jp/ipv6/

https://atmarkit.itmedia.co.jp/ait/articles/1207/05/news118.html

https://beginners-network.com/ipv6_address_config.html

https://learn.microsoft.com/ja-jp/windows/win32/winsock/ipv6-enabled-server-code-2

https://learn.microsoft.com/ja-jp/windows/win32/winsock/ipv6-enabled-client-code-2

# その他のテストツール
以下のURLは、IPv4向けのテストツールのダウンロードサイトです。

http://nonsoft.la.coocan.jp/Download/SocketTool/index.html

http://nonsoft.la.coocan.jp/Download/UdpTool/index.html