これは最適化です。他の最適化と同様に:
<オール>基本的には、sendfile() とその仲間を使用して、単一のフレームを使用できる複数のフレームを送信する必要がないようにすることを目的としています。
たとえば、Web サーバーでは、ヘッダーに続いてファイルの内容を送信します。ヘッダーはメモリ内で組み立てられ、ファイルはカーネルによって直接送信されます。 TCP_CORK を使用すると、最初のチャンクがすぐに送信される TCP_NODELAY を使用しても、ヘッダーとファイルの先頭を 1 つのフレームで送信できます。
TCP_NODELAY
Nagle のアルゴリズムを無効にして、TCP/IP ネットワークを改善し、以前に送信されたデータの確認応答が受信されるまで待機して蓄積されたパケットを送信することにより、パケット数を減らすために使用されます。
//tcp(7) マニュアルより:
TCP_CORK
(または TCP_NOPUSH
FreeBSD で)
設定されている場合、部分フレームを送信しません。オプションが再びクリアされると、キューに入れられたすべての部分フレームが送信されます。これは sendfile(2)
を呼び出す前にヘッダを追加するのに便利です 、またはスループットの最適化のために。現在実装されているように、200 ミリ秒の上限があります。 出力が TCP_CORK
によってコルクされる時間について . この上限に達すると、キューに入れられたデータが自動的に送信されます .このオプションは TCP_NODELAY
と組み合わせることができます Linux 2.5.71 以降のみ。このオプションは、移植性を意図したコードでは使用しないでください。
まず第一に、それらの両方が 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 のアルゴリズムを無効にする方が適切です。
そのため、Nagle のアルゴリズムを無効にするために TCP_NODELAY が使用されます。
TCP_CORK は積極的にデータを蓄積します。ソケットで TCP_CORK が有効になっている場合、バッファが一定の制限に達するまでデータは送信されません。 Nagle のアルゴリズムと同様に、これもユーザーからのデータを蓄積しますが、ACK を受信するまでではなく、バッファが固定制限に達するまで蓄積します。これは、複数のデータ ブロックを送信するときに役立ちます。ただし、TCP_CORK を使用するときはより注意する必要があります。
2.6 カーネルまでは、これらのオプションは両方とも相互に排他的です。しかし、後のカーネルでは、両方が共存できます。そのような場合、TCP_CORK がより優先されます。
参照:
- http://baus.net/on-tcp_cork/
- http://ccr.sigcomm.org/archive/2001/jan01/ccr-200101-mogul.pdf