3

特定のソケットのMTUを(Linuxシステムで)調整する方法があるかどうか疑問に思いました。(IPレイヤーを実際のデバイスのMTUよりも小さいチャンクにフラグメント化するため)。

特定のソケットについて言うとき、私はそのソケットを所有するアプリケーションのコードでプログラム的に意味するのではなく、外部、たとえばsysfsエントリを介して意味します。

現在それを行う方法がない場合、そのような可能性を実装するためにLinuxカーネルのどこにフック/パッチを適用するかについて何かアイデアはありますか?

ありがとう。

編集:なぜ私はそれをしたいのですか?

Layer3-in-Layer4(例:TCPトンネルを介したIP以上のトンネリング)トンネリングを実行しています。VPNのようなソリューションとは異なり、私はそれを実現するために仮想インターフェイスを使用していません。iptablesを使用してパケットをキャプチャし、通常の方法でドロップして、トンネルソケットに書き込みます。

大きなファイル転送の場合を考えてみてください。すべてのパケットはMTUサイズまでいっぱいになります。それらをトンネリングするとき、オーバーヘッドを追加し、すべての元のパケットをリードして2つのトンネリングされたパケットを生成します。これは最適ではありません。

4

2 に答える 2

2

送信パケットにDFが設定されるようにソケットが作成されている場合、目的のMTUが得られるまで、ICMPフラグメンテーションが必要なメッセージをスプーフィング(注入)することができます。かなり醜いですが、あなたがどれほど必死であるかに応じて、それは適切かもしれません。

たとえば、iptablesルールを使用してこれらのパケットを生成できるため、照合と送信は単純で、アプリケーションの外部にあります。iptablesのREJECTターゲットには拒否がないようですが、断片化が必要ですが、追加するのはそれほど難しいことではないでしょう。

もう1つのアプローチは、関心のあるTCPパケットのみである場合、問題に適切な場合は、ソケットオプションTCP_MAXSEGまたはTCPMSSターゲットを使用して運が良かった可能性があります。

UDPまたはrawの場合send()、必要なだけ小さいパケットを自由に使用できます。

アップデート:

「なぜそんなことをしたいのか」に基づいています。答えは、DFが設定されていない場合、またはICMPの「断片化が必要」である場合にパケットを断片化するようであり、実際にはドロップが正しい解決策です。

これは、より「通常の」ルーターが行うことであり、ファイアウォールがICMPパケットを消費しない場合、すべてのシナリオで正常に動作しますが、遡及的に変更することは奇妙な動作のレシピです。

iptablesクランプmssは、この「VPN」を介したTCPの非常に優れた修正ですが、特にiptablesをすでに広範囲に使用しているため、そう思われます。

于 2010-11-12T14:09:37.643 に答える
0

MTUはリンクのプロパティであり、ソケットではありません。それらはスタックの異なるレイヤーに属しています。つまり、TCPは3ウェイハンドシェイク中にパスMTUディスカバリーを実行し、断片化を回避するために非常に懸命に努力します。TCPにフラグメントを送信させるのは難しいでしょう。UDPを使用する場合、最も簡単なのは、インターフェイスに小さいMTUを強制してからifconfig(8)、その値よりも大きいパケットを送信することです。

于 2010-11-12T14:16:45.087 に答える