ルーターとして動作する 2 台の Linux PC と通常のクライアントとして動作する 2 台の Linux PC でテスト ネットワークをセットアップしました。2 台のルーターは相互に接続されており、各クライアントは 1 台のルーターに接続されています。クライアントからルーターの 1 台までのパスでは MTU は 1500 ですが、2 台のルーター間では 1200 です。また、IPv6 のみを使用しています。
1200 バイトを超えるパケットを送信しようとすると、ルータから ICMPv6 の「パケットが大きすぎます」というエラーが返され、クライアントはパケットを断片化して再送信を試みるはずです。しかし、これは起こりません。Wireshark を見ると、クライアントが ICMPv6 エラーを受信していることがわかりますが、クライアントはパッケージを断片として再送信しようとしません。
この動作の理由は何でしょうか?
答え1
IPv6 はフラグメンテーションをサポートしていません。
IPv4では、ルータは、あるリンクからより小さなMTUを持つ別のリンクに転送するときにパケットを断片化することがあります(DFが設定されています)。
IPv6では、エンドポイントはパスMTU検出実際に自分でそれを見つけて、その MTU を相互に使用するのです...
編集@Patrick Mevzek の非常にありがたいコメントを受けて:
... または、IPv6 の保証された MTU 1280 バイトを使用します (ホスト上でパケットをフラグメント化するかどうかは問いません)。