diff --git a/README.md b/README.md index ace6c15..5e63564 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,35 @@ TCP SYN に MSS オプションがある場合、外側 IPv6 経路の MTU を 送信時に IPv4/IPv6 の MSS を自動的に縮小します。802.1Q/802.1ad VLAN と IPv6 拡張ヘッダーにも対応します。既に十分小さい MSS は変更しません。 +## MTU と IPv6 フラグメント + +EtherIP over IPv6 では、内側 Ethernet ヘッダー 14 bytes、EtherIP ヘッダー +2 bytes、外側 IPv6 ヘッダー 40 bytes の合計 56 bytes が追加されます。そのため、 +`eip0` と外側インターフェースの MTU がともに 1500 の場合、最大サイズの内側 +フレームは外側で 1556 bytes となり、IPv6 フラグメントが必ず発生します。 + +フラグメントの一部が欠落した場合、受信側ではパケット全体を再構成できません。 +再構成の状態は次のコマンドで確認できます。 + +```sh +nstat -az | grep Ip6Reasm +``` + +`Ip6ReasmFails` または `Ip6ReasmTimeout` が転送中に増える場合は、フラグメントの +欠落、または受信側の再構成キュー不足が発生しています。再構成キュー不足に対する +緩和策として、受信側で次の値を設定できます。 + +```sh +sudo sysctl -w net.ipv6.ip6frag_high_thresh=268435456 +sudo sysctl -w net.ipv6.ip6frag_time=10 +``` + +この設定は経路上でのフラグメント欠落を防ぐものではありません。フラグメントを +避けるには、外側インターフェースと経路の MTU を 1556 以上にするか、`eip0` の +MTU を外側 MTU から 56 引いた値以下(外側 MTU 1500 なら 1444 以下)に設定して +ください。TCP については MSS の自動縮小で回避できる場合がありますが、任意の +Ethernet フレームには適用できません。 + ## トンネルの削除 ```sh