#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]]