TCPはコネクション型の通信であり、相手が通信不可能な場合はそもそも通信を開始できないので、無駄なパケットを送ら図に済む。

コネクションを確立するときは、TCPヘッダだけからなるセグメントを次のように送り合い、通信可能であることを確認する。

  1. ホストAからホストBへSYN(コネクション確立要求)を送る
  2. ホストBはSYNを受け取ったら、ホストAへACK(SYNに対する確認応答)とSYN(コネクション確認要求)を送り返す
  3. ホストAはACKとSYNを受け取ったら、ホストBへACK(SYNに対する確認応答)を送る

上記の行程は3ステップで行われることから、3ウェイハンドシェイクと呼ばれる。

このやりとりは、次のようなイメージである。 begin: ol A「もしもし、聞こえますか?」 B「もしもし、こちらこそ聞こえますか?」 A「聞こえました。話しましょう」 end: ol お互いがちゃんと聞こえていることを確認するには、このように3ステップを踏む必要があるのだ。

TCP通信において、正しいシーケンス番号のセグメントが来たかどうかや、途中で抜けがないかどうかを受信側で判断できるようにするためには、双方のTCPモジュールでシーケンス番号の初期値(iss)と確認応答番号の初期値(irs)を一致させておく必要がある。 この事前準備が必要であることから、TCPはコネクション型の通信方式を採用している。

シーケンス番号の初期値を一律にしておけば、お互いに初期値を伝え合う事前作業(3ウェイハンドシェイク)は必要ないのではないだろうか?…とも思えるが、一律にしてしまうと、どのペア間(コネクション)でやりとりしているデータなのかを判別することができないため、TCPではコネクションを確立する度にシーケンス番号の初期値をずらし、その数値を3ウェイハンドシェイクでお互いに共有してから通信を行うようにしている。

このように、離れたホスト同士で記憶する情報を一致させる作業を同期という。 TCPにおける接続の確立要求セグメントSYNは、同期(synchronize)がその名の由来である。

また、コネクションを切断する時には、次のような4段階のやりとりを行う。 begin: ol ホストAからホストBへFIN(コネクション切断要求)を送る ホストBはFINを受け取ったら、ホストAへACK(FINに対する確認応答)を送り返す 続けて、ホストBはホストAへFIN(コネクション切断要求)を送る ホストAはFINとACKを受け取ったら、ホストBへACK(FINに対する確認応答)を送り返す end: ol これは、次のようなイメージである。 begin: ol A「私からは以上です。あなたはどうですか?」 B「わかりました。少し考えます。」 B「…私からも話すことはありません。」 A「わかりました。では終わりにしましょう。」 end: ol