でかパケット

ある機械のLAN通信が不安定と言うことで、ちょっとパケットを採取してみることになった。
いいよね、パケットキャプチャ。何かこう、自分みたいなエンジニアもどきが、いっちょ前のエンジニアっぽく見えるあたりが。

バカハブやミラーポート付のスイッチングハブが無かったので、取り敢えずデータを送っているPCに直接WireSharkを仕込んでパケットを取ってみた。

初めは普通に3ウェイハンドシェイクが行われて、さてデータ送信ってところで……なんじゃこりゃ。フレームサイズが13000Byteもあるんですが……?

あ、これってあれか。「ジャンボフレーム!」(ハイ、ムカミ!)

まあ、だとしたら、この機械がジャンボフレーム未対応製品なんじゃね?はい一件、らくちゃ……

……あれ、でも待てよ。スイッチやルータみたいな中間の機器類が対応していないってのなら分かるけど、TCPでは双方で受信可能なパケットサイズの確認をとってから、最大受信サイズの小さい方に合わせてデータ送るよなぁ。と思って、双方のSYNパケットを見てみたら、ちゃんとどっちもMSS=1460って記載されてる。

ってことは何か。PC側は、自分は1パケットのデータサイズ1460byteで送るよーって言っておきながら、その10倍近い大きさのデータを送りつけているということか。何て卑劣なPCだ。あれだ、マラソン大会で一緒に走ろうとか言っておいて、さっさと先に行っちまう輩レベルだ。

それはさておき、通信の挙動を見ていると、途中まではPCと機械は普通に通信しているのだけど、PCからの送信量が多いのか、機械の方がWindowSizeを14000バイト近くまでアップデートしている。その直後、PCからのフレームが13000バイトに膨れ上がるのだけれど……あれ、コレおかしくないか。
WindowSizeは受信バッファのことだから、まあ、理屈としては13000バイトのパケットも物理的には受け取れるのかも知れないけれど、本来WindowSizeというのは「WindowSizeで示したバイト数まで、複数のパケットをまとめて受け取れますよ」というだけの意味で、1パケットあたりのデータサイズそのものは、MSSに記載したバイト数であるべきじゃないのかしらん。5tトラックが20台入れる倉庫に、100tトラック(何それ)が1台突っ込んできたとして、果たしてその倉庫はそれを受け入れるだろうか。

ジャンボフレームに関しても調べてみたけど、やっぱりジャンボフレームを使用する際はMSSもそれに合わせて大きくなるらしい。てことは、MSS=1460で宣言しているこのPCは、ジャンボフレームを使用しているつもりは無い筈である。

Windowsは内部ルーティングを行うから、実際にLAN線上を走っているのはその時点でフラグメントされて1460Byteになったパケットなのかなぁと思ったけれど、フラグメント禁止フラグがちゃっかりONになってるしなぁ

念の為、別のPC(メーカー違うけど)にもWireSharkをインストールして、同じアプリケーションで通信したら、そちらはずっと1460Byteのまま通信を続けていた。
ってことは、LANカードかそのドライバの不具合なのかなぁ……。それとも、僕の知らない何かしらのルールが適用されているとか……あ〜……訳分かんない