見出し画像

3回も握手してデータの経路を確保するのだ!スリーウェイハンドシェイク

「受信したら、『届いたよ』と返信してほしいのは、ヒトもコンピュータも同じですね…。」

はい、こんにちは!松井真也です。シリーズ「ネットワークからアプリへの橋渡し:トランスポート層の世界」第5回でございます!

前回は、TCPパケットフォーマットについてご紹介しました。TCPは、高い信頼性を実現するために、ヘッダにいろんな値を盛り込んで制御に利用しているのでしたね!

さて、今回は、TCPコネクションです。TCPは、いわゆる「コネクション型」のプロトコルで、コネクションを確立させることで高い信頼性を確保しています。しかし、コネクションを確立するといってもどうするんでしょうか?

早速見てみましょう!

TCPのコネクション確立方法

高い信頼性(ここでは、データが正確にエラーなく届く性質という趣旨です)が必要なデータ伝送では、データをやりとりする前に、まず相手との間で通信の確立して、通信の開始と終了を確認しあうことが必要です。

パケットを送ったら忘れる、受け取ったら忘れるでは、全データが正しく送受信できる保証がなく困るんです。

ここで登場するのが「スリーウェイハンドシェイク」というプロセスです!この名前が示す通り、三回のやりとりで通信路を確立します。

スリーウェイハンドシェイクとはこうやる

では、スリーウェイハンドシェイクとは、どのようなものでしょうか?

絵にしましょう!Aはクライアント、Bはサーバだと思ってください。

スリーウェイハンドシェイクのシーケンス図

ついでに、前回示したヘッダフォーマットも理解に役立つので再掲します。この表を参照しながら解説をお読みください。

TCPヘッダのフォーマット(Wikipediaからの引用転載)

1)SYN

まず最初に、通信を開始したいクライアントは、ランダムに選ばれたシーケンス番号を含むSYN(同期)パケットをサーバに送ります。この行動は、挨拶のようなもので、コミュニケーションの始まりを伝える信号です。

2)SYN+ACK

次に、サーバはこのSYNパケットを受け取り、クライアントに対してSYNとACK(確認応答)フラグが設定されたパケットを返信します。

このとき、サーバはクライアントのシーケンス番号に1を加えたものを確認応答番号(ACK番号)として利用します。これにより、サーバーからもコミュニケーションの意思があることがクライアントに伝えられます。

3)ACK

最後に、クライアントは、ACKパケットをサーバに送り返します。これで、両方向に通信の準備が整い、TCPコネクションが確立されるのです!このプロセスを通じて、データのやり取りを開始するための信頼性の高い通信路が築かれるわけですね。

え、もっと砕けた解説の方がいいですか?じゃあ、会話に例えましょう!

  1. ステップ1:最初に、おしゃべりを始めたいコンピュータ(Aさん)が、もう一方のコンピュータ(Bさん)に向かって、「こんにちは、話せる?」とメッセージを送ります。これを「SYN」と言います。

  2. ステップ2:次に、Bさんがそのメッセージを受け取ると、「こんにちは、大丈夫だよ」と返事をします。この返事には、「SYN」と「ACK」という2つのサインが含まれています。

  3. ステップ3:最後に、AさんがBさんからの返事を受け取ると、「よかった、じゃあ始めよう」という意味の「ACK」というメッセージを送り返します。

ちなみに、Synは、「Syncronize」(同期する)、Ackは「Acknowledge」(確認応答する)の略です。メールでも、「Please acknowledge the message!」と書いてあったら、「受け取ったら、その旨教えてね!」という意味です。

SYN+ACKは、英語では「スィナック」と、つなげて発音することが多いですよ。

データ転送:信頼性と効率のバランス

TCPコネクションが確立された後は、データの転送フェーズに移ります。

ここでは、信頼性と効率性のバランスを絶妙にとりながらデータ伝送をすることになります。

あ、この話は次回と次々回以降に回しましょう!

コネクション終了:フォーウェイハンドシェイク

なんやかんやデータの送受信が完了した後は、TCPコネクションを適切に終了させる必要があります。

こちらは「フォーウェイハンドシェイク」というプロセスで行われます。ひとつ増えましたね…。

まず、通信を終了したい一方の端末がFIN(終了)パケットを送ります。これを受け取った相手はACKパケットで応答し、その後に自身もFINパケットを送信します。最終的に、最初の端末が再びACKで応答することで、両端間の通信は正式に終了します。

このプロセスを通じて、双方の端末はデータの送受信が完了し、これ以上通信するデータがないことを確認します。

こうして、TCPコネクションは整然として終了し、リソースを解放することができるのです。

もし通信中に問題が発生し、正常に終了できない場合は、TCPはリセットを行い、コネクションを強制的に終了させることがあります。これにより、予期せぬエラーや問題からシステムを守り、通信の安定性を保つことが可能になるのです。

はい、本日はここまで!今回は、TCPコネクションについてお話ししました!

次回は、ウィンドウサイズの話をしましょう!では!

この記事が気に入ったらサポートをしてみませんか?