3

rawソケットを使用してサイズが3000バイトのUDPパケットを送信している場合、コードでパケットの断片化を自分で処理する必要がありますか、それともrawソケットはDGRAMソケットと同様に断片化を処理する必要がありますか?

4

5 に答える 5

5

UDP を使用している場合は、実際には RAW を送信していません。RAW はまったく IP ではありません。その場合、断片化を自分で処理する必要があります。

UDP を使用すると、IP のフラグメンテーション サポートが得られます。これは、衝突を最小限に抑える必要がある短距離ネットワークには十分に適しています。2 つのシステム間のリンクを専用サブネットにすれば、まったく問題になりません。

UDP よりも TCP の方が優れているのは、フラグメントが失われたり、何らかの形で停止したりした場合に、1 つのフラグメントを再送信するだけで済むというスタックの機能です。UDP を使用すると、メッセージ全体を破棄する必要があります。ただし、それにはオーバーヘッドがあり、ほとんどの最新のネットワークでは、おそらくそのトレードオフに耐えることができます.

于 2010-11-15T19:18:17.173 に答える
3

いいえ、パケットの断片化は下位レベルで処理されます。パケットに入れたものが戻ってくるのを正確に確認する必要があります。つまり、UDP はメッセージ境界を保証します。

于 2010-11-15T19:08:29.033 に答える
2

基礎となるプロトコルである IP は、引き続きフラグメンテーションを処理します。DF (フラグメント化しない) ビットを設定していない限り、問題ないと思います。

于 2010-11-15T19:08:36.853 に答える
0

システムに応じて、これはまったく異なる方法で処理できます。たとえば Linux では、下位層にパス MTU の検出を処理するように依頼し、(既知の) パス MTU よりも大きなものを送信しようとするとエラー (EMSGSIZE) を返すことができます。

あなたが話している生のソケットはどのくらい「生」ですか? 他のシステムでは、DF ビットを制御できる (または、ほとんどの IP ヘッダーを自分で構築している) 場合、動作もこれに依存します。

原則として、DF セットで送信する場合、通常、ユーザー空間でエラーを確認するか、ホストの下位レベルで PMTU 検出を処理して、大きすぎる送信を停止するかを選択できます。DF を設定しない場合、(おそらく) パスに沿ってルーターからの適切な断片化が見られます。

于 2010-11-15T19:16:05.610 に答える