アプリケーションで TCP ウィンドウ サイズを大きくすることに疑問があります。私の C++ ソフトウェア アプリケーションでは、TCP/IP ブロッキング ソケットを使用してクライアントからサーバーに約 1k のサイズのデータ パケットを送信しています。最近、この概念 TCP Window Size に出くわしました。setsockopt()
そこで、 for と の両方SO_SNDBUF
を使用して、値を 64K に増やしてみましたSO_RCVBUF
。この値を増やした後、LAN 接続ではなく、WAN 接続のパフォーマンスが向上しました。
TCPウィンドウサイズでの私の理解によると、
クライアントはデータ パケットをサーバーに送信します。この TCP ウィンドウ サイズに達すると、ウィンドウ サイズの最初のパケットに対する ACK がサーバーから受信されたことを確認するために待機します。WAN 接続の場合、RTT で約 100 ミリ秒の遅延が発生するため、サーバーからクライアントへの ACK が遅延します。したがって、この場合、TCP ウィンドウ サイズを大きくすると、ACK 待機時間が補償され、パフォーマンスが向上します。
アプリケーションのパフォーマンスがどのように向上するかを理解したいと考えています。
私のアプリケーションでは、ソケット レベルを使用して TCP ウィンドウ サイズ (送信バッファと受信バッファの両方) を増やしてsetsockopt
も、1k の同じパケット サイズを維持します (つまり、単一のソケット送信でクライアントからサーバーに送信するバイト数)。また、Nagle アルゴリズムを無効にしました (小さなパケットを大きなパケットに統合する組み込みオプションで、頻繁なソケット呼び出しを回避します)。
私の疑問は次のとおりです。
ブロッキングソケットを使用しているため、1k のデータパケット送信ごとに、ACK がサーバーから来ない場合はブロックする必要があります。では、WAN 接続だけで TCP ウィンドウ サイズを改善すると、どのようにパフォーマンスが向上するのでしょうか。TCP ウィンドウ サイズの概念を誤解している場合は、訂正してください。
64K のデータを送信するには、TCP ウィンドウ サイズを 64K に増やしても、ソケット送信関数を 64 回呼び出す必要があると思います (ブロッキング ソケットを介して送信ごとに 1K を送信しているため)。これを確認してください。
RFC 1323 アルゴリズムでウィンドウ スケーリングが有効になっている場合の TCP ウィンドウ サイズの最大制限は?
私は英語があまり得意ではありません。上記の内容でわからないことがあれば、教えてください。