TCPで、アプリケーションレベルの応答がなく、比較的まばらなトラフィックを受信するアプリケーションがあります。TCPスタックが遅延ACKを送信していると思います(ネットワークパケットキャプチャ)。単一ソケットのネットワークスタックで遅延ACKを無効にするための推奨される方法は何ですか?TCP_QUICKACK
を見ましたが、スタックはとにかくそれを私の足元で変更するようです。
これはLinux2.6カーネルで実行されており、移植性については心配していません。
recv
を実行するたびにsetsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))
を実行できます。 TCP_QUICKACK
は、送信または受信されるデータがある場合にのみリセットされます。データを送信していない場合は、データを受信したときにのみリセットされます。その場合は、データを再設定するだけです。
あなたは14でこれをチェックすることができますth の分野 /proc/net/tcp
; 1でない場合は、ACKをすぐに送信する必要があります... TCPコードを正しく読んでいる場合(私もこれの専門家ではありません)。
setsockopt() 関数を使用すると、Nagleアルゴリズムを無効にするTCP_NODELAY
を使用できると思います。
編集リンクが見つかりました: http://www.ibm.com/developerworks/linux/library/l-hisock.html ==
編集2トムは正しいです。 Nagleは遅延ACKには影響しません。
受け入れられた回答にはバグがあります。
flags = 0;
flglen = sizeof(flags);
setsockopt(sfd, SOL_TCP, TCP_QUICKACK, &flags, flglen)
(SOL_TCP
ではなく、IPPROTO_TCP
)
誰かがそれを必要とする場合に備えて、ここに投稿してください。
@damolpが示唆したように、これはバグではありません。記録のためにここに保管してください。