2009-06-19 5 views
3

thisの記事を読んでいる間、私は疑問を持っています。WinsockカーネルバッファとNagleアルゴリズムに関する疑問

小さなデータを転送する間、Nagleアルゴリズムはデフォルトで有効になっており、小さなパケットが結合されることがわかりました。この結果、送信前にいくつかのデータがキャッシュされます。私は、Winsock Kernel Bufferはキャッシュが発生する場所だと考えています。私が間違っているなら、私を訂正してください。

SO_SNDBUFオプションでWinsock Kernel Bufferをゼロに設定すると、Nagleアルゴリズムが無効になるのでしょうか?

もしそうでなければ、WINSOCKはどこの小さなデータをキャッシュしますか?

答えて

5

は、あなたが参照してくださいKBの記事は

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

と、SO_SNDBUF = 0 TCP_NODELAYソケットオプションは、小さなデータパケットがに配信されるように、Nagleアルゴリズムを無効にするために適用される

以下のようにNagleアルゴリズムを無効にしますリモートホストは遅滞なく。

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


、私はTCP_NODELAYを設定したり、SO_SNDBUF = 0を設定することの両方が同じことをやっているように見えるので、あなたが混乱するかもしれません実現。その場合、NagleはTCPストリーム(データをパケットに分割する)上でのみ適用可能ですが、SO_SNDBUFはUDPソケットにも適用可能です。

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

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

+0

まだ明確ではありません。 TCP_NODELAYを使用して無効にします。最後に強調表示されたステートメントでは、データが実際に送信されるまで、送信完了通知が遅れていると表示されます。 Nagleアルゴリズムを無効にすることではありません。 – Canopus

+0

SO_SNDBUFが0に設定されている場合、送信完了によってデータがネットワーク媒体にヒットしたことが示された場合の「唯一の例外」です。つまり、アプリケーションでは、ネットワーク回線へのデータ配信を確認する場合は、 SO_SNDBUFを0に設定します。これにより、ワイヤへの即時発送が強制されます。 – nik

0

SO_SNDBUFを0に設定しても、強制的にワイヤに直接送信されません。

0

SO_SNDBUFを0に設定すると、は無効になります。暗黙的にnagleを無効にします。 WSKによって維持されるナーグル状態は、バッファが位置する場所とは無関係である。移送がそれを消費するまで、投稿するバッファを有効に保つ責任はです。

関連する問題