Windows Server の RFC 1323 TCP Timestamps Option について調査する機会があったので。
RFC 1323 では、 TCP Timestamps Option について記載されています。
Windows Server の場合、Windows TCP 機能の説明のタイムスタンプ が該当する内容となります。
この機能を使用するかの制御については、netsh interface tcp の set global timestamp で実施します。
この設定は、Windows Server 2022 を境にデフォルトが変更されており、OS のバージョンによって次のような初期設定となっています。
- Windows Server 2019 まで: disabled がデフォルト
- disabled / enabled を設定可能
- Windows Server 2022 以降: allowed がデフォルト
- disabled / enabled /allowed を設定可能
Windows Server 2019 までは、「allowed」のオプションが提供されておらず、すべてのパケットで timestamps オプションを有効化するかの制御のみが可能となっており、設定有効時の影響範囲が大きいです。
Windows Server 2022 以降は、allowed がデフォルトとなっており、サーバーからの発信については、Timestamps オプションは使用しませんが、サーバーへの要求時に Timestamps オプションが設定されている場合には、応答に Timestamps オプションを付与した状態でパケットが送信されます。
現在の設定については、「netsh interface tcp show global」で確認ができ、設定を変更する場合は、「netsh int tcp set global timestamps=allowed」というようなコマンドにより設定を変更できます。
設定が期待通り動作しているかは、Windows Server で Wireshark 等でパケットの情報を取得することで確認ができます。
TCP Option に Timestamp が付与されている通信を受け取った際の、Windows Server からの応答に Timestamps オプションが設定されていれば、Windows Server としては有効化された状態となっています。
Windows 間であれば、「netsh int tcp set global timestamps=enabled」の設定を実施しているサーバー間の通信で確認ができ、Linux の場合は「net.ipv4.tcp_tw_reuse=1」に設定した環境から、Windows に通信を実施すれば動作を確認できるかと。
このオプションは、Azure の Linux VM で一貫した転送速度を実現する でも設定されているオプションとなります。
Linux のオプションは TIME_WAIT の状態となるソケットの数を少なくする目的になるかと思いますので、設定の効果を見る際には「sysctl -w net.ipv4.ip_local_port_range="65000 65100"」というように、Ephemeral Port の数を調整すると、効果が分かりやすいかと。
左が「tcp_tw_reuse=0」、右が「tcp_tw_reuse=1」の時の TIME_WAIT のソケットの状態の違いとなりますが、期待通り動作していると、TIME_WAIT の数が変化していることが確認できます。
Ephemeral Port の数が大きいと TIME_WAIT の変化が把握しづらいため、効果を見るときにはポート数を変更しておくとわかりやすいかと。