わかりやすく TCP とは
送った手紙のうち一枚が途中でなくなったり、後ろのページが先に届いたりしたらどうなるでしょうか。インターネットのパケットも同じで、途中で消えることもあれば、順番が入れ替わることもあります。それでも文章が無事に届くのは、TCPのおかげです。
抜けなく、正確に
前に見たように、データはパケットという小さなかけらになって、いくつもの道を別々に渡っていきます。けれども、その道は完ぺきではありません。かけらが一つ途中で消えることもあれば、後ろのかけらが先に着くこともあります。
それでも受け手には、一つも抜けずに順番どおりに届かなければなりません。その仕事を受け持つ約束がTCPです。
二枚のカードを押して、TCPが守る二つの約束をオンにします。一つも抜けないこと、そして送った順番どおりに届けることです。
目標ははっきりしました。抜けなく、順番どおりに。口で言うのは簡単ですが、道が完ぺきではないので守るのは簡単ではありません。
TCPはこれを三つの習慣でやってのけます。受け取ったと知らせること、来なければもう一度送ること、番号を見て順番をそろえることです。
ちなみにTCPは、データを送る前に相手と短いあいさつを三回やり取りして、まず接続を結びます。
受け取ったと知らせる
一つ目の習慣は確認です。受け手はかけらが届くたびに「受け取りました」と短く返事をし、この返事を確認応答、つまりACKと呼びます。
宅配便を受け取って受領確認を押すのと同じです。送り手はACKが返ってきてはじめて、そのかけらが無事に届いたことを知ります。ACKがなければ、まだわからないのです。
届いたパケットを一つずつ押すと、受け手が確認応答(ACK)を返します。四つすべてに確認が返れば、送り手は全部届いたことがわかります。
かけらごとにACKが行き来するので、送り手は何が届いたかがわかるようになりました。やり取りが一つ増えるので、少し遅く見えるかもしれません。
けれども、このひと言のおかげで、抜けたかけらをぴたりと見つけられます。では、ACKが来なかったかけらはどうすればよいのでしょうか。答えは簡単です。もう一度送るのです。
来なければもう一度送る
二つ目の習慣は再送です。送り手は決めておいた時間だけ待ってもあるかけらのACKが来なければ、そのかけらは途中で消えたとみなして、同じものをもう一度送ります。
受け手はもう一度来たかけらを受け取り、今度はACKを返します。こうして抜けたかけらを埋めていくので、最後には一つも抜けなくなります。
確認応答(ACK)が返ってこなかった二つの空きを押して、そのかけらを送り直します。送り直したかけらが届くと、空きが埋まります。
再送のおかげで、抜けたかけらはもうありません。受け手の手元に、すべてのかけらがそろいました。
ところが、まだ一つ残っています。かけらは別々に道を渡ってきたので、着いた順番がばらばらなのです。2番より5番が先に来ていることもあります。この順番は、どうやって正すのでしょうか。
番号を見て順番をそろえる
三つ目の習慣は、順番そろえです。TCPはかけらごとに1番、2番、3番と番号を付けて送ります。
着く順番が入れ替わってもかまいません。受け手が番号を見て、小さい番号から順に並べるからです。5番が先に来ても2番の場所を空けて待ち、番号順にすべて埋まれば、元の文章がそのままよみがえります。
実際のTCPは、かけらごとではなく、データの何バイト目かで番号を付けますが、考え方は同じです。
ばらばらに着いたかけらを番号の順(1、2、3、4)に押すと、列がそろいます。順番を間違えると次の番号を押すように教えてくれ、全部そろえば元の文章がよみがえります。
番号どおりに並べると、ばらばらだったかけらが元の文章にぴったり収まりました。抜けたものはもう一度受け取って埋め、順番は番号で正しました。
受け取る人の目には、パケットが抜けたことも入れ替わったこともないように見えます。その手間をすべて、TCPが裏で静かに引き受けていたのです。
まとめ
一言でまとめると、パケットは抜けたり順番が入れ替わったりすることがあります。TCPは届けば確認応答(ACK)を返し、来なければもう一度送り(再送)、番号で順番をそろえます。
だから受け手には、いつも抜けなく、順番どおりに届きます。速さより確かさ、それがTCPの約束です。
ボタンを押すたびに、要点が一つずつ現れます。(抜け/入れ替わり → 届けばACK → 来なければ再送 → 番号で順番をそろえる)四つすべてが出そろえば、まとめは完了です。
TCPは安全のために、確認し、送り直し、並べ直します。そのぶん、少し多く待つことになります。
けれども、その待ち時間がもったいない場面もあります。音声通話やゲームのように、少し抜けても速いほうがよい仕事です。次のレッスンでは、確認を省いて速く送るやり方を扱います。