Windows の TCP Template について調べた内容まとめ

[TechNet の Networking Blog で、TCP Template の記事](https://blogs.technet.microsoft.com/networking/2018/10/03/tcp-templates-for-windows/)を読んで、実は初めて TCP Template について知ったので、少し調べてみました。

## TCP Template とは？

Windows OS において、TCP Connection における各種のオプション (DelayedAckTimeout や InitialRto などなど) を、「比較的高速なデータセンタネットワーク」と「比較的低速なインターネットワーク」で切り替えるために利用するもののようです。

## Template の種類

* Internet
* Datacenter

インターネット向けと、データセンタネットワーク向けで、それぞれ Template があります。

* InternetCustom
* DatacenterCustom

前の二つの Template について、カスタマイズするための Template が用意されています。

* Compat

レガシーアプリケーションのための Template らしいです。ちなみに、[前述の記事](https://blogs.technet.microsoft.com/networking/2018/10/03/tcp-templates-for-windows/)では「近年のアプリでは使うのは推奨しない」と書いてあります。

* Automatic

自動で前述の Template を切り替える Template とのこと。ちなみに、既定ではすべてのコネクションがこの Template を使うようになっています。

```PS
> Get-NetTransportFilter

SettingName       : Automatic
Protocol          : TCP
LocalPortStart    : 0
LocalPortEnd      : 65535
RemotePortStart   : 0
RemotePortEnd     : 65535
DestinationPrefix : *
```

[Get-NetTCPConnection コマンドレット](https://technet.microsoft.com/ja-jp/library/hh826153.aspx)を利用することで、どの TCP コネクションが、どの Template を適用されているか、確認することができます。

```
> Get-NetTCPConnection
...
10.0.1.5                            49736     52.230.84.217                       443        Established Internet       2416
10.0.1.5                            49725     52.239.144.132                      443        Established Internet       3496
10.0.1.5                            49722     168.63.129.16                       32526      Established Datacenter     3496
10.0.1.5                            49721     168.63.129.16                       80         Established Datacenter     5032
10.0.1.5                            49720     168.63.129.16                       80         Established Datacenter
```

## Automatic っていうけど、どういう条件で切り替えるの？

[TechNet Blog](https://blogs.technet.microsoft.com/networking/2018/10/03/tcp-templates-for-windows/) の情報によると、RTT が 10ms を超えるかどうかで決まるとのことです。

＃ちなみに、このブログ以外には公式でも条件についての記述は見つけられませんでした・・・！

## どうやって各種オプションを変更するの？

Set-NetTCPSetting で変えることができます。詳細は、下記のドキュメントを参照してください。

* [TechNet Blog](https://blogs.technet.microsoft.com/networking/2018/10/03/tcp-templates-for-windows/)
* [Windows 8, 10, 2012 Server TCP/IP Tweaks](https://www.speedguide.net/articles/windows-8-10-2012-server-tcpip-tweaks-5077)
* [MSFT_NetTCPConnection class](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/nettcpipprov/msft-nettcpconnection)
* [MSFT_NetTCPSetting class](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/nettcpipprov/msft-nettcpsetting)

## Custom ってどうやって使うの？

既定の状態だと、Automatic で選択されるのは「Internet」と「Datacenter」だけであり、「\*Custom」は利用されません。これは、Template の AutomaticUseCustom が影響しています。

```PS
> Get-NetTCPSetting

...
AutomaticUseCustom             : Disabled
...
```

せっかく設定した \*Custom Template をどうやって使うかというと、Set-NetTCPSetting コマンドレットで、いずれかの AutomaticUseCustom を Enabled にすると、すべての AutomaticUseCustom が Enabled になり、以降で作成される TCP Connection において、\*Custom の Template が使われるようになります。ちなみに再起動は必要ありませんでした。

```
10.0.1.5                            49813     168.63.129.16                       80         Established DatacenterC... 2456
10.0.1.5                            49812     23.211.97.63                        80         Established DatacenterC... 2744
10.0.1.5                            49811     118.215.189.11                      443        Established DatacenterC... 2744
10.0.1.5                            49808     204.79.197.200                      443        Established DatacenterC... 2744
10.0.1.5                            49736     52.230.84.217                       443        Established Internet       2416
10.0.1.5                            49725     52.239.144.132                      443        Established Internet       3496
10.0.1.5                            49722     168.63.129.16                       32526      Established Datacenter     3496
10.0.1.5                            49721     168.63.129.16                       80         Established Datacenter     5032
10.0.1.5                            49720     168.63.129.16                       80         Established Datacenter
```
※下部の五つのコネクションは、AutomaticUseCustom を Enabled にする前から存在しているコネクションです。

## 一部は Automatic にしたくないんだけど・・・

[New-NetTransportFilter コマンドレット](https://docs.microsoft.com/en-us/powershell/module/nettcpip/new-nettransportfilter?view=win10-ps)で、IPアドレス範囲やポートなどの条件に応じて、使用する Template を決めておくことができます。

コマンド例などは、上記のリンク先を参照してください。

## 最後に

以上、Windows の TCP Template について調べた内容のまとめでした。

普段（？）はあまり気にしないポイントですが、特定のコネクションについてゴリゴリチューニングしたい場合はとても便利ですね。

実は、二つテンプレートを持っていて切り替えているなんていうのは今まで知らなかったのが正直なところで、ちゃんと定期的に勉強しないとなぁ・・・と反省です。。