1. ホーム
  2. linux

[解決済み] TCP_NODELAYとTCP_CORKはいつ使うべきですか?

2023-06-21 22:37:10

質問

どちらもNagleのアルゴリズムを無効化するものだと理解しました。

それぞれどのような場合に使うべきですか・使ってはいけないですか?

どのように解決するのですか?

まず、両方ともNagleのアルゴリズムを無効にしないことです。

Nagleのアルゴリズムは、ワイヤ上の小さなネットワークパケットをより多く削減するためのものです。そのアルゴリズムは、データが制限値(通常はMSS)より小さい場合、以前に送信したパケットのACKを受信するまで待ち、その間にユーザからのデータを蓄積します。そして、蓄積されたデータを送信します。

if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

これは、telnetのようなアプリケーションで役に立ちます。しかし、ACKを待つことは、ストリーミングデータを送信する際にレイテンシーを増加させるかもしれません。さらに、受信者が「遅延ACKポリシー」を実装している場合、一時的なデッドロックの状況を引き起こします。このような場合、Nagleのアルゴリズムを無効にすることがより良い選択肢となります。

そのため、TCP_NODELAYはNagleのアルゴリズムを無効にするために使用されます。

TCP_CORK は積極的にデータを蓄積します。ソケットでTCP_CORKが有効な場合、バッファが一定量に達するまでデータを送信しません。Nagleのアルゴリズムと同様に、ユーザーからのデータを蓄積しますが、ACKを受信するまでではなく、バッファが一定量に達するまで蓄積します。これは、複数のデータブロックを送信するときに便利です。しかし、TCP_CORKを使用している間は、より注意する必要があります。

2.6 カーネルまでは、これらのオプションは互いに排他的でした。

2.6カーネルまでは、これらのオプションは相互に排他的ですが、それ以降のカーネルでは、これら両方が一緒に存在することができます。この場合、TCP_CORKがより優先されます。

参照