すべてを次々に送信するのではなく、複数のUDPパケットを1つに結合することには利点がありますか?大きなパケットが破損した場合、私はそれらをすべて失うことを知っていますが、それらをすべて1つに送信することにはおそらくいくつかの利点がありますか?大きなものが失われる可能性が低いなど?
4 に答える
それは送信アプリケーションの裁量になります。
大きなパケットは、基盤となるネットワークのMTUによって制限されることに注意してください。たとえば、UDPパケットの理論上のサイズは64kですが、イーサネットフレームはわずか約1500バイトです。したがって、これは実用的な機能ではないと思います。
一般に、ネットワーク チャネルは、1 秒あたりに送信できるパケットのレートが制限されます。したがって、1 秒あたり数百万のメッセージを送信したい場合は、通常、大きなパケット損失なしで実行するために、より少ない数のパケットに結合する必要があります。
過度の一般化として、Windows は UDP で 1 秒あたり 10,000 パケットを超えることを好みませんが、大きな MTU パケットでギガビット ネットワークを飽和させることができます。
複数の UDP パケットを次々に送信するのではなく、複数の UDP パケットを 1 つに結合する利点はありますか?
データグラムあたり 8 バイトの UDP ヘッダーを節約できるため、ネットワーク経由で送信されるデータの量を減らすことができます。IPレイヤーでのフラグメント化を避けるために、MTU sans IPおよびUDPヘッダーサイズを超えて送信しないようにしてください。
また、標準の POSIX ソケット API では、send/sendto/sendmsg()
1 つのデータグラムを送受信するために 1 つのシステム コールが必要です。そのため、送信するデータグラムが少ないほどシステム コールが少なくなり、全体的なレイテンシが減少します (コールあたり数マイクロ秒程度)。3.0 以降の Linux カーネルは、1 つのシステム コールで複数のデータグラムを送受信する機能を提供sendmsg()
します。recvmmsg()
大きなパケットが破損した場合、すべてのパケットが失われることを知っています
真実。ただし、プロトコルが UDP データグラムの損失にまったく対処できない場合は、それほど問題にならない可能性があります。1 つのデータグラムが失われるとすぐに、いずれにせよ破損します。
パケット サイズが小さい (100 バイト未満) 場合に重要です。IP/UDP ヘッダーは 28 バイト以上です。
サーバーへのストリーミング接続があり、各パケットに 50 バイトが含まれ、ソフトウェアが 1 秒あたり 1000 パケットのレートでパケットを送信するとします。
実際のペイロードは、1000 * 50 bytes = 50000 bytes.
ヘッダーのオーバーヘッドの1000 * 28 = 28000 bytes
合計バイト数です:50000 + 28000 = 87000 ==> 87 KBps
3 つの UDP パケットをそれぞれ 1 つのパケットに結合できると想像してください。
ヘッダーのオーバーヘッド1000 / 3 * 28 = 9333
総バイト数:50000 + 9333 ===> 60 KBps
これにより、一部のアプリケーションでは、帯域幅のかなりの部分が節約されます。