web-dev-qa-db-ja.com

TCP_QUICKACKおよびTCP_NODELAYを設定します

以前にTCP_NODELAYを設定していたソケットのすべての呼び出しでTCP_QUICKACK設定を設定した場合、QUICKACKオプションはNODELAY呼び出しを上書きしますか?

接続時:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));

書き込みごとに:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));

TCP_QUICKACKの呼び出しは、TCP_NODELAYの以前の呼び出しをnullにしますか?

21
donalmg

これら2つのオプションの間に直接的な関係はありません。それらは異なる目的のためだけのものです。

TCP_NODELAYは、データをできるだけ早くピアに送信できるようにセグメントバッファリングを無効/有効にすることを目的としているため、これは通常、ネットワーク使用率を向上させるために使用されます。 TCP_QUICKACKは、プロトコルレベルの交換で遅延するよりも、できるだけ早く確認応答を送信するために使用されます。これは、安定した/永続的なものではなく、その後TCPトランザクション(フード)は、実際のプロトコルレベルの処理、またはユーザー設定とスタック動作の間の実際の不一致に応じて、このオプションを無視できます。

[〜#〜]ノート[〜#〜]TCP_NODELAYは移植可能ですが、TCP_QUICKACKはそうではありません(Linux 2.4.4以降でのみ機能します)。

25
Fei

TCP_NODELAYではなくTCP_QUICKACKを使用する

TCP_NODELAYをオンにすると同様の効果がありますが、小さな書き込みの場合はスループットが低下する可能性があります。 「write()」を使用してソケットに数バイト(最悪の場合、1バイト)だけを送信するループを記述し、NagleアルゴリズムがTCP_NODELAYで無効にされている場合、各書き込みは1つのIPパケットになります。これにより、各ペイロードにIPおよびTCPヘッダーがあるため、40倍にトラフィックが増加します。十分なデータがない場合、飛行中のパケットがあると、タイニーグラム防止では2番目のパケットを送信できません。最大サイズのパケットを埋めます。1回のラウンドトリップ時間でバイトを蓄積してから、キュー内のすべてを送信します。ほとんどの場合、これが必要です。TCP_NODELAYを設定している場合は、バッファリングとフラッシュの問題について、より多くの注意が必要です。なしこれは、今日のほとんどのHTTPである一括一方向転送で重要です(これがSSLハンドシェイクに及ぼす影響については、見たことがありません)短いバージョン:TCP_QUICKACKを設定します。それは事態を悪化させます、私に知らせてください。

https://news.ycombinator.com/item?id=10608356

10
rofrol

TCP_QUICKACKおよびTCP_NODELAYは、TCPのさまざまな操作に影響します。 tcp(7) のマニュアルページには、TCP_CORKやTCP_NODELAYなど、相互に干渉するTCPのソケットオプションが記載されています。

3
Mats