0

IPv4 と v6 の両方の PMTUD アプリを作成しています。私はUbuntu 12.04でこれを行っていますが、可能な限りOSに依存しないようにしたいと考えており、そこで問題に遭遇しました。

IPv6 パケットはデフォルトで送信者によって断片化されますが、この動作をオフにする方法がわかりません。IPV6_MTU_DISCOVER や IPV6_DONTFRAG などのソケット オプションをいくつか見つけましたが、これらは linux/in6.h の下で見つかりました。これは、netinet ヘッダー ファミリを使用していて、どちらも netinet/in.h の下にないため、役に立ちません。ただし、IPV6_MTU_DISCOVER はありますのでこれにて。何か不足していますか?

編集:少し明確にさせてください。ソケット (AF_INET6、SOCK_RAW、IPPROTO_ICMPV6) を使用して、サイズが大きすぎるという応答を受け取るようなサイズの ICMPv6 パケットを送信し、その応答からパス MTU を取得します。ただし、パス全体で MTU を真に取得するには、発信デバイスの MTU も考慮に入れる必要があります。

私は miredo を使用して IPv6 をトンネリングしていますが、これには 1280 などの最小サイズの MTU が設定されています。1280 より大きいパケットを送信すると、そのパケットが断片化されます (この動作は Wireshark で観察されました)が、拒否するソケットが必要です。パケットをフラグメント化するのではなく、送信して通知してください。

4

2 に答える 2

3

これを自分で行う必要はありません。MTU ディスカバリーは自動的に行われるはずです。これの副作用として、パスに沿ったすべてのデバイスは、ICMP V6 パケットの通過を許可する必要があります。

于 2012-11-20T15:53:26.720 に答える
-2

デフォルトでは、IPv6 パケットは送信者によってフラグメント化されます

いいえ。デフォルトでは、TCP パケットは送信側ルーターと中間ルーターによって断片化されます。

、この動作をオフにする方法がわかりません。

オフにすることはできません。もちろん試してみることはできますが、唯一の結果は不達です。ルーターがパケットをフラグメント化する必要があり、それを許可しない場合、代わりにドロップします。ただし、パス MTU 内に収まるように、送信ホストもフラグメント化する必要があり、それを止めることはできません。受信側を正しく記述した場合、つまり、個別のメッセージではなくバイト ストリームを読み取ることを期待して、パケットが転送中に断片化されたかどうかに関係なく問題が発生することはありません。

于 2012-11-15T04:38:06.427 に答える