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ウェイハンドシェイクを簡略化する。

午前問題の出題

午後問題の出題