TCPのタイムスタンプとは?オプションの役割も!(timestamp:RTT測定:PAWS:ヘッダオプション:性能向上など)
ネットワーク通信において、TCPは信頼性の高いデータ転送を実現するプロトコルとして広く使われています。その中でも、TCPのタイムスタンプオプションは、通信の品質や効率を大きく左右する重要な機能のひとつです。RTT測定やPAWS(Protection Against Wrapped Sequences)による重複パケット排除、さらにはヘッダオプションを活用した性能向上など、タイムスタンプオプションが担う役割は多岐にわたります。本記事では、TCPタイムスタンプの仕組みから実用的な活用方法まで、わかりやすく解説していきましょう。
TCPタイムスタンプとは何か?その本質と役割
それではまず、TCPタイムスタンプの基本的な概念と役割について解説していきます。
TCPタイムスタンプの定義と概要
TCPタイムスタンプは、RFC 1323で定義されたTCPヘッダオプションのひとつです。送信側がパケットを送り出す際にタイムスタンプ値を付加し、受信側がそれをエコーバックする仕組みを採用しています。

TCPのヘッダオプション領域は最大40バイトまで利用でき、タイムスタンプオプションはそのうち10バイトを消費します。具体的には、TSval(タイムスタンプ値)とTSecr(タイムスタンプエコー返信)という2つの32ビットフィールドで構成されています。
| フィールド名 | サイズ | 役割 |
|---|---|---|
| Kind(オプション種別) | 1バイト | タイムスタンプオプションを示す値(8) |
| Length(長さ) | 1バイト | オプション全体のバイト数(10) |
| TSval(タイムスタンプ値) | 4バイト | 送信側が付加するタイムスタンプ |
| TSecr(エコー返信) | 4バイト | 受信側が返す直前受信分のタイムスタンプ |
このオプションは、TCPの3ウェイハンドシェイク時にSYNパケットで交渉され、双方が対応している場合にのみ有効化される仕組みです。
ヘッダオプションとしての位置づけ
TCPヘッダは基本的に20バイトの固定部分を持ちますが、オプション領域を追加することでさまざまな拡張機能を利用できます。タイムスタンプオプションはその代表的な存在といえるでしょう。
ヘッダオプションを使うことで、TCPは基本仕様を変えることなく柔軟に機能拡張できます。タイムスタンプ以外にも、ウィンドウスケールやSACK(選択的確認応答)などがオプションとして定義されており、現代のTCP実装では多くが標準的に有効化されています。
タイムスタンプが有効化されるまでの流れ
タイムスタンプオプションはネゴシエーション型の機能です。接続確立時のSYNパケットに「タイムスタンプオプションを使いたい」という意思を載せ、相手がSYN-ACKで同じオプションを返した場合にのみ有効化されます。
# TCPハンドシェイクとタイムスタンプネゴシエーションの流れ
Client → SYN(TSval=100, TSecr=0) → Server
Client ← SYN-ACK(TSval=500, TSecr=100) ← Server
Client → ACK(TSval=101, TSecr=500) → Server
結果:両者がタイムスタンプオプションに合意し、以降のパケットでタイムスタンプが付与される
このネゴシエーションにより、対応していない古い実装との後方互換性も保たれています。
RTT測定によるネットワーク性能の把握
続いては、タイムスタンプが果たす最も重要な役割のひとつである、RTT測定の仕組みを確認していきます。
RTT測定の基本的な仕組み
RTT(Round Trip Time)とは、パケットを送信してから確認応答(ACK)が返ってくるまでの往復時間のことです。TCPはこのRTTを基にして再送タイムアウト時間(RTO)を動的に計算しており、ネットワーク環境に適応した通信を実現しています。
タイムスタンプオプションを使うと、ACKを受け取るたびにRTTを正確に計測できます。具体的な流れは以下のとおりです。
# RTT測定の手順
送信側:TSval = 現在時刻(例:1000)を付加してパケット送信
受信側:TSval=1000 を TSecr にコピーしてACK返送
送信側:ACK受信時刻(例:1050)- TSecr(1000)= RTT(50ms)
出力結果:RTT = 50ms が算出され、RTOの計算に使用される
従来のRTT測定では、再送パケットの扱いに「ケルン(Karn)のアルゴリズム」という回避策が必要でした。タイムスタンプを使えばこの問題を根本的に解決できるため、より正確なRTT計算が可能になります。
RTTとRTO計算への影響
RTTが正確に測定できると、RTO(再送タイムアウト値)の精度も向上します。RTOが適切でないと、不必要な再送が発生したり、逆に再送が遅れて通信が停滞したりと、双方向で問題が生じます。
LinuxなどのOSでは、RTT計測結果をSRTT(平滑化RTT)としてEWMA(指数加重移動平均)で管理しており、タイムスタンプオプションがその精度を底上げしています。
高速ネットワーク環境でのRTT測定の重要性
ギガビット以上の高速ネットワーク環境では、短時間に大量のパケットが行き交います。このような環境でタイムスタンプを使ったRTT計測は特に価値を発揮するでしょう。
低レイテンシ環境ではRTTがミリ秒以下になるケースもあり、精密なRTT測定があってこそ適切なウィンドウサイズ制御や輻輳制御が機能します。タイムスタンプオプションは、現代の高速ネットワークにおいてなくてはならない存在といえます。
PAWSによる重複パケットの排除
続いては、タイムスタンプの2つ目の重要な役割であるPAWS(Protection Against Wrapped Sequences)について確認していきます。
シーケンス番号の折り返し問題とは
TCPのシーケンス番号は32ビット(約42億)の値域を持ちますが、高速通信環境では使い切るのに十分な時間がありません。たとえば10Gbpsのネットワークでは、約34秒でシーケンス番号が一周してしまいます。
| 通信速度 | シーケンス番号が一周する時間 |
|---|---|
| 1 Mbps | 約9.5時間 |
| 100 Mbps | 約343秒 |
| 1 Gbps | 約34秒 |
| 10 Gbps | 約3.4秒 |
この折り返しが起きると、古いパケットと新しいパケットのシーケンス番号が同じになり、受信側が正しく判断できなくなる危険性があります。
PAWSの仕組みと動作
PAWSは、タイムスタンプを利用してこの問題を解決します。受信側は直前に受け取ったタイムスタンプ値を記憶しておき、到着したパケットのタイムスタンプがそれより古い場合は「過去のパケット」と判断して破棄します。
# PAWSによるパケット検証の擬似ロジック
受信パケットのTSval = 800
記憶している最新TSval = 1200
if パケットのTSval < 記憶TSval:
# パケットを破棄(古い重複パケットと判断)
discard()
else:
# パケットを受理して処理継続
accept()
出力結果:TSval=800 < 1200 のため、このパケットは破棄される
タイムスタンプは時間の経過とともに単調増加するため、シーケンス番号が折り返しても「どちらが新しいか」を正確に判断できます。
PAWSがセキュリティにも貢献する理由
PAWSは単なる重複排除機能にとどまらず、TCPスプーフィング攻撃への耐性も高めます。攻撃者が古いパケットを再利用してセッションに割り込もうとしても、タイムスタンプの整合性チェックによって弾き返されます。
ただし、タイムスタンプそのものの改ざんには対処できないため、IPsecなど別のセキュリティ機能との併用が推奨されます。
タイムスタンプオプションと性能向上の関係
続いては、タイムスタンプオプションが通信性能全体にどのように貢献しているかを確認していきます。
輻輳制御との連携
TCPの輻輳制御アルゴリズム(CUBIC、BBRなど)は、RTTやパケットロスの情報をもとに送信レートを調整します。タイムスタンプによって正確なRTTが得られると、輻輳ウィンドウの調整精度も向上します。
特にBBR(Bottleneck Bandwidth and Round-trip propagation time)では、RTTの精密な計測が最大帯域幅の推定に直結するため、タイムスタンプオプションの有無が実効スループットに影響を与えることもあります。
SACKとの組み合わせ効果
タイムスタンプはSACK(選択的確認応答)とも組み合わせて使われます。SACKは受信済みのパケット範囲を細かく通知する機能で、不必要な再送を削減します。タイムスタンプと組み合わせると、再送すべきパケットの特定がさらに正確になります。
| 機能 | 単独の効果 | タイムスタンプ併用時の効果 |
|---|---|---|
| SACK | 再送範囲の絞り込み | RTT計測精度向上による再送タイミング最適化 |
| 輻輳制御 | 送信レートの調整 | より正確なRTTに基づいたウィンドウ制御 |
| PAWS | 重複パケットの排除 | タイムスタンプの単調増加を利用した高精度な判定 |
タイムスタンプオプションのオーバーヘッドと現実的なトレードオフ
タイムスタンプオプションはメリットが多い一方、10バイトのヘッダオーバーヘッドが生じます。小さなパケットが多いシステムでは、このオーバーヘッドが無視できないケースもあるでしょう。
Linuxでは以下のコマンドでタイムスタンプオプションの有効・無効を制御できます。
# タイムスタンプオプションの現在の設定を確認
sysctl net.ipv4.tcp_timestamps
タイムスタンプオプションを無効化する場合
sysctl -w net.ipv4.tcp_timestamps=0
タイムスタンプオプションを有効化する場合
sysctl -w net.ipv4.tcp_timestamps=1
出力結果:net.ipv4.tcp_timestamps = 1(1が有効、0が無効)
多くの環境ではデフォルトで有効になっており、無効化することでわずかにオーバーヘッドを削減できる場合もありますが、PAWSやRTT精度の恩恵を失うリスクとのトレードオフを慎重に検討する必要があります。
Pythonを使って簡易的にTCP接続のタイムスタンプ情報を確認するサンプルコードも見てみましょう。
import socket
import struct
import time
TCP_TIMESTAMPオプションの定数
TCP_TIMESTAMP = 8
ソケット生成
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
タイムスタンプオプションの状態を確認(Linuxのみ)
try:
# SOL_TCP レベルでの TCP_TIMESTAMP 取得
val = sock.getsockopt(socket.IPPROTO_TCP, TCP_TIMESTAMP)
print(f"TCPタイムスタンプオプション設定値: {val}")
except OSError as e:
print(f"取得エラー: {e}")
finally:
sock.close()
出力結果:TCPタイムスタンプオプション設定値: 1
このようにプログラムからもタイムスタンプオプションの状態を確認することができます。
まとめ
本記事では、TCPのタイムスタンプオプションについて、その定義・構造から始まり、RTT測定、PAWSによる重複パケット排除、そして性能向上への貢献まで幅広く解説してきました。
タイムスタンプオプションは一見地味な存在ですが、RTTの精密な計測・PAWSによるシーケンス番号折り返し問題の解決・輻輳制御の精度向上と、TCP通信の根幹を支える重要な役割を担っています。現代のネットワーク環境、特に高速・大容量通信が当たり前となった今日においては、タイムスタンプオプションの理解はネットワークエンジニアにとって欠かせない知識といえるでしょう。
オーバーヘッドとの兼ね合いを考慮しながらも、基本的には有効化しておくことが推奨される機能です。引き続きTCPの各種オプションや関連プロトコルへの理解を深めることで、ネットワーク設計や障害対応の力が一段と向上するはずです。