Table of Contents
先週くらいから巷でズンドコズンドコ騒いでいると思ってはいたが、昨日ようやくその元ネタを見た。 以下のツイートだ。
Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから
— てくも (@kumiromilk) 2016年3月9日
「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた
面白い。 巷ではこれをいろんな言語で実装したりしているみたいでさらに面白い。
私もこのビッグウェーブに乗らないわけにいかないので、専門分野であるネットワーク周りを開拓しようと思い、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つのクラス。(といくつかのインナークラス。)
- com.github.kaitoy.zundoko.protocol.ZundokoPacket: Pcap4JがZundokoパケットを解析するのに使うクラス
- com.github.kaitoy.zundoko.protocol.ZundokoServer: Zundokoサーバ
- com.github.kaitoy.zundoko.protocol.ZundokoClient: Zundokoクライアント
ビルド
今だにMaven。
以下を実行するとビルドできる。
git clone https://github.com/kaitoy/zundoko-protocol.git
cd zundoko-protocol
mvn install
サーバ/クライアントの使い方
下位レイヤがEthernetなのでネットワークセグメントを超えたZundokoパケットのやり取りはできない。 よってまずは同一ネットワーク内にサーバマシンとクライアントマシンを用意する。 VMware Playerのホストとゲストで可。
サーバマシンとクライアントマシンにはWinPcapかlibpcapをインストールしておく。
依存ライブラリをダウンロードするため、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フィールドの値を表示する。