IPは、データを確実に送る仕組みを備えていない。TCP/IPでは、トランスポート層のプロトコルであるTCPがその役割を担う。TCPは通信の信頼性と効率性を高めるために、「3ウエイハンドシェーク」「データの再送」「ウインドウ制御」「スロースタートアルゴリズム」という大きく4つの仕組みを備える。
3ウエイハンドシェークは、相手の同意を得てから仮想的な通信路(コネクション)を確立する仕組みだ(図5-1)。
3ウエイハンドシェークでは、まず送信側がTCPヘッダーの「コントロールビット」と呼ばれる領域にあるSYN▼というフラグ(SYNフラグ)を「1」にしたTCPセグメント(SYNセグメント)を送る。SYNセグメントを受け取った受信側は、正しく受け取ったことを伝えるため、コントロールビットのACK▼というフラグ(ACKフラグ)とSYNフラグを「1」にしたセグメント(ACK+SYNセグメント)を返す。
これを受け取った送信側は、ACKフラグを「1」にしたセグメント(ACKセグメント)を送る。こうしてコネクションを確立してからデータのやりとりを始める。
送受信の順番を番号で管理
データの再送は、データが受信側に届かなかったときに機能する仕組みだ。TCPでは、受信側が1個のTCPセグメントを受け取るたびに確認応答を返す。確認応答が一定時間内にないと、送信側はデータを送ることができなかったと判断してそのセグメントを再送する。
TCP/IPでは、アプリケーションのデータを分割して送る。これは、再送を効率化するためでもある。大容量のデータを1度に送ると、受信側に届かなかった場合にデータ全体を再送しなければならない。複数のTCPセグメントに分割して送ることで、無駄なく再送できる。
TCPでは分割したセグメントに「シーケンス番号」という情報を付与して送る。また、受信側が確認応答を返すときに「確認応答番号」という情報を送る。複数のTCPセグメントに分割して送ると、送信した順番通りに届かないことがある。確認応答も同様だ。そこで、どのセグメントが届いたのかをシーケンス番号と確認応答番号で管理する(図5-2)。