10

udpを使用した2つのエンドポイント間のフラグメンテーションが1472になる前の最大データを把握しました(他のエンドポイントは異なる場合があります)。これは、mtuが1500バイトで、パケットあたりのヘッダーオーバーヘッドが28バイトであることを示しています。0バイトのデータ(ペイロード)を送信した場合、実際に転送されるデータは28バイトであると想定しても安全ですか?私はいくつかのベンチマークを行っているので、チャネルで何が起こっているかを知ることが重要です。

4

4 に答える 4

34
  • MTUは、断片化せずに送信できるIPパケットの最大サイズです。

    IPv4は、少なくとも576バイトのパスMTU、少なくとも1280バイトのIPv6を義務付けています。

    イーサネットのMTUは1500バイトです。

  • IPパケットは、パケットヘッダーとペイロードの2つの部分で構成されます。

    IPv4ヘッダーのサイズは少なくとも20バイト、IPv6ヘッダーのサイズは少なくとも40バイトです。

    IPパケットのペイロードは、通常、TCPセグメントまたはUDPデータグラムです。

  • UDPデータグラムは、UDPヘッダーと転送されたデータで構成されます。

    UDPヘッダーのサイズは8バイトです。

これは、ペイロードが少なくとも28(IPv4)または48(IPv6)バイトかかるため、UDPデータグラムが空のIPパケットを意味しますが、それ以上のバイトが必要になる場合があります。

また、イーサネットの場合、IPパケットはイーサネットフレーム(8バイトのプリアンブルシーケンス)に埋め込まれるMACパケット(14バイトのヘッダー+ 4バイトのCRC)でさらにラップされることに注意してください。これにより、26バイトのデータがIPパケットに追加されますが、MTUにはカウントされません。

したがって、UDPデータグラムによって特定のバイト数が送信されるとは限りません。

于 2010-11-18T19:33:54.500 に答える
7

オプションが選択されていない場合、通常のIPヘッダーは20バイトです。UDPヘッダーは8バイトです。イーサネットでは、フレームサイズは14バイト(ヘッダー)+ 4バイト(トレーラー)です。これらのパケットをキャプチャする方法に応じて、フレームサイズを考慮する必要がある場合とない場合があります。

イーサネットなし(IP + UDP)= 20 + 8=28バイト
イーサネットあり=18+ 28=46バイト

C#のUdpClientクラスは、レイヤー5以降からパケットを返すため、上記を考慮する必要はありません。

更新:
1500バイトのMTUがIP層で適用されます。つまり、フラグメント化する場合、IP層の下のパケットサイズは重要ではありません。

これは、次のように変換されます。
イーサネットフレームバイト(固定)= 18
IPヘッダー(最小)= 20
UDPヘッダー(固定)=8
最大。断片化なしで許可されるペイロード=1472ネットワーク上を通過
する合計バイト数=(上記の合計)1518バイト
(Wiresharkなどのツールを使用して残されるバイト数をカウントできます)

(IPヘッダー+UDPヘッダー+ペイロード>1500)の場合、パケットは断片化されます。

于 2010-11-18T19:31:47.493 に答える
7

0バイトのデータ(ペイロード)を送信した場合、実際に転送されるデータは28バイトであると想定しても安全ですか?

いいえ

(そしてそうです...それが「安全」である限り、それは通常実際の違いをもたらさないので)

ペイロードなし、オプションなしのUDP / IPv4データグラムが正確に28バイト(またはネットワーク用語では「オクテット」)であることは事実ですが、これは決して安全な仮定ではありません。
ただし、ほとんどの場合、重要ではありません。スイッチとルーターは通常、小さなパケットを大きなパケットとまったく同じ速さで転送します(または、違いはごくわずかです)。違いが見られる唯一の機会は、帯域幅の請求書です(使用するビットだけでなく、ネットワーク上のすべてのビットに対して支払います!)。

IPv4には、最大40オクテットの「オプション」が付加されている場合があり、IPv4はIPv6にカプセル化されている場合があります(知らないうちに)。どちらもデータグラムのサイズを大幅に拡大する可能性があるため、データはかなり明白な方法で転送されます。

また、データグラムはリンク層にさらにカプセル化され、プリアンブルとヘッダーデータの両方が追加され、最小フレーム長になります。追加のヘッダーの存在は、やはりかなり明白です。最大サイズに加えて、ペイロードにも最小サイズがあるという事実は、あまり知られていない事実です。

イーサネットとATMは、ここでの仮定を妨げる可能性のある2つの広く使用されている標準です(ただし、他のリンク層も同様です)。

イーサネットフレームの最小サイズは64バイトで、このサイズにゼロが埋め込まれます。802.1Q(VLAN)が存在する場合、これはイーサネットフレームの最小ペイロードが42オクテットであることを意味します。それ以外の場合は46オクテットです。
したがって、「通常の」イーサネットを介して長さゼロのUDP / IPv4データグラムを送信すると、ペイロードに18個のゼロバイトが追加されます。あなたはそれらを見ることは決してありませんが、それらはそこにあり、あなたの請求書に表示されます。

同様に、ATMセル(「フレーム」と同じで、何らかの理由で別の単語を使用します)は常に53バイトで、48バイトのゼロが埋め込まれたペイロードがあります。したがって、ゼロペイロードUDPダイアグラムでは、20個のゼロバイトが追加されますが、PPPoEなどの他のカプセル化が間にない場合、ゼロ長のUDP / IPv6データグラムは元のサイズ(正確に48バイトのサイズ)を維持します。

最後に、パケットを送信できるようにするには、追加のパケットの送受信が必要になる場合があることに注意してください。たとえば、イーサネットカードがデータグラムを送信できるようにするためにARP(またはNDP)を実行する必要がある場合があります。複数のデータグラムを送信しているため、結果をキャッシュするとこれが償却されますが、 UPDデータグラムを1つだけ送信すると、単純に予想されるものの約3倍の「データ」が送受信されることに驚かれるかもしれません。

于 2016-10-24T14:08:20.827 に答える
1

IPオーバーヘッドは20バイトでUDPは8バイトなので、そうです、28バイトです。

http://en.wikipedia.org/wiki/User_Datagram_Protocol

内部テストを行う場合は、イーサネットのオーバーヘッドを忘れないでください

于 2010-11-18T19:38:26.697 に答える