背景
こんにちは、エンジニアのgccjです。
4月になると何か新しいことをしたくなりますよね。
僕は定期的に記事を書くことにチャレンジしてみたいと決めました。
一方、毎週ネタを考えるのが難しいので「エンジニア面接で答えられますか?」シリーズなら考えなくても良いし、
他の方にも役立つと信じで、記念すべき第一回「TCPはなぜ3ウェイ・ハンドシェイクする必要がある?」を書きました!
お役に立つと思ったらぜひシェアよろしくお願いします。
それでは「TCPはなぜ3ウェイ・ハンドシェイクする必要がある?」を回答してみます!
ジュニアの回答例
- TCPは双方向通信のプロトコルです
- 双方向通信だから、送信側と受信側との間に接続(connection)しないといけない
- 送信側と受信側の接続とその確認のため3ウェイ・ハンドシェイクする必要がある
シニアの回答例
1. TCPは信頼性が高く、バイトストリーム指向、コネクション指向のプロトコルです
信頼性が高いとは:ネット状況が悪い状態においても、データを確実に送受信するのを保証すること。
バイトストリーム指向とは:バイトベースで、パケットと呼ばれる小さなチャンクに分割して送信。そして、ストリームというのは厳密な順序を保つことを意味する。
コネクション指向とは:データ転送する前に、コネクションを確立しないと行けないこと。
2. コネクション指向だから、コネクションを確立するために3ウェイ・ハンドシェイク
詳細:
SYN: クライアントがサーバーに対して接続要求(SYNパケット)を送信します。この段階でクライアントは自分の初期シーケンス番号をサーバーに伝えます。
SYN-ACK: サーバーは接続要求を受け取り、クライアントに対して接続受け入れの返信(SYN-ACKパケット)を送信します。このパケットには、サーバーの初期シーケンス番号と、クライアントのシーケンス番号への確認応答が含まれます。
ACK: クライアントはサーバーからのSYN-ACKパケットを受け取り、最後の確認応答(ACKパケット)をサーバーに送信します。これで、双方向の通信の準備が整い、データの転送が開始できます。
なぜ2ウェイや4ウェイでもない?
信頼性のためにシーケンス番号の維持が必要
シーケンス番号を利用して、パケットを標記することで、送った、受け取ったパケットを判別する。3ウェイ・ハンドシェイクはお互いのシーケンス番号の初期値を送受信両方を知らせと確認するため必要なプロセスです。
不安定なネット環境でも安定なデータ転送を実現するために信頼性のあるコネクションの実現が必要
3ウェイ・ハンドシェイクはこの信頼性のあるコネクションを実現するのに最小値です。
もちろん4,5回もできるのですが、リソースの無駄になるため必要性がないです。
無効の接続や遅延による混乱を防ぐため必要
ネットワークの品質が低下している状況下では、送信側が初期接続要求(ハンドシェイクリクエスト)を複数回送信する可能性があります。
この状況で、もし通信プロトコルが2ウェイ・ハンドシェイクだけを採用している場合、受信側は単に接続要求に対して承認(Yes)または拒否(No)の応答を返すだけになります。
このシンプルな応答メカニズムでは、受信側は送られてきたハンドシェイクリクエストが実際に新しい通信セッションを開始するためのものなのか、それともネットワークの遅延によって送信された無効な(重複な)ものなのかを区別することができません。
最後
以上、ジュニアエンジニアとシニアエンジニアそれぞれの回答を答えてみました。
もし記事の回答よりもっと面白い回答があればぜひコメントで共有いただきたいです!