附属書C. TCP検証 (TCP Verification)
本附属書では、TCP実装の正確性を検証するためのガイドラインとテスト方法を提供します。
検証方法
1. ユニットテスト (Unit Testing)
ヘッダー解析:
- TCPヘッダーフィールドの正しい解析
- オプション処理
- チェックサム計算
状態マシン:
- 各状態遷移の検証
- 境界条件テスト
- 無効な状態遷移の拒否
シーケンス番号:
- ISN生成の予測不可能性
- シーケンス番号のラップアラウンド処理
- 重複検出
2. 統合テスト (Integration Testing)
接続ライフサイクル:
- 正常な接続確立 (3ウェイハンドシェイク)
- データ転送
- 正常な接続終了 (4ウェイハンドシェイク)
エラー処理:
- パケット損失のシミュレーション
- 順序が狂ったパケット
- 重複したパケット
- 破損したチェックサム
3. 相互運用性テスト (Interoperability Testing)
他の実装との検証:
- 主要なTCPスタック (Linux, Windows, BSD, macOS) との相互運用性
- 異なるネットワーク条件下でのテスト
- さまざまなMTUサイズ
一般的な問題の検出
1. シーケンス番号の問題
テストシナリオ:
1. 同じISNが複数の接続で生成されないことを確認
2. シーケンス番号のラップアラウンドを適切に処理
3. 範囲外のシーケンス番号を拒否
検証方法:
- ISN予測可能性テスト
- 長時間接続テスト
- 悪意のあるシーケンス番号攻撃シミュレーション
2. チェックサムエラー
テストシナリオ:
1. 有効なチェックサムで送信されたすべてのセグメント
2. 無効なチェックサムを持つセグメントを拒否
3. IPv4およびIPv6での正しい疑似ヘッダー計算
3. ウィンドウ管理
テストシナリオ:
1. 受信ウィンドウサイズを尊重
2. ウィンドウスケーリングの正しい動作 (有効な場合)
3. ゼロウィンドウ状況の処理
4. 再送信メカニズム
テストシナリオ:
1. 失われたセグメントの再送信
2. 適切なタイムアウト計算 (RTO)
3. 指数バックオフ
4. 高速再送信 (3つの重複ACK後)
パフォーマンス検証
1. スループットテスト
測定項目:
- さまざまなウィンドウサイズでの最大スループット
- RTTとスループットの関係
- 輻輳制御の有効性
テスト環境:
- 低遅延ネットワーク (< 10ms RTT)
- 中程度遅延ネットワーク (50-100ms RTT)
- 高遅延ネットワーク (> 200ms RTT)
- さまざまなパケット損失率 (0%, 0.1%, 1%, 5%)
2. レイテンシテスト
測定項目:
- 接続確立時間
- 最初のバイトまでの時間 (TTFB)
- データ配信レイテンシ
3. 輻輳制御検証
テスト:
1. スロースタートの動作
2. 輻輳回避
3. 高速再送信と高速リカバリ
4. RFC 5681への準拠
セキュリティ検証
1. ISN予測可能性テスト
方法:
# 擬似コード
isns = []
for i in range(1000):
conn = create_connection()
isns.append(get_initial_sequence_number(conn))
close(conn)
# ISNが統計的に予測不可能であることを検証
assert is_random(isns) == True
assert entropy(isns) > MIN_ENTROPY
2. RST攻撃保護
テストシナリオ:
1. 範囲外のシーケンス番号を持つRSTセグメントを無視
2. 有効なウィンドウ内のRSTのみを受け入れる
3. RFC 5961ガイドラインに従う
3. SYNフラッド保護
テスト:
1. SYNクッキーまたは同等のメカニズムを実装
2. 大量のSYNリクエスト下でのシステムの回復力
3. 正当な接続が確立可能であることを確認
ストレステスト
1. 同時接続
テスト:
- 数千の同時接続を作成
- すべての接続で正しいデータ配信を検証
- メモリリークの監視
- CPU使用率の測定
2. 長期接続
テスト:
- 接続を数時間/数日間維持
- シーケンス番号のラップアラウンドを検証
- メモリ使用の安定性
- パフォーマンスの劣化がないことを確認
境界条件テスト
1. エッジケース
- ゼロウィンドウ状況
- 最大セグメントサイズ
- 最小セグメントサイズ (1バイト)
- フラグメンテーション
- MTU変更
2. 無効な入力
- 不正なヘッダー長
- 無効なフラグの組み合わせ
- 範囲外の値
- 予約ビットの設定
プロトコル準拠テスト
1. RFC 9293準拠
検証項目:
- すべてのMUST要件が実装されていること
- SHOULD要件が実装されているか文書化されていること
- 既知の逸脱が明確に文書化されていること
2. 関連RFC準拠
- RFC 5681: 輻輳制御
- RFC 7323: ウィンドウスケーリングとタイムスタンプ
- RFC 2018: SACK
- RFC 3168: ECN
- RFC 5961: ブラインド攻撃保護
デバッグツール
1. パケットキャプチャ
ツール:
- Wireshark: パケット検査
- tcpdump: コマンドライン キャプチャ
- tshark: プログラマティック分析
2. トラフィックシミュレーション
ツール:
- packetdrill: TCP動作スクリプト作成
- hping3: カスタムパケット生成
- netcat: 基本的な接続テスト
3. ネットワークエミュレーション
ツール:
- netem (Linux): 遅延、パケット損失、帯域幅制限
- dummynet (FreeBSD): ネットワーク条件シミュレーション
検証レポート
テストレポートに含めるべき内容:
-
実装詳細:
- TCPスタックバージョン
- サポートされているオプション
- 既知の制限
-
テスト結果:
- 成功/失敗したテストケース
- パフォーマンスメトリクス
- 相互運用性結果
-
準拠ステートメント:
- RFC 9293準拠レベル
- サポートされている拡張機能
- 逸脱または制限
-
既知の問題:
- 未解決のバグ
- パフォーマンスボトルネック
- 互換性の問題
注: TCP検証は継続的なプロセスです。定期的なテストと更新により、実装の堅牢性とセキュリティが保証されます。