2010-08-02 MTU size detection with ICMP
JumboFrame対応とそうでないNICやHubとが混在したセグメントでは、間にルータが挟まらないのでPMTUDも効かず、色々問題が起こる。
これまでの経緯。というわけで、ICMP-echo を使ったものをちゃんと作った→adjustmtu
- DontFragmentビットを立てた色々なサイズのICMP echo-requestを対象ホストへ送信して、ICMP echo-replyが帰ってきたらそのサイズのMTUが到達可能とみなす
- サイズ選択は32768から開始して1500(or 1280)〜65536間でbinary search
- ICMP echoがタイムアウトした場合は3回リトライする
以上でJumboFrameであるなしにかかわらず、MTUサイズを検出できる。
検出したら route change host -mtu mtusize 相当を行い、ルーティングテーブルにMTUサイズを設定する。
daemonモード(adjustmtu -d interface)では、ルーティングソケットを監視して、interface上でarp tableが追加された瞬間に上記のことを自動的に行う。
NetBSD, OpenBSD, FreeBSD で動作確認。
DragonFlyBSDは route change host -mtu mtusize ができないようなので非サポート。
ちなみに DragonFlyBSD で adjustmtu -o host するとカーネルごとお亡くなりになります。(DragonFlyBSDのRAW_SOCKETまわりのバグっぽい)
Linuxはよくわからないのでパス1。
pingに答えないホストは? 当然答えない奴が悪い。(daemonモードだとMTU=1500とみなす)
EOF