TCPウィンドウ・スケール・オプションは、伝送制御プロトコル(TCP)で許可される受信ウィンドウサイズを、従来の最大値である65,535バイト以上に増やすためのオプションです。このTCPオプションは、他のいくつかのオプションとともに、ロングファットネットワーク(LFN)を扱うRFC 7323で定義されています。
TCP通信のスループットは、輻輳ウィンドウと受信ウィンドウという2つのウィンドウによって制限されます。輻輳ウィンドウはネットワークの容量を超えないように制御し(輻輳制御)、受信ウィンドウは受信側のデータ処理能力を超えないように制御します(フロー制御)。受信側は、例えばWebサーバーのように非常にビジーな場合、データ過多で処理能力を超えてしまう可能性があります。各TCPセグメントには、受信ウィンドウの現在の値が含まれています。例えば、送信側が4000バイト目を承認し、受信ウィンドウを10000バイトに指定したACKを受信した場合、輻輳ウィンドウが許容範囲内であっても、送信側は14000バイト目以降のパケットを送信しません。
TCPウィンドウスケールオプションは、帯域幅遅延積 (BDP)が64KBを超える場合に効率的なデータ転送のために必要です[ 1 ]。たとえば、 1.5Mbit/sのT1伝送線路を513ミリ秒の往復時間 (RTT)を持つ衛星リンク上で使用した場合、帯域幅遅延積は ビット、つまり約96,187 バイトです。最大バッファサイズ64KB [ 1 ]を使用すると、 バッファは理論上 の最大速度1.5 Mbit/sの(65,535 / 96,187) = 68%、つまり1.02 Mbit/sまでしか満たされません 。
ウィンドウ スケール オプションを使用すると、受信ウィンドウ サイズを最大値まで増やすことができます。 バイト、つまり約 1 GiB。[ 2 ]これは、ヘッダー オプション フィールドに 1 バイトのシフト カウントを指定することで実現します。実際の受信ウィンドウ サイズは、シフト カウントの値だけ左にシフトされます。シフト カウントの値には、最大 14 を使用できます。これにより、単一の TCP 接続で、 使用可能な帯域幅をすべて利用して、例の衛星リンクを介して 1.5 Mbit/s でデータを転送できます。
基本的に、1回の往復時間内に転送できる伝送ウィンドウの総数は1つまでです。ウィンドウスケールオプションを使用すると、単一のTCP接続で最大1GBのBDPを持つLFN( 例えば、 往復時間800msの10Gbpsリンク)を最大限に活用できます 。
一部のファイアウォールはTCPウィンドウスケーリングを適切に実装していないため、ユーザーのインターネット接続が数分間断続的に誤動作し、その後理由もなく再び正常に動作するようになることがあります。ファイアウォールがTCP拡張機能をサポートしていない場合にも問題があります。[ 3 ]
TCP ウィンドウ スケーリングは、Windows 2000以降、Windowsに実装されています。[ 4 ] [ 5 ] Windows Vista / Server 2008 以降ではデフォルトで有効になっていますが、必要に応じて手動で無効にすることもできます。[ 6 ] Windows VistaおよびWindows 7では、 TCP 受信バッファのデフォルトが 64 kB に固定されており、「自動チューニング」によって最大 16 MB までスケーリングされるため、長いファット ネットワークでの手動 TCP チューニングが制限されます。[ 7 ]
Linuxカーネル(2004年8月版2.6.8以降)では、TCPウィンドウ スケーリングがデフォルトで有効になっています。設定パラメータは/procファイルシステムにあります。擬似ファイル/proc/sys/net/ipv4/tcp_window_scalingとその関連ファイル/proc/sys/net/ipv4/tcp_rmemおよび/proc/sys/net/ipv4/tcp_wmemを参照してください(詳細については、sysctlセクションを参照)。[ 8 ]man tcp
スケーリングを無効にするには、以下のコマンドを実行してください。
$ sudo sysctl -w "net.ipv4.tcp_window_scaling=0"再起動後も変更を維持するには、/etc/sysctl.conf (またはsystemd 207以降では/etc/sysctl.d/99-sysctl.conf )に"net.ipv4.tcp_window_scaling=0"という行を追加します。
FreeBSD、OpenBSD、NetBSD 、およびMac OS Xのデフォルト設定では、ウィンドウのスケーリング(およびRFC 1323に関連するその他の機能)が有効になっています。これらの状態を確認するには、 sysctlコマンドを使用して「 net.inet.tcp.rfc1323」変数 の値を確認できます。
$ sysctl net.inet.tcp.rfc1323 値1(出力「net.inet.tcp.rfc1323=1") はスケーリングが有効であることを意味し、0 は無効であることを意味します。有効になっている場合は、次のコマンドを実行することで無効にできます。
$ sudo sysctl -w net.inet.tcp.rfc1323 = 0この設定はシステム再起動時に失われます。起動時に確実に設定するには、/etc/sysctl.confに次の行を追加してください。 net.inet.tcp.rfc1323=0
しかし、macOS 10.14ではこのコマンドはエラーになります
sysctl: 不明な oid 'net.inet.tcp.rfc1323'