Udpを使用した2つのエンドポイント間の断片化が1472になる前の最大データを把握しました(他のエンドポイントは異なる場合があります)。これは、mtuが1500バイトで、パケットあたりのヘッダーオーバーヘッドが28バイトであることを示しています.0バイトのデータ(ペイロード)を送信した場合、転送される実際のデータは28バイトであると想定しても安全ですか?私はいくつかのベンチマークを行っているので、チャネルで何が起こっているのかを知ることは私にとって非常に重要です。ありがとう。
MTUは、断片化せずに送信できるIPパケットの最大サイズです。
IPv4は、少なくとも576バイトのパスMTU、少なくとも1280バイトのIPv6を義務付けています。
イーサネットのMTUは1500バイトです。
IPパケットは、パケットヘッダーとペイロードの2つの部分で構成されます。
IPv4ヘッダーのサイズは少なくとも20バイト、IPv6ヘッダーのサイズ少なくとも40バイト。
IPパケットのペイロードは通常、TCPセグメントまたはUDPデータグラムです。
UDPデータグラムは、UDPヘッダーと転送されたデータで構成されます。
UDPヘッダーのサイズは8バイトです。
これは、ペイロードとして空のUDPデータグラムを持つIPパケットが少なくとも 28(IPv4)または48(IPv6)バイトかかることを意味しますが、それ以上のバイトが必要になる場合があります。
また、イーサネットの場合、IPパケットはイーサネットフレーム(8バイトのプリアンブルシーケンス)に埋め込まれるMACパケット(14バイトのヘッダー+ 4バイトのCRC)でさらにラップされることに注意してください。これにより、26バイトのデータがIPパケットに追加されますが、MTUにはカウントされません。
したがって、UDPデータグラムによって特定のバイト数が送信されるとは限りません。
オプションが選択されていない場合、通常の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)の場合、パケットは断片化されます。
0バイトのデータ(ペイロード)を送信した場合、転送される実際のデータは28バイトであると想定しても安全ですか?
(そしてそうです...それが「安全」である限り、それは通常実際の違いをもたらさないので)
No-payload-no-option UDP/IPv4データグラムが正確に28バイト(またはネットワーク用語では「オクテット」)であることは事実ですが、これは決して安全な仮定ではありません。
ただし、ほとんどの場合、重要ではありません。スイッチとルーターは通常、小さなパケットを大きなパケットとまったく同じ速度で転送します(または、違いはごくわずかです)。違いが見られる唯一の機会は、帯域幅の請求書です(使用するビットだけでなく、ネットワーク上のすべてのビットに対して支払います!)。
IPv4には、最大40オクテットの「オプション」が付加されている場合があり、IPv4はIPv6にカプセル化されている場合があります(知らないうちに)。どちらもデータグラムのサイズを大幅に増加させる可能性があるため、データはかなり明白な方法で転送されます。
また、データグラムはリンク層にさらにカプセル化され、プリアンブルとヘッダーデータの両方が追加され、最小フレーム長になります。追加のヘッダーの存在は、やはりかなり明白です。最大サイズに加えて、ペイロードにも最小サイズがあるという事実はあまり知られていない事実です。
イーサネットとATMは、ここでの想定を妨げる可能性のある2つの広く使用されている標準です(ただし、他のリンク層も同様です)。
イーサネットフレームの最小サイズは64バイトで、このサイズにゼロが埋め込まれます。 802.1Q(VLAN)が存在する場合、これはイーサネットフレームの最小ペイロードが42オクテットであることを意味します。それ以外の場合は46オクテットです。
したがって、「通常の」イーサネットを介して長さゼロのUDP/IPv4データグラムを送信すると、ペイロードに18個のゼロバイトが追加されます。あなたはそれらを見ることは決してありませんが、それらはそこにあり、あなたの請求書に表示されます。
同様に、ATMセル(「フレーム」と同じ、何らかの理由で異なるワードを使用)は常に53バイトで、48バイトのゼロパディングペイロードがあります。したがって、ペイロードがゼロのUDPダイアグラムでは、20個のゼロバイトが追加されますが、長さがゼロのUDP/IPv6データグラムは、PPPoEその間に。
最後に、パケットをまったく送信できるようにするために、追加のパケットを送受信する必要がある場合があることに注意してください。たとえば、イーサネットカードがデータグラムを送信できるようにするためにARP(またはNDP)を実行する必要がある場合があります。複数のデータグラムを送信しているため、結果をキャッシュするとこれが償却されますが、1つのUPDデータグラムだけを送信すると、約3倍のデータグラムを送信することに驚かれるかもしれません。データ」は、あなたが素朴に期待するものと比較して送受信されます。
IPオーバーヘッドは20バイトでUDPは8バイトなので、そうです、28バイトです。
http://en.wikipedia.org/wiki/User_Datagram_Protocol
内部テストを行う場合は、イーサネットのオーバーヘッドを忘れないでください