= TCP輻輳制御(FreeBSD版) = == 目次 == <> == TCP輻輳制御とは == TCPに限る話では無いが通常、通信を行い、一方(主にサービスプロバイダ側)に通信が集中するようになると混雑が起きる。 最初期(1980年台初頭)のTCPには輻輳制御(`Congestion Control`)が無かったため、 混雑は加速度的に悪化することが判明していた(らしい)。 このTCPに「輻輳制御アルゴリズム」による通信(頻度等)制御を行うことで、混雑を押さえる仕組みができあがった。 とはいえ、時代に合わせた輻輳制御アルゴリズムが提案されていて、理想的で決定的なアルゴリズムが存在しないこともあり、 度々新しいアルゴリズムが提案されているのが現実である。 FreeBSDでは伝統的に4.4BSD由来の!NewReno輻輳制御を採用しており、デフォルトとなっている。 FreeBSD9からは輻輳制御アルゴリズムの整理、モジュール化が実施されており、開発および設定が簡略化されている。 == FreeBSD11以降ならとりあえず設定しておけ == FreeBSD11.0のリリースは2016年10月10日。 === 恒久的設定 === * `/boot/loader.conf` に以下の設定を追加する。 {{{#!highlight shell numbers=disable cc_dctcp_load="YES" }}} * `/etc/sysctl.conf` に以下の設定を追加する。 {{{#!highlight shell numbers=disable net.inet.tcp.cc.algorithm=dctcp }}} ※ただし、設定しただけなので、再起動するまで範囲されない。 === 手動で切り替え === {{{#!highlight console numbers=disable # kldload cc_dctcp # sysctl net.inet.tcp.cc.algorithm=dctcp net.inet.tcp.cc.algorithm: newreno -> dctcp }}} ※アルゴリズムの入れ替えなのでオンザフライで変更可能である。この時再起動は不要。再起動するとデフォルトに戻る。 == コメント == * DC-TCPアルゴリズム使用にあたってECN(`Explicit Congestion Notification` - 明示的輻輳通知)の設定が必要であるが、11.0-Rからはデフォルトで有効となっている。 * 下記コマンドでの設定値を確認しておくこと(デフォルトで2である)。 {{{#!highlight console numbers=disable # sysctl net.inet.tcp.ecn.enable net.inet.tcp.ecn.enable: 2 }}} * この設定は以下の通りである。 * 0:ECN機能の無効化 * 1:ECN機能の送受信時有効(クライアントおよびサーバーユース) * 2:ECN機能の受信時有効(サーバーユース) * 積極的にECN機能を利用するなら、`/etc/sysctl.conf`に{{{net.inet.tcp.ecn.enable=1}}}を追加設定しよう。 {{{#!highlight shell numbers=disable net.inet.tcp.ecn.enable=1 }}} == FreeBSD8.3以降ならとりあえず設定しておけ == なお、 * FreeBSD8.3のリリースは2012年04月18日。 * FreeBSD9.0のリリースは2012年01月12日。 === 恒久的設定 === * `/boot/loader.conf` に以下の設定を追加する。 {{{#!highlight shell numbers=disable cc_vegas_load="YES" }}} * `/etc/sysctl.conf` に以下の設定を追加する。 {{{#!highlight shell numbers=disable net.inet.tcp.cc.algorithm=vegas }}} ※ただし、設定しただけなので、再起動するまで範囲されない。 === 手動で切り替え === {{{#!highlight console numbers=disable # kldload cc_vegas # sysctl net.inet.tcp.cc.algorithm=vegas net.inet.tcp.cc.algorithm: newreno -> vegas }}} ※アルゴリズムの入れ替えなのでオンザフライで変更可能である。この時再起動は不要。再起動するとデフォルトに戻る。 == OS事情 == ||<#FFFF00> OS ||<#FFFF00> バージョン ||<#FFFF00> デフォルトアルゴリズム ||<#FFFF00> オプションアルゴリズム || || `FreeBSD` || 全バージョン || `NewReno` || なし || || `FreeBSD` || `8.3(9.0)`以降 || `NewReno` || `HD`、`CHD`、`Cubic`、`H-TCP`、`Vegas` || || `FreeBSD` || `9.2`以降 || `NewReno` || `HD`、`CHD`、`Cubic`、`H-TCP`、`Vegas`、`CDG` || || `FreeBSD` || `11.0`以降 || `NewReno` || `HD`、`CHD`、`Cubic`、`H-TCP`、`Vegas`、`CDG`、`DC-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` || `NewReno`、`C-TCP` || * [[https://www.freebsd.org/cgi/man.cgi?query=cc_newreno&manpath=FreeBSD+8.3-RELEASE|NewReno輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_hd&sektion=4&manpath=FreeBSD+8.3-RELEASE|HD輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_chd&sektion=4&manpath=FreeBSD+8.3-RELEASE|CHD輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_cubic&sektion=4&manpath=FreeBSD+8.3-RELEASE|Cubic輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_htcp&sektion=4&manpath=FreeBSD+8.3-RELEASE|H-TCP輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_vegas&sektion=4&manpath=FreeBSD+8.3-RELEASE|Vegas輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_cdg&skeltion=4&manpath=FreeBSD+9.2-RELEASE|CDG輻輳制御]] * [[https://www.freebsd.org/cgi/man.cgi?query=cc_dctcp&sektion=4&manpath=FreeBSD+11.0-RELEASE|DC-TCP輻輳制御]] == 参考文献 == * [[http://www.net.c.dendai.ac.jp/~yutaro/|TCP各バージョンの輻輳制御の比較]] (`Tahoe`、`Reno`、`NewReno`、`Vegas`の比較) * [[https://blog.yuuk.io/entry/cubictcp|"CUBIC: A new TCP-friendly high-speed TCP variant"を読んだ]] * [[http://nothingcosmos.blog52.fc2.com/blog-entry-187.html|BBR (Bottleneck Bandwidth and RTT) congestion control]] * [[https://msdn.microsoft.com/ja-jp/library/hh997028(v=ws.11).aspx|データ センター伝送制御プロトコル (DCTCP)]] * [[https://www.freebsd.org/ja/releases/8.3R/announce.html|FreeBSD 8.3-RELEASE Announce]] * [[https://www.freebsd.org/ja/releases/9.0R/announce.html|FreeBSD 9.0-RELEASE Announce]] * [[https://technet.microsoft.com/ja-jp/library/bb726965.aspx|Windows Server 2008 と Windows Vista の新しいネットワーク機能]] * [[https://docs.oracle.com/cd/E26924_01/html/E25872/gkkfr.html|ネットワークの輻輳と輻輳制御(OpenSolaris)]] * [[https://www.publickey1.jp/blog/17/googletcptcp_bbrgoogle_cloud.html|Google、TCPのスループットとレイテンシを改善する輻輳制御アルゴリズム「TCP BBR」をGoogle Cloudで利用開始]] * [[https://itpro.nikkeibp.co.jp/atcl/column/17/040400119/040400003/|TCPの輻輳制御アルゴリズム、どれが一番速い?]] * [[http://takyaku.com/?p=757|LinuxのTCP受信バッファ溢れと輻輳制御の話]]