信頼性に欠けるが、小さくて軽くて速いUDP

 UDP(User Datagram Protocol)でやり取りされるメッセージの一単位はユーザデータグラムと呼ばれます。データグラムに関してはIPの章でも議論しました。IPが扱うデータの単位(データユニット)は本来データグラムというのですが、パケットとかIPパケットというのが一般的になっているという話をしました。レイア3ではデータグラムで、レイア4のTCPではセグメントです。UDPでもセグメントでよさそうなものだと思いますが、UDPではユーザデータグラムです。UDPはほとんど何もしないので、IPと同じでいいやということかもしれません。なくてもよさそうですがないと困ります。UDPがないと、IPが直接アプリケーションプロセスとやり取りしなくてはならなくなります。レイア4ではソケットを作成して、そのソケットにデータグラムを届けなくてはなりませんので、やはりIPにはできません。ここはUDPに任せましょうということになります。



1 UDPの必要性

 UDPはほとんど何もしないといいましたが、何をしないんでしょうか?TCPのやるようなことなほとんど何もしないという意味ですので、TCPが何をしているのか思い出しながら、それと対比して考えてみましょう。TCPは3ウェイハンドシェークをしてコネクションを構築して、シーケンス番号と確認応答番号をやり取りしながらデータを送受信しています。UDPはコネクションを確立することもありませんし、シーケンス番号と確認応答番号を交換しながら送受信するというのもありません。従って、セグメントの順番が狂っても分かりませんし、セグメントが重複しても分かりませんし、消失しても分かりません。また、受信側が送信側にウィンドウサイズを教えることもありませんので、バッファ溢れを起こす可能性のあります。また、輻輳制御も行いませんので、ネットワークが混雑して、ルートの途中のルータで取りこぼされる可能性もあります。

 ただし、上位層のアプリケーションプロセスに対してサービス提供を行う必要はありますので、ソケット間での通信サービスを行います。このサービスは当然コネクションレスということになります。

 TCPではデータはバイトストリームという形式で扱われるといいました。アプリケーションプロセスが発信したデータの間に区切りがあったとしても、TCPには関係ありません。アプリケーションプロセスが作成したデータはいったん送信用のバッファに溜めておき、適当な時に(TCPの判断で)、適当な長さに切ってネットワークに送り出します。UDPはバイトストリームという考え方には従わないので、アプリケーションプロセスがソケットに記述したデータは直ぐにIPでカプセル化されて宛先に向けて送信されてしまいます。

 ここまで読んでみてUDPを劣ったプロトコルと思った人も多分いると思います。しかし、UDPは決してTCPと比較して劣ったプロトコルではありません。UDPにはUDPなりの使い道というものがあります。

 UDPはバイトストリームの考え方はとりませんので、アプリケーションプロセスが作成したデータは、たとえ小さくても直ぐに相手方に送信されます。これはSNMPやDNSの名前解決などに利用されます。これらのサービスで予想されるデータは小さなもので、アプリケーションプロセスは一言で回答を済ませます。また、受け手の方では直ぐに回答が欲しいと思っているはずです。このような場合に、3ウェイハンドシェークでコネクションを張り、アプリケーションプロセスからのデータがある程度集まってから、回答を送信するというやり方は向いていません。

 UDPはエラー処理の機能がありません。しかし、定期的に、例えば30秒に一回というように定期的にデータ送信を行うサービスでは何回かのうち1回程度エラーが起きてもあまり気になりません。次の定期送信で補うことができるからです。ネットワークの管理(SNMP、RIPなど)のプロトコルはこのような考え方から、UDPを利用しています。ネットワーク管理では定期的にどんどんデータをやり取りしますので、ネットワークの負荷を考えるとデータユニットはできるだけ小さいほうが好都合です。UDPはTCPに比較するとヘッダフィールドも少なく、データ(メッセージ)部分も小さいのでこの点でもUDPが適しています。

 それからUDPは簡単なプロトコルですので、UDPを使ったアプリケーションは小さなものとなります。プログラムが小さくなると容量の小さな記憶装置しか持っていないシステムでも使いやすくなります。例えば、ルータなどはハードディスクを持っていません。ハードディスクは可動部がありますので、何年もの間ノンストップで稼働し続けなくてはならないルータなどには不向きです。ルータはフラッシュメモリなどの小さな容量の記憶装置にプログラムを入れています。ルータはどんなプログラムを持っているのか訝る人もいると思いますが、大規模ネットワークでは設定情報をサーバに入れ、そのサーバと各ルータが通信を行うことで効率的に設定作業を行うなどの必要があります。この時に使うのがTFTPです。TFTPは簡単な(trivial)なFTPという意味で、小さなプログラムとなっています。

 それからもうひとつ重要な違いがあります。TCPは論理的なコネクションを張りますので、相手は1つでなくてはなりません。つまり、ユニキャスト通信にしか対応できません。しかし、UDPではコネクションを張るということをしませんので、宛先をブロードキャストで指定することができます。ブロードキャストが利用できれば、ネットワーク管理などのプロセスにとってはとても好都合です。


2 ソケット通信

 TCPはソケットを使ってアプリケーションプロセスとインターフェースがとれるメカニズムを提供していますが、UDPも同様のメカニズムを提供しています。ただし、UDPが提供するのは、ソケット間をコネクションレスでつなぐサービスです。
 ソケットを作成するにIP層レベルのことも知らなくてはなりませんし、UPDが知っていることをIPに知らせる必要もあります。従って、TCPと同様に擬似ヘッダを使って、IPとUDPが連携を図っていく必要があります。



3 UDPヘッダフォーマット

 15 31 
送信元ポート 宛先ポート
セグメント長 チェックサム
データ

 ソケット通信ですから宛先ポートは必要です。送信元ポートは使わない場合は0とします。


4 擬似ヘッダのフォーマット

 擬似ヘッダは次のようなフォーマットを持っています。

 7  15 31 
送信元IPアドレス
宛先IPアドレス
0 プロトコル番号 UDPセグメント長

 ソケットを作成するには相手側のIPアドレス、ポート番号、自分側のIPアドレス、ポート番号が分からなくてななりません。送信側では多分、相手のIPアドレスとポート番号はアプリケーションプロセス(あるいはユーザ)から教えてもらえるでしょう。ポート番号はOSから教わります。しかし、自分側のIPアドレスはこれを管理しているIPに教わる以外にはありません。受信側ではどうでしょうか。IPから受け取るセグメントには相手(送信側)のIPアドレスが入っていません。これでは、相手が本当は誰なのか自分で確認できません。このようなわけで、IPとUCPの間で連携をとるための擬似ヘッダが必要となります。





更新履歴

2016/04/16 作成





























 ページの先頭