大きな MTU を設定する方法 (Linux)

大きな MTU を設定する方法 (Linux)

ラップトップからルーターまでギガビット イーサネット接続があり、インターネットへの IPv6 接続も機能しています。インターネット上のサイトから、少なくとも 10000 バイト (Wireshark による) の非常に大きなパケットを受信できます。 (編集: Linux の「汎用受信オフロード」であることが判明) ただし、何かを送信しようとすると、ローカル コンピュータは IPv6 で 1500 バイト未満で断片化します。(IPv4 では、少なくとも 1514 バイトの TCP パケットをインターネットに送信できます。構成された MTU 6128 までのパケットで ping を実行できますが、ブラックホール化されます。)

ip link set dev eth0 mtu 6128私は Ubuntu 12.04 を使用しています。NetworkManagerアプレット GUI と の両方を使用して、eth0 の MTU を 6128 (受け入れ可能な最大値) に設定し、接続を再起動しました。6128 ip link show eth0MTU が実際に設定されていることが示されていip -6 routeます。カーネルが認識しているパスのいずれにも MTU が設定されていないことが示されています。最大 6128 バイトのパケットで IPv4 経由で ping を実行できます (応答は得られませんが)。ただし、実行するとping6 myrouter -c3 -s1500 -Mdoエラー応答が返されます。自分のパソコンからパケットが大きすぎて、MTU が 1480 であると表示されます。Wireshark を使用して確認したところ、回線上に何も送信されておらず、応答は実際に自分のコンピューターによって生成されています。

では、どうすればコンピューターでより大きな MTU を使えるようになるのでしょうか?

答え1

あなたが見ているのは、おそらくジャンボ フレームではありません。結局のところ、インターネットの 99.9% は 1500 バイト以下の MTU で動作しています。おそらく、カーネルまたはネットワーク カードがパケットの結合を行っているだけでしょう。

これは、通常、Generic Recieve Offload (GRO) または Large Receieve Offload (LRO) と呼ばれる機能を使用して行われます。これは、単一のフロー内のパケットが識別され、結合されてから TCP/IP スタックに送られるという仕組みです。これにより、スタックへのラウンドトリップの量が削減されるため、CPU サイクルを大幅に節約できます。

これを試してください: ethtool -K $INTERFACE gro off

これにより、この機能がオフになり、Wireshark の動作が改善されます (ただし、CPU は影響を受けません)

ローカルでより高い MTU を使用することもできますが、このような機能や、もちろんハードウェアの高速化により、もはやそれほど大きなメリットはありません。また、管理上の悪夢になることもあります。バグのあるドライバーやハードウェアが多数存在し、オペレーティング システムで DHCP または RA を介して MTU を設定するサポートのレベルもさまざまです。特定のブロードキャスト ドメイン内のすべてのデバイスで同じ MTU を実行する必要があるため、多くの場合、ジャンボ フレームは実用的ではありません。

答え2

MTUは主にローカルで使用されます。複数のネットワークホップ(ルーター+インターネットなど)でジャンボフレームを使用するのは難しく、おそらく機能しません。たとえば、DSLは通常、パスMTU1492 バイトまで。一般的なルールとして、パス MTU は、参加しているルータ間の最小のリンク MTU によって決定されます。パス全体を制御して各リンクに大きな MTU を設定しない限り、コンピュータの MTU だけを増やしても何も起こりません (LAN 速度が向上する可能性はありますが)。

答え3

ipStefan Seidel のコメントに基づいて、その方法を見つけました。コマンドでは表示されない別の mtu 設定があることがわかりました。 /proc/sys/net/ipv6/conf/eth0/mtu(コマンドでより高い値を設定すると、必要な操作が行われました。(あまり役に立ったわけではありませんが、ルータは実際には大きなフレームをドロップしました。) この値は、ルータ広告を通じて定期的に更新/リセットされます。 RA は、 の下にある同じフォルダにsudo sh -c "echo 0 > /proc/sys/net/ipv6/conf/eth0/mtu"書き込むことで無効にできます。0accept_ra/proc

関連情報