WindowsServer2022でのTCPグローバルパラメータについて

## はじめに
- Googleさん、お願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951014/6d35d285-d8c9-3421-4c43-4399e0a61bdc.png)

- WindowsServerでサーバを構築する際、昔はWindowsServer2008 R2で**Chimney オフロード状態**なるパラメーターを適切に設定しないと、とんでもないことが起きたという話を諸先輩方から聞いたことがありました
    - TCP/IPの処理をプロセッサにさせるか、NICにさせるかのパラメーターで、これをenable(=NICで処理させる)にすると大変だったらしい...

- OSがバージョンアップすると、このTCPグローバルパラメーターにも変化があったので、備忘として残しておきます

## WindowsServer2022の場合

```
TCP グローバル パラメーター
----------------------------------------------
Receive-Side Scaling 状態          : disabled 
受信ウィンドウ自動チューニング レベル    : normal 
アドオン輻輳制御プロバイダー  : default 
ECN 機能                      : enabled 
RFC 1323 タイムスタンプ                 : allowed 
初期 RTO                         : 1000 
Receive Segment Coalescing 状態    : enabled 
非 Sack の Rtt 回復性             : disabled 
SYN の最大再送信数             : 4 
Fast Open                           : disabled 
Fast Open フォールバック                  : enabled 
HyStart                             : enabled 
Proportional Rate Reduction         : enabled 
ペーシング プロファイル                      : off 
```
- サーバ構築の際、以下項目はいつもいじってた
    - NetDMA
        - WindowsServer2019以降、非サポートのため考慮しない
    - Receive-Side Scaling 状態
        - enabled→disabledはこれまで通り変更

### デフォルト値について
- `RFC 1323 タイムスタンプ                 : allowed`
    - TCPの再送タイマーで使用されるRTTを計算する際、TCPウインドウサイズ(ACKを待たず一度に送信できるデータ量)が最大の65535バイトである場合、正確な計算ができない
    - タイムスタンプを有効にしておくと、特にデータ量が多い通信の場合、正確なRTTの計算が可能になり、スループットが最適化されるとのこと。
ということで、このまま

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/description-tcp-features

- `Proportional Rate Reduction         : enabled`        
    - WindowsServer2022から追加された項目。パケロス時の回復を早めてくれるとのことで、このまま

https://zenn.dev/portinc/articles/yuki-onodera-whatistcp

- `初期 RTO                         : 1000`
`最大 SYN 再送信数             : 4 `
　
    - RTOは再送するまでの時間、最大 SYN 再送信数はリトライ数
    　この設定だと1秒後に再送、次は2秒、4秒、8秒とRTOが増え、5回目に諦めるという設定

    - これまでだと初期 RTO:3000、最大 SYN 再送信数:2であったため、3秒後に再送、次は6秒、12秒、3回目に諦めるという設定
　
    - タイムアウトまでの時間が早い代わりに、再送回数が多いので通信の品質向上という意味で、このまま



## 参考(それ以前のバージョンについて)
### WindowsServer2019とWindowsServer2016のTCPグローバルパラメーターのSNPについて

- `Chimney オフロード状態` (Win2016以前)
`NetDMA 状態`
    - Windows Server2019からパラメータ廃止。
    構築ではこの両パラメータをdisableにしていた

- したがって、WindowsServer2019でのSNP無効化は以下コマンドのみ
    `netsh int tcp set global rss=disabled`

```
=====Windows Server 2019=====
C:\Users\Administrator>netsh int tcp show global
アクティブ状態を照会しています...

TCP グローバル パラメーター
----------------------------------------------
Receive-Side Scaling 状態          : disabled
受信ウィンドウ自動チューニング レベル    : normal
アドオン輻輳制御プロバイダー  : default
ECN 機能                      : enabled
RFC 1323 タイムスタンプ                 : disabled
初期 RTO                         : 3000
Receive Segment Coalescing 状態    : enabled
非 Sack の Rtt 回復性             : disabled
最大 SYN 再送信数             : 2
Fast Open                           : disabled
Fast Open フォールバック                  : enabled
HyStart                             : enabled
ペーシング プロファイル                      : off
```

```
=====Windows Server 2016=====
C:\Users\Administrator>netsh int tcp show global
アクティブ状態を照会しています...

TCP グローバル パラメーター
----------------------------------------------
Receive-Side Scaling 状態          : disabled
Chimney オフロード状態               : disabled
NetDMA 状態                        : disabled
Direct Cache Access (DCA)           : disabled
受信ウィンドウ自動チューニング レベル    : normal
アドオン輻輳制御プロバイダー  : none
ECN 機能                      : enabled
RFC 1323 タイムスタンプ                 : disabled
初期 RTO                         : 3000
Receive Segment Coalescing 状態    : enabled
非 Sack の Rtt 回復性             : disabled
SYN の最大再送信数             : 2
TCP Fast Open                       : disabled
```

## まとめ
- ここまで細かく考える必要があるのか...という感じですし、そういった場面に遭遇したことがないですが、もしもの時の参考になれば幸いです