Linuxにおけるネットワークの初期ウィンドウサイズの変更方法

2019年4月17日

イーサネットインターフェースとケーブル

TCP通信のパフォーマンスを決める要素の一つとしてウィンドウサイズがあります。

今回は簡単にウィンドウサイズについての説明とLinuxにおける設定方法を解説していきます。

ウィンドウサイズとは

ウィンドウサイズとは簡単に説明するとパケットの到着応答なしに一度に送れるパケットの数です。

相手の返事を待たずに送れる量が増えると通信効率がよくなりますが、ただ闇雲にウィンドウサイズを増やせばよいという訳ではありません。

TCP通信は輻輳(ふくそう)制御などでこのウィンドウサイズを通信しているネットワーク経路で効率のよいサイズに動的に変更しています。

輻輳制御を変えるとウィンドウサイズを増減するアルゴリズムが変わるのでパフォーマンスも変化しますが、輻輳制御についてはまた別の機会に説明しようと思います。

TCP通信開始直後の初期ウィンドウサイズは設定されているサイズが使用されます。

TCPの3ハンドシェイク時にお互い申告したウィンドウサイズで小さいサイズが初期ウィンドウサイズとして使用されます。

初期ウィンドウサイズの値として、昔のLinuxは4、最近のLinuxは10、CDN(コンテンツデリバリーネットワーク)は20~40程度になっています。

初期ウィンドウサイズの設定

ip routeコマンドを使用してinitcwndとinitrwindを設定します。

ex. 全てのネットワーク経路のinitcwindとinitrwndの値を変更
ip route | while read p; do ip route change $p initcwnd 17 initrwnd 40; done

initcwndは送信する場合の初期ウィンドウサイズの設定で、通信相手のinitrwndと比べて小さい方が使われます。

initrwndは受信する場合の初期ウィンドウサイズの設定で、通信相手のinitcwndと比べて小さい方が使われます。

上記はスクリプトで他のパラメータはそのままに全ての経路に対してinitcwndとinitrwndを設定しています。

設定したい経路だけip routeで確認したパラメータにinitcwndやinitrwndを追加したものを個別に書いても構いません。

まとめ

CDNからデータを受信することが多い場合はinitrwndの値を大きめにしておくと通信パフォーマンスが上がる可能性があります。

またはパケットロスのほとんどない内部ネットーワーク通信では大きめに設定しておいてもいいかもしれません。

サーバ等は用途に応じて設定を変更した方がよいと思います。