見出し画像

効率性と信頼性は両立できるのか?TCPの伝送制御

「大量に送り付けたら、受け取ってくれる保証はないですよね?」

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

前回は、TCPコネクションについてお話しました。3ウェイハンドシェイクを行って、コネクションを確立させ、高い信頼性を確保するのでしたね。ヘッダのどのフラグが立つのかなども確認しましたね。

さて、今回は、TCPの伝送制御についてのお話です。データは一度にたくさん効率よく送りたいですね。しかし、ネットワークが混雑していたり、受信側のバッファーが足りなかったりすると正しくデータが送れません。

つまり、効率性と信頼性の両立させ、バランスをとることが重要になります。でも、どうやってそれを制御するのでしょうか?

3つに分けて見てみましょう!

ウィンドウ制御:データ転送の効率化

まずは、ウィンドウ制御です!

この仕組みは、確認応答を待たずにデータを一定量(ウィンドウサイズと呼ばれる)まとめて送信してしまおうというものです。

これは絵にしないとよくわからないんですよね…。では、絵にします!

ウィンドウ制御1

1と2のデータは送信済みかつ、ACK受信済みです。3~6のデータはACKは届いてないですが、送信してよいデータです。この範囲がウィンドウです。7~10はACKの受信が増えるまで送信してはいけないデータです。

ウィンドウ制御2

受信者からACKを受信しました!そうすると1~3ACK受信済みとなり、ウィンドウが一つ右にスライドします。結果4~7を送信してよくなります。このように、ACKの受信のたびにウィンドウをずらしていくことを、「スライディングウィンドウ」といいます。

この方式では、送信側は受信確認を待たずに一定量のデータを連続的に送ることができ、受信側も確認応答を返しながら次のデータを受け入れることが可能です。この連続的なデータのやり取りにより、通信の無駄が減り、全体のパフォーマンスが向上します。

輻輳制御:ネットワークの混雑回避

輻輳は、ようはネットワークが混雑している状態ですね。

ネットワーク上で多くのデータが一度に送信されると、「輻輳」と呼ばれる状態になり、データの遅延や損失が発生する可能性があります。

TCPでは、通信路の状態を監視して輻輳を検知して、ウィンドウサイズを動的に調整することでデータの流れを制御します。

例えば、ネットワーク上の混雑が検知された場合、TCPはウィンドウサイズを小さくし、データの送信量を減らすことで輻輳の解消を図ります。

しかし、送信開始するときはネットワークの状況はよく分かりません。ですから、ウィンドウサイズを小さくしてスタートし、徐々に大きくしていきます。

これを、そのまんまですが、「スロースタート」といいます。車もアクセルをいきなりべた踏みしないのと同じですね!

フロー制御:安定性の確保

スロースタートしたからと言って、安心できません。その後の制御がつづきます。

フロー制御の目的は、データの送受信を調整し、受信側のバッファが溢れることを防ぐことにあります。受信側が処理しきれない量のデータが送られてくると、バッファがオーバーフローし、データの損失を引き起こす可能性があります。受信側から自分の限界を伝える仕組みなんです。

フロー制御により、受信側は自身の処理能力に応じて、送信側にデータの流れを調整するよう指示できます。

例えば、受信側のバッファがいっぱいになると、ウィンドウサイズを「0」に設定して送信側に通知し、データ送信を一時的に停止させることができます。その後、バッファに空きができれば、ウィンドウサイズを増やしてデータの送信を再開させることができます。

はい、これらの制御メカニズムにより、TCPは、効率性と信頼性を上手にコントロールしてネットワークのパフォーマンスを最適化し、より快適に通信を実現するのでした~。


はい、本日は以上です。今回は、TCPの本領、伝送制御についてでした!

次回は、もう一つのプロトコルUDPに入りましょう!

いいなと思ったら応援しよう!