TCP
TCPの概要
- トランスポート層のコネクション型プロトコル。
- 3ウェイハンドシェイクでTCPコネクションを確立する。
- 応答を確認しあいながら送受信する。
- 再送制御や順序制御がある。
- 信頼性は高く、即時性は遅い。(UDPと比べて)
- HTTP、SMTP、POP3、SSH、FTP、DNS(ゾーン転送)
TCPのパケットフォーマット
0bit | 8bit | 16bit | 24bit | |
0バイト | 送信元ポート番号 | 宛先ポート番号 | ||
4バイト | シーケンス番号 | |||
8バイト | 確認応答番号 | |||
12バイト | データオフセット(4) 予約領域(6) コントロールビット(6) |
ウインドウサイズ | ||
16バイト | チェックサム | 緊急ポインタ | ||
可変 | オプション+パディング | |||
可変 | TCPペイロード |
※送信元ポート番号~オプション+パディングまでがTCPヘッダ。ヘッダ長は20~60バイト。
TCPの各フィールド
送信元ポート番号
- 2バイトの値。
- OSがランダムに割り当てる。
宛先ポート番号
- 2バイトの値。
- アプリケーションごとに定義された値をセットする。
シーケンス番号
- 4バイトの値。
- 3ウェイハンドシェイク時にランダムな値がセットされる。(初期シーケンス番号)
- TCPセグメントを送信するたびに送信したバイト数が加算される。
- 値が232を超えたら0に戻る。
確認応答番号
- 4バイトの値。
- 受信側が「次はここからのデータをください」と送信側に伝えるためのフィールド。
- コントロールビットのACKフラグがONになってる場合のみ有効になるフィールド。
- 受け取ったTCPセグメントの「シーケンス番号+TCPペイロードの長さ」がセットされる。
データオフセット
- 4バイトの値。
- どこまでがTCPヘッダであるかを知ることができる。
- TCPヘッダの長さを4バイト単位で換算した値がセットされる。最小値は5。
コントロールビット
- 1バイトの値。
- ビットごとに役割が設定されている。
フラグ名 | 概要 |
---|---|
CWR | Congestion Window Reduced。ECN-Echoにおいて、輻輳ウインドウを減少させたことを通知する。 |
ECE | ECN-Echo。輻輳が発生していることを相手に通知する。 |
URG | Urgent Pointer field significant。緊急を表す。 |
ACK | 確認応答を表す。 |
PSH | バッファに蓄積せず、速やかにアプリケーションにデータを渡す。即時性が求められる状況で使用する。 |
RST | コネクションを強制切断する。 |
SYN | コネクションを確立する。 |
FIN | コネクションを終了する。 |
ウインドウサイズ
- 2バイトの値。
- ウインドウサイズとは確認応答を待たずに受け取れるデータサイズ。それを通知するフィールド。
- 送信側が0を受け取ると、いったん送信をやめる。(0はもう受け取れないという意味のため)
チェックサム
- 2バイトの値。
- TCPセグメントが壊れていないかの整合性チェックに使用する。
- 計算対象のデータはTCP擬似ヘッダ、TCPヘッダ、TCPペイロード。
- TCP擬似ヘッダとは、チェックサム計算時だけに使われる仮想的なヘッダ。送信元/宛先IPアドレスなどが含まれる。
- 検証には「1の補数演算(ビット反転)」が使用されている。
緊急ポインタ
- 2バイトの値。
- URGフラグがONになっている場合のみ有効。
- 緊急データの場所を示す。正確には、「シーケンス番号+緊急処理を要するデータ長」がセットされる。
- 例えば、シーケンス番号が100で、緊急処理を要するデータが450バイトだった場合、550 がセットされる。
- 緊急ポインタの扱いはアプリケーションが決める。主に通信や処理の中断に使われる。Webブラウザで中止ボタンが押された場合、TELNETでCTRL+Cを入力した場合など。
- 緊急ポインタをストリームデータの切れ目を表す目印として利用することもある。
オプション
- 4バイト単位で可変するフィールド。
- オプションはオプション番号(Kind)で定義される。
- オプションを並べた「オプションリスト」として構成される。
代表的なオプション
Kind | オプション名 | 概要 |
---|---|---|
0 | End Of Option List | オプションリストの最後を表す。実装されないことも多い。 |
1 | NOP | 何もしない。オプションの区切り文字として使用する。 |
2 | MSS | TCPペイロードの最大サイズを通知する。MTUが1500なら1460がセットされる。 フレッツ回線では網内でL2TP接続が行われるため、MTUが1454に制限されている。その場合、MSSは1414となる。 一般的なルータでは、3ウェイハンドシェイク時にMSS値を変更する機能がある。 |
3 | Window Scale | ウインドウサイズの最大値を拡張できる。0~15で設定でき、ウインドウサイズの最大値を2n倍できる。 |
4 | SACK Permitted | 選択的確認応答に対応する。 |
5 | SACK | 選択的確認応答に対応している場合に有効。すでに受信しているシーケンス番号を通知する。このオプションにより再送時に、既に受信したデータを除外して送信できる。 |
8 | Timestamps | パケットの往復時間(RTT)の計測に使用する。 |
30 | MPTCP(Multipath TCP) | Multipath TCP(複数の経路を使ったTCP通信)に対応する。 |
34 | TCP Fast Open | TCP Fast Openに対応する。Cookie情報を用いて、過去に接続したことのある端末との3ウェイハンドシェイクを簡略化する。 |