Wiresharkでiperf2パケットの中身を解析して分かった驚愕の事実

前回「iperf2のUDPフォーマットをwiresharkで見る」でWiresharkを使ってiperf2 UDPモードで送られているパケットを観測することに成功しました。
今回は受信したiperf2パケットの中身を見てみます。

片方向通信環境でiperf2を使うための下調べ (1)
http://mikioblog.dolphinsystem.jp/2019/09/iperf2-1.html

iperf2のUDPフォーマットをwiresharkで見る
http://mikioblog.dolphinsystem.jp/2019/10/iperf2udpwireshark.html

受信したiperf2のパケットの中身

下図は、受信したiperf2パケットの中身です。
前回の調査で、iperf2クライアント側がUDPパケットを送るたびにシーケンス番号が増えているのは確認しました。
またタイムスタンプも送られた時間が格納されているようです。

ですがそれ以降の、

  • flagsは意味不明
  • numThreadsは、送信スレッド数か? 134217728 (0x8000000)は大きすぎ?
  • mPortは、608664 (0x94998)?

などなどおかしな値が続いています。
なんだか良く分かりません。

よく見てみると、mPortの値は0123456……とダミーデータが入っています。
なんだこりゃ?


iperf2のソースコードを確認する

良く分からなかったら、ソースコードにあたります。
検索すると以下からダウンロード可能なので、ダウンロードして見てみます。

iperf2 - Browse Files at SourceForge.net
https://sourceforge.net/projects/iperf2/files/

~話が長くなるので省略~

iperf2には本家と分家があった

詳しい事情は存じませんが、iperf2はバージョン 2.0.5から分岐して開発が進められているようです。
本家と分家のようです。
で、"iperf2"と検索をすると分家の方が上位に表示されます。
iperf2に関しては分家の方が活発に開発が進んでいるからでしょうか?紛らわしいですね。



こちらが本家


こちらが分家


で、なんと本家と分家ではUDP送信時のパケットフォーマットが違うのです!

こちらが分家。


こちらが本家


どうも分家の方は、UDPパケットのnumThreadsやmPortなどは送らずダミーデータ(0123456……)で埋めているようです。
一方本家は、元々の仕様の通りnumThreadsなどを送っています。
で、Wiresharkの方は本家のフォーマットを元に解析しているので、numThreads等におかしなデータ表示がされていました。

まとめ

  • iperf2は、2.0.5以降本家と分家で開発が分かれている
  • "iperf2"と検索すると本家よりも分家が上位に表示される(ちなみに"iperf"とだけ日本語で検索すると"iperfの使い方紹介のページ"が上位を占めています。その一番上で紹介されているのは「別の分家」!)
  • 本家と分家のiperf UDPモードで送信するパケットフォーマットが違う
というわけです。
びっくりしました。同じソフトでもパケットフォーマットが違うというのは怖いですよね。
通常は同じiperfの同じバージョン間で測定すると思いますが、別々のPCで別々にダウンロードした場合、もしかすると本家と分家の別々のバイナリをダウンロードしてしまうかもしれません。
これだけなら笑い話で済むかもしれませんが、無線の送受信器開発をしている私たちは「あれ?バグか?」と自分のソースコードを疑い始めます。こうして明後日の方向にデバッグが進んでいき、工程に遅れが生じるのです。

メールニュースを最後までお読み頂いた方は、iperfの正しいインストールの仕方はもうお分かりですね?
×「iperfをインストールします」
○「http://iperf.frからiperf 2.0.9をダウンロードして、使用するすべてのPCに同じバイナリをインストールします」

深くまで見てみないと分からないことって本当にありますね。パケットの中身まで解析しておいて良かった良かった。

以上、ドルフィンシステム福島でした。


コメント