3

この記事を読んでいる間、私は疑問を抱きました。

小さなデータを転送している間、Nagleアルゴリズムはデフォルトで有効になっており、小さなパケットを合体させることを理解しました。これにより、送信前に一部のデータがキャッシュされます。Winsockカーネルバッファはキャッシュが発生する場所だと思います。私が間違っている場合は私を訂正してください。

WinsockカーネルバッファがSO_SNDBUFオプションでゼロに設定されている場合、Nagleアルゴリズムが無効になることを意味しますか?

そうでない場合、WINSOCKは小さなデータをどこにキャッシュしますか?

4

3 に答える 3

5

あなたが参照するKB記事は、このようにあなたの答えを提供します...

アプリケーション層でのパフォーマンスを最適化するために、Winsock はデータ バッファーをアプリケーション送信呼び出しから Winsock カーネル バッファーにコピーします。次に、スタックは独自のヒューリスティック (Nagle アルゴリズムなど) を使用して、実際にパケットをネットワークに送信するタイミングを決定します。

また、TCP_NODELAY または SO_SNDBUF=0 を設定すると、以下のように Nagle アルゴリズムが無効になります。

TCP_NODELAY ソケット オプションを適用して Nagle アルゴリズムを無効にし、小さなデータ パケットが遅延なくリモート ホストに配信されるようにします。

SO_SNDBUF オプションを使用して、ソケットに割り当てられた Winsock カーネル バッファの量を変更できます (デフォルトでは 8K です)。必要に応じて、Winsock は SO_SNDBUF バッファー サイズよりも大幅に多くのバッファーを使用できます。ほとんどの場合、アプリケーションでの送信完了は、アプリケーション送信呼び出しのデータ バッファーが Winsock カーネル バッファーにコピーされたことを示すだけであり、データがネットワーク メディアに到達したことを示すものではありません。唯一の例外は、SO_SNDBUF を 0 に設定して Winsock バッファリングを無効にした場合です


以下のコメントを読むと、TCP_NODELAY を設定するか、SO_SNDBUF=0 を設定すると、どちらも同じことをしているように見えるため、混乱する可能性があることがわかります。その場合、SO_SNDBUF は UDP ソケットにも適用できるのに対し、Nagle は TCP ストリーム (データをパケットにセグメント化する) にのみ適用できることに注意してください。

SO_SNDBUF を 0 に設定すると、すべての出力バッファリングが明示的に停止され、ソケットの「書き込み」ごとに即時ディスパッチが試行されます (少なくとも通常のソケット実装では)。

TCP_NODELAY を設定すると、TCP ソケットで Nagle アルゴリズムが明示的に停止されますが、送信バッファーが利用可能であり、遅延ディスパッチに使用される場合があります (送信の成功がアプリケーションに確認された後)。

于 2009-06-19T11:58:52.083 に答える
0

SO_SNDBUF をゼロに設定しても、nagle が暗黙的に無効になることはありません。WSK によって維持される nagle 状態は、バッファーの場所とは無関係です。トランスポートがそれを消費するまで、投稿したバッファを有効に保つのはあなたの責任です。

于 2010-03-04T04:49:19.287 に答える
0

SO_SNDBUF を 0 に設定しても、ワイヤでの即時送信は強制されません。

于 2009-09-08T23:27:09.167 に答える