# UDPについて ## UDPの概要 UDPは"User Datagram Protocol"の略で、トランスポート層のプロトコルの一つです。UDPは、TCPと比較して以下のような特徴を持っています。 - **コネクションレス**: UDPは、接続を確立せずにデータを送信します。これにより、オーバーヘッドが削減され、迅速な通信が可能です。 - **信頼性の低さ**: データの順序や到達確認は行われず、パケットの損失や重複が発生する可能性があります。UDPは、信頼性よりも速度を重視したプロトコルです。 - **データグラム**: UDPは、データを「データグラム」として扱います。各データグラムは独立しており、順序が保証されません。 データグラムとはある意味『データのかたまり』ぐらいで考えておけばかまいません。 かたまりですので、分割は(この層では)発生しません。 もし分割が必要というのであれば、その対応は『プロトコルの開発者』が行うべきものとして扱われます。 実際はIP層においてパケットの分割が発生する可能性がありますが、UDPの層では意識することがありませんし、同時に「正確に元に戻るのか」の保証もありません(この辺りはTCPでは多少ですが対応が入ります)。 UDPは、アプリケーション開発者に自由を与えます。必要な機能は自分で実装する必要があります。その一方で、信頼性の低さを受け入れることが求められます。 UDPは、リアルタイム性が求められるアプリケーションで使われます。例えば、オンラインゲームや音声通話、ビデオストリーミングなどで利用されます。 また、データの順序や完全性は保証されません。多少のパケット損失を許容する必要があります。 ## UDPのヘッダー構造 UDPのヘッダーは『IPの層をそのまま引き上げたようなもの』と言われることがあります。 どのような構造かというと、こうなっています。 ```{figure} /transport/images/udp.png UDPのヘッダー構造[^udp-header] ``` - 送信元のポート番号(16ビット、2オクテット)。 - 宛先のポート番号(16ビット、2オクテット) - 長さ(16ビット、2オクテット) - チェックサム(16ビット、2オクテット) ヘッダ部分は64ビット(8オクテット)の長さを持ちます。それ以降はペイロードとして上位層のデータを包み込む形です。 通信制御用のフラグなどはほぼありません。 信頼性部分についても、チェックサムがある程度です。 [^udp-header]: 引用元: Wikipedia [User Datagram Protocol](https://ja.wikipedia.org/wiki/User_Datagram_Protocol) ## UDPは『投げる』もの UDPでの通信の際、相手(主にサーバー)が存在するかについては実は気にしません。 つまり事前の接続とかはUDPの規程には含まれておらず、単にデータを送信するだけです。 Cライブラリのレベルで見ると、文字通り`sendto()`という関数を使って、宛先のアドレスとポート番号を指定してデータを送信します。そのため、相手が存在しない場合でもエラーにはなりません。 ではどうやってエラーを判定するのか? それは単純に『**適当なタイムアウトを用意して、値が返ってこない**』という状況をエラーとします。 そして、受ける時(送信後に戻りパケットが必要なとき)は、自分が受信体勢に入っておく必要もあります。 お互いに構えていないといけないというわけでもないことも重要です。 このことからも、**データグラムを投げる**という感覚で理解しておくと良いでしょう。 ## UDPの利用例 UDPは、リアルタイム性が求められるアプリケーションでよく使用されます。以下は、UDPの利用例です。 - **オンラインゲーム**: ゲームの状態やプレイヤーの動きをリアルタイムで更新するために使用されます。多少のパケット損失が許容されるため、UDPが適しています。 - **音声通話**: VoIP(Voice over IP)アプリケーションでは、音声データをリアルタイムで送信するためにUDPが使用されます。音声の遅延を最小限に抑えるため、信頼性よりも速度が重視されます。 - **ビデオストリーミング**: 動画のストリーミングサービスでは、UDPを使用してリアルタイムで動画データを送信します。多少のパケット損失が許容されるため、UDPが適しています。 ```{note} とはいえ、ビデオストリーミングに関しては、通信速度の向上などもあり、TCPベース(https)での通信が主流となっています。 さらに、TCPベース(https)になってる裏で、httpのプロトコル自体がQUICというUDPベースのプロトコルによる通信を行うようになってきており、なんだかんだでUDP寄りに戻ってきているのではないかというふしも見えたりします。 ```