はじめに
ネットワークについて学びたいと思い、いろいろと調べてみたところ、本書『マスタリングTCP/IP 入門編』がよくおすすめされていたため、手に取ってみました。
本記事では、特にTCPに関する部分について、自分が気になった点や重要だと感じたポイントを、自分なりに整理してまとめていきます。
TCP (Transmission Control Protocol)
TCP/IPには、TCPとUDPという2つの代表的なトランスポートプロトコルが使われています。
TCPは、接続の確立や確認応答などを通じて信頼性の高い通信を提供するプロトコルである一方、UDPは、接続の確立を行わずにデータを送受信する軽量なプロトコルです。
本記事では、TCPの信頼性を支える仕組み、通信性能を向上させるための制御機構、ネットワークの利用効率を高める仕組みについて整理していきます。
信頼性を実現する仕組み
シーケンス番号と確認応答(ACK)
TCPでは、シーケンス番号と**ACK(確認応答)**を用いて、送信データが正しく届いたかどうかを確認しながら通信を行います。
シーケンス番号とは、送信されるデータ部分の先頭バイトを示す番号です。これにより、受信側はパケットの順序を正しく並べ替え、欠落したデータを検知できます。
ACK(Acknowledgement)とは、受信側がデータを正しく受け取ったことを送信側に知らせる応答であり、次に期待するシーケンス番号を送信側に通知します。
具体的な流れは以下の通りです。
- 送信側が「シーケンス番号1、データ長200」のデータを送信
- 受信側は、1〜200バイト分のデータを受信し、「次に期待するシーケンス番号=201」としてACKを返す
- 送信側はACKを受け取り、次に「シーケンス番号201、データ長300」のデータを送信
- 受信側は、201〜500バイト分のデータを受信し、「次に期待するシーケンス番号=501」としてACKを返す
このように、どこまでデータを受信したかを明示的にやり取りすることで、信頼性の高い通信を実現しています。
また、データやACKがネットワークの途中で失われた場合には、後述する再送制御によって、失われた情報の補完が行われます。
再送制御
TCPでは、データやACKが途中で失われた場合に備えて、再送の仕組みが用意されています。主なパターンは次の2つです。
ケース1:送信データが消失した場合
- 送信側がパケットを送信
- パケットがネットワーク上で消失
- 受信側は何も受信しないため、ACKを返さない
- 送信側はACKを待つが来ないため、一定時間後に再送
- 受信側が再送されたパケットを受信し、ACKを返す
ケース2:ACKが消失した場合
- 送信側がパケットを送信
- 受信側がACKを返す
- ACKがネットワーク上で消失
- 送信側はACKを待つが来ないため、一定時間後に再送
- 受信側はすでに受信済みのデータを再度受け取るが、シーケンス番号に基づいて重複と認識して無視し、ACKを返す
このように、ACKが返ってこなければ何らかの問題が発生したと判断し、送信をやり直すことで、確実な通信を可能にしています。
性能を向上させる制御機構
ウィンドウ制御
パケットを1つ送るごとにACKを待っていたのでは、通信効率が非常に悪くなります。
そこでTCPでは、一定範囲内で複数のパケットを連続して送信するウィンドウ制御が行われます。これにより、ACKを待たずに複数のデータを送ることが可能となり、パフォーマンスが大きく向上します。
ACKによって受信状況は正しく把握されるため、信頼性も保たれます。
フロー制御
受信側が処理できる以上の量のデータを送信されてしまうと、バッファが溢れ、再送が必要になり、逆に効率が落ちてしまいます。そこで、受信側が自分の受信可能なバッファサイズを送信側に通知することで、過剰な送信を抑制します。これがフロー制御です。
輻輳制御
ネットワークがすでに混雑している場合に、さらに大量のデータを送信すると、輻輳が悪化し、全体の通信効率が低下します。
TCPでは、初めは少量のデータを送り、問題がなければ徐々に送信量を増やすという仕組みで輻輳を回避します。これが輻輳制御です。
ネットワークの利用効率を高める仕組み
Nagleアルゴリズム
送信すべきデータがあったとしても、そのデータ量が少ない場合にすぐ送信してしまうと、送信回数が増えてしまいます。
そのため、送信を遅らせることになり、ある程度の遅延時間が発生してしまいますが、最大セグメント長(MSS)に達したデータをまとめて送信することで、ネットワークの利用効率を向上させることができます。
遅延確認応答
データを受信した瞬間にACKを送信すると、ACKが何度も送られてしまい、ネットワークの利用効率が低下してしまいます。
ACKは「どこまでのデータを受信したか」を伝えるだけなので、複数のデータを受信した場合には、最新の「どこまでのデータを受信したか」の情報があれば十分です。
そのため、データを受信してもすぐにACKを送信せず、少し遅らせることで、ACKの送信回数を減らし、ネットワークの利用効率を向上させます。
ピギーバック
ピギーバックとは、簡単に言えば、データの送信を相乗りさせる仕組みです。
送信したいデータと、返信としてのACKやその他のデータを1つのパケットにまとめて送信することで、ネットワークの利用効率を高めることができます。
感想
- ネットワークの体系的な知識だけでなく、さまざまなプロトコルについても幅広く紹介されていたため、理解が深まりました
- TCPに関しては、信頼性や効率を支える様々な工夫を知ることができました