当記事は、前回からの内容に引き続き、TCPとUDPの性質についてご紹介します。
TCPのコネクション管理
◆再送制御
データの送信側は、データを送信する際にタイマーを起動し、この時間を経過しても確認応答が到着しない場合は、送信データが喪失したと判断して再送を行います。
受信側では、次に受信すべきシーケンス番号以外のデータを受け取った場合は、受信したデータの保存はしますが、そのデータに対する確認応答は送信しません。
下図の例では、PC-B側で1番目のデータを正しく受信できているので、それに対する確認応答(ACK=101)が送信されています。
しかし、次に受信したデータのシーケンス番号が異なるため、正しい順番で受信できているデータに対する確認応答(ACK=101)を送信しています。
また、3番目のデータはバッファ内に保存しておきます。
一方、送信側のPC-Aでは、データの送信時に起動したタイマーの時間内に確認応答を受信できないと、タイムアウトによるデータの再送処理を行います。
再送されたデータを受信したPC-B側では、これまで受信しているデータの最後のシーケンス番号に対する確認応答を送信します。
なお、同じ番号の確認応答を3回連続して受信した場合は、再送タイマーのタイムアウトを待たずに対象のデータを再送する、高速再転送が行われるようになっています。
また、複数データの受信中に途中のパケットが喪失していた場合、受信側が送信側に喪失パケットのみを通知することで、送信側がその内容を見て、抜けている部分だけを送り直す「SACK」という方法もあります。
SACKを使用する際は、TCPコネクションの確立時にあらかじめ双方向で使用するかを確認しておきます。
◆フロー制御
送受信間で安定したデータのやり取りができるように、データの流れを制御する仕組みを「フロー制御」といいます。
TCPでは、受信側がバッファの空き状況に応じて、受信可能なデータサイズをウィンドウサイズとして送信側に通知することで、送信側は適切なデータ量を送信できます。
送信側は、ウィンドウサイズが「0」の場合でも、受信側のウィンドウサイズの最新情報を得るために、再送タイムアウトと同じ間隔で1オクテットのデータを送信しています。 これを「プローブセグメント」といい、これに対する確認応答がある間は、コネクションが維持されます。
UDP (User Datagram Protocol)
トランスポート層ではTCPの他にUDPというプロトコルが定義されています。 TCPは信頼性を確保するという特徴を持ちますが、UDPは信頼性を一切確保せずに、スピード重視のコネクションレス型プロトコルとして動作します。
したがって、UDPは信頼性よりも、IP電話や動画配信などのリアルタイム性が重視される通信に向いています。
また、UDPではTCPのような3ウェイハンドシェイクや確認応答、シーケンス番号の管理などは一切行いません。
UDPの信頼性については、UDP通信を使用するアプリケーション側でタイマーを使い、もし一定時間内に相手からの応答が返ってこなければパケットが欠落したと判断し、同じデータを再送信するといった仕組みを実装します。
いかがでしたでしょうか。
ぜひお勉強の際にお役立て下さい。