TCP の変更点


#author("2022-09-04T15:49:43+09:00","default:k1rou","k1rou")
#author("2023-02-26T10:20:54+09:00","default:k1rou","k1rou")
*TCP とは [#z837be3c]
**名称 [#f0cc4e87]
-Transmission Control Protocol

**概要 [#fe9200f3]
-トランスポート層([[OSI参照モデル]]、[[TCP/IPモデル]])の通信プロトコル
-コネクション型
--通信の[[信頼性]]が高い
--送信元[[IPアドレス]]の偽装が難しい(可能ではある)
-[[セグメント]]
--TCPでやりとりするデータの単位([[PDU]])

*TCP の機能 [#n91306de]
-再送処理
--再送タイムアウト([[RTO]])
--高速再転送

-フロー制御

-輻輳制御

*TCPの仕組み [#t30689b8]
**TCPコネクション [#ldc46dbb]
-通信の開始時に通信路を確立し、終了時に通信路を解放する
-TCPコネクションは下記の4つの情報によって識別される
--宛先IPアドレス
--宛先ポート番号(TCP)
--送信元IPアドレス
--送信元ポート番号(TCP)
-3つのフェーズで行われる
++コネクション確立フェーズ
++通信フェーズ
++コネクション切断フェーズ

***(1) コネクション確立フェーズ [#a38000d7]
-[[3wayハンドシェイク]]
--1. →(SYN)
--2. ←(ACK + SYN)
--3. →(ACK)
-※SYN:コネクション確立要求
-※ACK:肯定応答

***(2) 通信フェーズ [#a776f646]

***(3) コネクション切断フェーズ [#j7f991bf]
--1. →(FIN + ACK)
--2. ←(ACK)
--3. ←(FIN + ACK)
--4. →(ACK)

*TCP のデータ構造 [#qd8f92b0]
-TCPヘッダとペイロードで構成される
--TCPヘッダ(20バイト~)
--ペイロード(アプリケーション層のデータ)

**TCPヘッダ [#o850903a]
-1〜32bit
--送信元[[ポート番号]](16)
--宛先[[ポート番号]](16)

-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)

***シーケンス番号 [#xf7c56db]
-送信データの連番
-初期値はランダムな値

***確認応答番号(ACK番号) [#i3d9bfcf]
-受信データの連番
-3ウェイハンドシェイク前
--相手から受け取ったシーケンス番号に1を加算した値
-3ウェイハンドシェイク後
--相手から受け取ったシーケンス番号にデータサイズ(Byte)を加算した値

***コントロールフラグ [#qcb22efb]
-コードビット
-コントロールビット

-予約(末尾3桁)
| ビット位置 | コードビット |  | 意味 |h
| 1 | NS | ECN-nonce | RFC3540 |
| 2 | CWR | congestion window reduced | 輻輳ウィンドウ減少の通知。RFC3168 |
| 3 | ECE | EDN-echo | 輻輳発生の通知。RFC3168 |

-コントロールフラグ(6桁) ※RFC793
| ビット位置 | コードビット |  | 意味 |h
| 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クッキー [#w9a3179d]
-TCP通信の正当性を確認するために、SYN + ACKパケットのシーケンス番号に埋め込むデータのこと
-TCP通信の正当性を確認するために、SYN/ACKパケットのシーケンス番号に埋め込むデータのこと
-TCPヘッダをハッシュ化した値などが使われる
-SYN/ACKパケットを応答する際はTCPソケットはオープンしない
-[[SYNフラッド攻撃]]の対策として有効

*TCPの脆弱性 [#vcb4764a]
-発信元IPアドレスの偽装が難しい

-発信元IPアドレスが偽装されていても、コネクションの確立が必要ない攻撃に対しては弱い
--[[SYNフラッド攻撃]]

-接続要求(SYN)に対する応答(SYN/ACK)を攻撃に悪用される
--反射・増幅型[[DDoS攻撃]]

-初期シーケンス番号を推測した[[セッション・ハイジャック]]

-TCP ACKスキャン
--「[[ポートスキャン]]」参照

*関連用語 [#qd1439c9]
-[[Keep-Alive]]
-[[TCP/IP]]
-[[TFO]](TCPファストオープン)
-[[SPDY]]
-[[DCTCP]](データセンターTCP)
-[[セグメント]]
-ハーフオープン
-[[UDP]]