web-dev-qa-db-ja.com

無効にするTCP遅延ACK

TCPで、アプリケーションレベルの応答がなく、比較的まばらなトラフィックを受信するアプリケーションがあります。TCPスタックが遅延ACKを送信していると思います(ネットワークパケットキャプチャ)。単一ソケットのネットワークスタックで遅延ACKを無効にするための推奨される方法は何ですか?TCP_QUICKACKを見ましたが、スタックはとにかくそれを私の足元で変更するようです。

これはLinux2.6カーネルで実行されており、移植性については心配していません。

18
Tom

recvを実行するたびにsetsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))を実行できます。 TCP_QUICKACKは、送信または受信されるデータがある場合にのみリセットされます。データを送信していない場合は、データを受信したときにのみリセットされます。その場合は、データを再設定するだけです。

あなたは14でこれをチェックすることができますth の分野 /proc/net/tcp; 1でない場合は、ACKをすぐに送信する必要があります... TCPコードを正しく読んでいる場合(私もこれの専門家ではありません)。

16
ephemient

setsockopt() 関数を使用すると、Nagleアルゴリズムを無効にするTCP_NODELAYを使用できると思います。

編集リンクが見つかりました: http://www.ibm.com/developerworks/linux/library/l-hisock.html ==

編集2トムは正しいです。 Nagleは遅延ACKには影響しません。

1
CoryC

受け入れられた回答にはバグがあります。

flags = 0;
flglen = sizeof(flags);
setsockopt(sfd, SOL_TCP, TCP_QUICKACK, &flags, flglen)

SOL_TCPではなく、IPPROTO_TCP

誰かがそれを必要とする場合に備えて、ここに投稿してください。

@damolpが示唆したように、これはバグではありません。記録のためにここに保管してください。

0
Alt Eisen