2011-04-28 12 views
0

TcpClient.NoDelay = trueを使用しようとしましたが、それでも200ミリ秒後に確認応答を返信しません。 Nagleアルゴリズムを無効にするようにネットワークアダプタのWindowsレジストリ設定を変更したところ、ACKはすぐに送信されます。レジストリ設定を変更せずに200 msの遅延を無効にする方法はありませんか?C#アプリケーションでTCPデータグラムを遅滞なく確認する方法を教えてください。

更新:UDPについてのご意見ありがとうございます。私はUDPがアプリケーションの正しいプロトコルであることに同意しますが、残念なことに私は現時点でTCPインタフェースしか持っていないデバイスを扱っているので、私の手はそこに縛られています。

答えて

2

ACKパケットは、基本となるオペレーティングシステムのTCP/IPスタックの内部動作の問題です。あなたのアプリは、TCPプロトコルの標準的な動作に悪影響を与えてはいけません。はいの場合は、UDPのようなものを使用することを検討する必要があります。

1

NoDelayはあなたの考えをしません。これはNagleアルゴリズムを無効にします。これは、送信されるパケット数を減らすために完全なパケットがキューに入れられていない場合、わずかな時間だけ待機する最適化です。それは承認とは関係ありません。

遅延なくパケットを送信する場合は、UDPを使用します。 TCPはパケットを再送する必要があるかどうかを確認するために確認応答を待たなければならず、バッファがオーバーフローしてデータを失わないようにする安全機構です。

EDIT:あなたの質問を再読み込み時に

が、あなたの質問は少し誤解を招くようだったようです。アダプタのnagleを無効にすると、パケットがすぐにSENTではなく、すぐに確認応答が戻ってこないという問題が発生します。 ackはすぐに戻ってきます。送信の遅延が問題であることだけです。

ソケットを開いた後、または前にNoDelayオプションを設定していますか? NoDelayが設定されていることを確認した後、NoDelayのステータスをチェックしていますか? trueに設定すると失敗する可能性があります。設定してもfalseになります。

+0

あなたはおそらくナーレを間違って理解しているのは正しいでしょう。レジストリのTcpAckFrequencyを変更しました。これにより、ACKがすぐに送信されます。 – John

関連する問題