UDPの章。
なめてかかって読んでたらエラい目にあった。
まずIPのフラグメントの説明がここにあったこと。フラグメントはややこしい。かつ、8バイト単位で長さを指定する。それはMore Fragmentなどのフラグのため。パスMTUの話もここに入っている。
上り回線と下り回線のMTUが違う環境を例に示していて、死にそうになった。MTUに関しては、データリンク層で制限を課しているから、データリンクの限界値をネットワーク層IPに伝えているのだ、という認識だった。なぜならMTUはインターフェースごとに設定していくからだ。
上下回線でMTUの値に違いが出る環境がありえるかもしれないという発想に至れなかった。
あの本は、何度読んでも発見がある。
MTUに関しては、BフレッツのMTUサイズ(1492ではなく1454の理由)という話もある。
この場合、ルータでフラグメントをするか、ホスト側でパスMTUディスカバリをする必要がある。ルータでフラグメントをした場合、ルータの処理能力によっては通信能力が大幅ダウンしてしまうので、ホスト側でパスMTUディスカバリをした方がベターだ。
そこでWindowsではパスMTUディスカバリをしているのかどうか調べてみた。
「パスMTUディスカバリ・ブラックホール問題」とは:ITpro
Windows2000はパスMTUディスカバリを実装しているようだが、それが原因でメールが見れなくなったりするようだ。
しかもMTUサイズ1454の”フレッツ網”で。
なかなか奥が深い。
追記:
リビング+:「ルータのブラックホール現象」を解決する (1/2)
なーんとなく、Windows側のパスMTUディスカバリ実装のミスだろうなーっと。DFフラグ立てて届かないならRFCに従ってMTUサイズを小さくしていくべきだが、Windows 2000はそうしなかったようだ。
追記その2:
いや、違う。フラグメント値が正しくないというICMPエラーが届かないとフラグメント値は変更しないのが正しいのか。DFフラグを立てたデータグラムはフレッツ網のルータに拒否される。その拒否したルータがICMPエラーを発信元に返すが、FWが弾く。エラーが届かなければ、ホスト側は単にデータグラムが消失した(破棄された)と思う。だから、DFビットを外さなかった、というのが答えか。
んでも、破棄された場合でも2度くらい連続したらDFビットを外して送信した方がいい・・・はず。暇だったら現在の実装はどうなっているか実験してみよう。