プログラマ探偵の事件簿:イーサネットパケットタイプ=0x0000の謎!
助手の猫がこの世を去って一ヶ月ほど過ぎた頃、
Ethernet Type が0x0000はLLCを示すことを知った時の話である。
事件のはじまり
TWSNMP FCのイーサーネットタイプのレポートに関するマニュアルを書いていた時のことである。イーサネットタイプが0x0000が、そこそこの回数記録されているいることに気づいた。
他のネットワークをモニタしているTWSNMP FCでも観測されている。そういえばこのレポート画面を作っていた時にも気になっていたのを思い出した。「ちゃんと調べておけよ!」とどこからか言われたような気がした。
果たして、これは何のパケットなのか?
本当にそのようなパケットが流れているのか?
イーサネットタイプレポートの情報の元になっているtwpcapセンサーが嘘の報告をしているかもしれない。そこでパケットキャプチャーしてみることにした。
WireSharkで
ether proto 0x0000
のようにフィルターをかけてパケットをキャプチャーしてみた。
キャプチャーを開始した直後には何も表示されない。やはりtwpcapセンサーのバグかもしれないと思いながら朝食の間、様子を見ることにした。朝食後にみると
2つキャプチャーできていた。LLCのパケットであった?
Ethernet Type = 0x0000はLLC?!
LANのEthernetには業界標準の規格と国際的な規格(IEEE802.3)がある。世の中で広く使われているは業界標準のほうである。Ethernet Typeは業界標準のほうの決まりでイーサネットのパケットの種類を表している。(例えばIPv4,IPv6,ARPとか)
国際規格のほうではパケットの同じ場所の値はパケットの長さを示すようになっている。イーサネットのパケットの長さは常に1500以下なので業界標準のEthernet Typeは1500より大きな値で定義されているので共存することができる。
この事件で私は大きな誤解をしていた。Ethernet Typeの値が0になっている異常なパケットがネットワーク上を流れていると考えていたのである。
そうではなかったようだ!
どうやら、ソフトウェア上、国際的な規格(IEEE802.3)のパケットのEthrnet Typeは0x0000として扱う決まりがあったようだ!
gopacketのソースコードを読んでみる
twpcapセンサーで利用しているgopacketのソースコードを調べてみた。
と
でIEEE802.3のパケットのEthernetTypeを0x0000にしている。
WireSharkでも同じ解釈にようだ。私が知らなかった暗黙のルールかもしれない。
TWSNMP FCに定義を追加して解決
今回はTWSNMP FCのレポート作成処理に
のように定義を追加して解決した。
国際標準できちんと決めようとしても不便な決まりのために業界標準の便利な方法使われている例は沢山ある。そのギャップを埋めるためにソフトウェアの処理に暗黙のルールが存在するのかもしれない。それに気づかないためのバグを沢山あるのだろうと思う。
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。