TCP輻輳制御(FreeBSD版)

目次

TCP輻輳制御とは

TCPに限る話では無いが通常、通信を行い、一方(主にサービスプロバイダ側)に通信が集中するようになると混雑が起きる。 最初期(1980年台初頭)のTCPには輻輳制御(Congestion Control)が無かったため、 混雑は加速度的に悪化することが判明していた(らしい)。

このTCPに「輻輳制御アルゴリズム」による通信(頻度等)制御を行うことで、混雑を押さえる仕組みができあがった。 とはいえ、時代に合わせた輻輳制御アルゴリズムが提案されていて、理想的で決定的なアルゴリズムが存在しないこともあり、 度々新しいアルゴリズムが提案されているのが現実である。

FreeBSDでは伝統的に4.4BSD由来のNewReno輻輳制御を採用しており、デフォルトとなっている。 FreeBSD9からは輻輳制御アルゴリズムの整理、モジュール化が実施されており、開発および設定が簡略化されている。

FreeBSD11以降ならとりあえず設定しておけ

FreeBSD11.0のリリースは2016年10月10日。

恒久的設定

cc_dctcp_load="YES"

net.inet.tcp.cc.algorithm=dctcp

※ただし、設定しただけなので、再起動するまで範囲されない。

手動で切り替え

# kldload cc_dctcp
# sysctl net.inet.tcp.cc.algorithm=dctcp
net.inet.tcp.cc.algorithm: newreno -> dctcp

※アルゴリズムの入れ替えなのでオンザフライで変更可能である。この時再起動は不要。再起動するとデフォルトに戻る。

コメント

# sysctl net.inet.tcp.ecn.enable
net.inet.tcp.ecn.enable: 2

net.inet.tcp.ecn.enable=1

FreeBSD8.3以降ならとりあえず設定しておけ

なお、

恒久的設定

cc_vegas_load="YES"

net.inet.tcp.cc.algorithm=vegas

※ただし、設定しただけなので、再起動するまで範囲されない。

手動で切り替え

# kldload cc_vegas
# sysctl net.inet.tcp.cc.algorithm=vegas
net.inet.tcp.cc.algorithm: newreno -> vegas

※アルゴリズムの入れ替えなのでオンザフライで変更可能である。この時再起動は不要。再起動するとデフォルトに戻る。

OS事情

OS

バージョン

デフォルトアルゴリズム

オプションアルゴリズム

FreeBSD

全バージョン

NewReno

なし

FreeBSD

8.3(9.0)以降

NewReno

HDCHDCubicH-TCPVegas

FreeBSD

9.2以降

NewReno

HDCHDCubicH-TCPVegasCDG

FreeBSD

11.0以降

NewReno

HDCHDCubicH-TCPVegasCDGDC-TCP

Linux

2.6.19以降

Cubic

未調査

Windows

Vista以降

NewReno

C-TCP

Windows

8以降

C-TCP

NewReno

Windows Server

2008以降

C-TCP

NewReno

Windows Server

2012以降

DC-TCP

NewRenoC-TCP

参考文献

FreeBSD/TCP輻輳制御 (last edited 2019-05-26 01:00:43 by NorikatsuShigemura)