TCP_NODELAY と TCP_CORK に関する回答を書いた後、TCP_CORK の細かい点に関する知識が不足しているに違いないことに気付きました。なぜなら、Linux 開発者が新しい TCP_CORK フラグに頼るのではなく、新しい TCP_CORK フラグを導入する必要があると感じた理由が 100% 明確ではないからです。アプリケーションを使用して、適切なタイミングで既存の TCP_NODELAY フラグを設定またはクリアします。
特に、200 ミリ秒の Nagle 遅延税を支払うことなく、TCP ストリームを介していくつかの小さな/不連続なデータ フラグメントを send() したい Linux アプリケーションがある場合、同時に送信に必要なパケット数を最小限に抑えます。それは、次の 2 つの方法のいずれかで実行できます。
TCP_CORK の場合 (疑似コード):
int optval = 1;
setsockopt(sk, SOL_TCP, TCP_CORK, &optval, sizeof(int)); // put a cork in it
send(sk, ..);
send(sk, ..);
send(sk, ..);
optval = 0;
setsockopt(sk, SOL_TCP, TCP_CORK, &optval, sizeof(int)); // release the cork
または TCP_NODELAY (疑似コード):
int optval = 0;
setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)); // turn on Nagle's
send(sk, ..);
send(sk, ..);
send(sk, ..);
optval = 1;
setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)); // turn Nagle's back off
私は後者の手法を何年も使用しており、良い結果が得られています.Linux以外のOSにも移植できるという利点があります.パケットがすぐに送信されるようにし、Nagle 遅延を回避するには -- send()'ing 0 バイトで十分です)。
現在、Linux 開発者は賢い人なので、上記の TCP_NODELAY の使用法が彼らにまったく思い浮かばなかったとは思えません。彼らが不十分だと感じたのには何らかの理由があるに違いありません。そのため、代わりに新しい/独自の TCP_CORK フラグを導入することになりました。その理由を説明できる人はいますか?