先週くらいから巷でズンドコズンドコ騒いでいると思ってはいたが、昨日ようやくその元ネタを見た。 以下のツイートだ。

面白い。 巷ではこれをいろんな言語で実装したりしているみたいでさらに面白い。

私もこのビッグウェーブに乗らないわけにいかないので、専門分野であるネットワーク周りを開拓しようと思い、ZUNDOKOプロトコルというものを考案して実装してみた。書いたソースはGitHubにおいた。

ZUNDOKOプロトコル

クライアントはサーバに「ズン」か「ドコ」を送る。

サーバは「ズン」を4回受信した後に「ドコ」を受信するとクライアントに「キ・ヨ・シ!」を返す。

クライアント/サーバ間でやり取りするメッセージ(Zundokoパケット)のフォーマットは下図。

 0                            15                              31
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             zundoko (null-terminated string)                  |
|                                                               |
|                                                               |
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

要はzundokoフィールドがあるだけ。 このzundokoフィールドは20 byte固定長で、NULL (0x00)で終わるUTF-8の文字列を保持する。

このメッセージを運ぶ下位レイヤはEthernetで、EtherTypeは0x01FF。

Ethernetにした理由は実装(下記)が楽だから。 EtherTypeはIANAでExperimentalとされている範囲から適当に選んだ。もちろんIANAに登録などはしていない。

因みに、Ethernetヘッダを加えた、クライアント/サーバ間でやり取りする完全なパケットは以下の様になる。(プリアンブルとかは除く。)

 0                            15
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Dst Hardware Address       |
+                               +
|                               |
+                               +
|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Src Hardware Address       |
+                               +
|                               |
+                               +
|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    EtherType (0x01FF)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        zundoko                |
| (null-terminated string)      |
|                               |
|                               |
|                               |
|                               |
|                               |
|                               |
|                               |
|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            padding            |
|                               |

実装

Pcap4Jを使ってクライアントとサーバを実装した。 書いたのは以下の3つのクラス。(といくつかのインナークラス。)

ビルド

今だにMaven

以下を実行するとビルドできる。

git clone https://github.com/kaitoy/zundoko-protocol.git
cd zundoko-protocol
mvn install

サーバ/クライアントの使い方

下位レイヤがEthernetなのでネットワークセグメントを超えたZundokoパケットのやり取りはできない。 よってまずは同一ネットワーク内にサーバマシンとクライアントマシンを用意する。 VMware Playerのホストとゲストで可。

サーバマシンとクライアントマシンにはWinPcaplibpcapをインストールしておく。

依存ライブラリをダウンロードするため、zundoko-protocol\bin\cdして以下のコマンドを実行する。(要Maven。)

configure.bat

サーバを起動するには、zundoko-protocol\bin\で以下のコマンドを実行する。

run-server.bat

起動するとZundokoパケットをやり取りするネットワークインターフェースを聞かれるので、 クライアントとL2レベルでつながっているものを選ぶ。 選んだインターフェースのMacアドレスはクライアントの起動に使うのでメモしておく。

クライアントを起動するには、zundoko-protocol\bin\で以下のコマンドを実行する。

run-client.bat <Macアドレス>

<Macアドレス>にはサーバ起動時にメモしたMacアドレスを入力する。 起動するとZundokoパケットをやり取りするネットワークインターフェースを聞かれるので、 サーバとL2レベルでつながっているものを選ぶ。

クライアントが起動すると、一秒おきに「ズン」と「ドコ」をランダムに選び、 サーバに送りつつコンソールに表示する。 また、サーバからZundokoパケット受信したらそのzundokoフィールドの値を表示する。

実行例