そのMTUが(ほぼ)いっぱいになったときにのみTCPパケットを送信する機能(フラグ、パラメータなど)が組み込まれていますか?
データは常に送信され、含まれるペイロードの量は問題ではないという私の仮定が正しいことを願っています(wiresharkを介してそれを見つけようとしました)。
よろしくお願いします
そのMTUが(ほぼ)いっぱいになったときにのみTCPパケットを送信する機能(フラグ、パラメータなど)が組み込まれていますか?
データは常に送信され、含まれるペイロードの量は問題ではないという私の仮定が正しいことを願っています(wiresharkを介してそれを見つけようとしました)。
よろしくお願いします
データは常に送信されるという私の仮定が正しいことを願っています
いいえ、TCP スタックは通常、データをまとめて大きなセグメントを送信します (ただし、永遠に待機するわけではありませんが、多くの場合、ほんの少しの間です) - 通常、Nagles アルゴリズムまたはいくつかのバリアントが使用されます。
ネットワークの輻輳など、データのバッファリングと送信の方法に影響を与える他の懸念事項もあるかもしれません。一般に、TCP スタックは最大スループットを達成するのに非常に優れており、通常、それを裏切ろうとするべきではありません。
ただし、より低いレイテンシーが必要な場合は、TCP_NODELAY ソケット オプションを設定して、Nagle のアルゴリズムを無効にすることができます。
int ndelay = 1;
setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&ndelay ,sizeof(ndelay));
Linuxは、TCP_CORKを使用して、おそらくあなたが求めているものに近いものも提供します。
TCP_CORK設定されている場合、部分フレームを送信しません。オプションが再びクリアされると、キューに入れられたすべての部分フレームが送信されます。これは、sendfile(2) を呼び出す前にヘッダーを追加する場合や、スループットを最適化する場合に役立ちます。現在実装されているように、出力が TCP_CORK によって調整される時間には 200 ミリ秒の上限があります。この上限に達すると、キューに入れられたデータが自動的に送信されます。このオプションは、Linux 2.5.71 以降でのみ TCP_NODELAY と組み合わせることができます。このオプションは、移植性を意図したコードでは使用しないでください。
いいえ、ありません。そのようなものを実装するには、カスタム ネットワーク ドライバーをコンパイルする必要があります。また、今日のネットワークでは、MTU が重要な役割を果たさなくなっているため (もしあったとしても)、これも必要ありません。
TCP には、SO_SNDLOWAT
希望に近いオプションがあります。ただし、Linux には実装されておらず、パケット化を保証するものではありません。