TCP
2023-02-26 (日) 10:20:54
TCP とは †
名称 †
- Transmission Control Protocol
概要 †
TCP の機能 †
- 再送処理
- 再送タイムアウト(RTO)
- 高速再転送
- フロー制御
- 輻輳制御
TCPの仕組み †
TCPコネクション †
- 通信の開始時に通信路を確立し、終了時に通信路を解放する
- TCPコネクションは下記の4つの情報によって識別される
- 宛先IPアドレス
- 宛先ポート番号(TCP)
- 送信元IPアドレス
- 送信元ポート番号(TCP)
- 3つのフェーズで行われる
- コネクション確立フェーズ
- 通信フェーズ
- コネクション切断フェーズ
(1) コネクション確立フェーズ †
- 3wayハンドシェイク
- 1. →(SYN)
- 2. ←(ACK + SYN)
- 3. →(ACK)
- ※SYN:コネクション確立要求
- ※ACK:肯定応答
(2) 通信フェーズ †
(3) コネクション切断フェーズ †
- 1. →(FIN + ACK)
- 2. ←(ACK)
- 3. ←(FIN + ACK)
- 4. →(ACK)
TCP のデータ構造 †
- TCPヘッダとペイロードで構成される
- TCPヘッダ(20バイト~)
- ペイロード(アプリケーション層のデータ)
TCPヘッダ †
- 33〜64bit
- シーケンス番号(32)
- 65〜96bit
- 確認応答番号(ACK番号)(32)
- 97〜128bit
- データオフセット(4) ※TCPヘッダ長:単位は4Byte(32bit)
- 予約(6) ※未使用(末尾3桁をコントロールフラグとして使う)
- コントロールフラグ(6)
- ウィンドウサイズ(16)
- 129〜160bit(20Byte)
- チェックサム(16) ※TCPセグメント(TCPヘッダ + ペイロード)の誤り検出に使われる
- 緊急ポインタ(16)
- 161〜192bit
- オプション(n)
- パディング(32-n)
シーケンス番号 †
- 送信データの連番
- 初期値はランダムな値
確認応答番号(ACK番号) †
- 受信データの連番
- 3ウェイハンドシェイク前
- 相手から受け取ったシーケンス番号に1を加算した値
- 3ウェイハンドシェイク後
- 相手から受け取ったシーケンス番号にデータサイズ(Byte)を加算した値
コントロールフラグ †
- コードビット
- コントロールビット
- 予約(末尾3桁)
ビット位置 コードビット 意味 1 NS ECN-nonce RFC3540 2 CWR congestion window reduced 輻輳ウィンドウ減少の通知。RFC3168 3 ECE EDN-echo 輻輳発生の通知。RFC3168
- コントロールフラグ(6桁) ※RFC793
ビット位置 コードビット 意味 1 URG urgent 緊急 2 ACK acknowledgement 応答。SYNパケットの場合"0"、SYNパケット以外の場合"1" 3 PSH push プッシュ 4 RST reset リセット。TCP接続を強制終了する場合"1" 5 SYN synchronize 同期。SYNパケットの場合"1"、SYNパケット以外の場合"0" 6 FIN finish 終了。TCP接続を終了する場合"1"
SYNクッキー †
- TCP通信の正当性を確認するために、SYN/ACKパケットのシーケンス番号に埋め込むデータのこと
- TCPヘッダをハッシュ化した値などが使われる
- SYN/ACKパケットを応答する際はTCPソケットはオープンしない
- SYNフラッド攻撃の対策として有効
TCPの脆弱性 †
- 発信元IPアドレスの偽装が難しい
- 発信元IPアドレスが偽装されていても、コネクションの確立が必要ない攻撃に対しては弱い
- 接続要求(SYN)に対する応答(SYN/ACK)を攻撃に悪用される
- 反射・増幅型DDoS攻撃
- 初期シーケンス番号を推測したセッション・ハイジャック
- TCP ACKスキャン
- 「ポートスキャン」参照