Part2では,TCPが通信の信頼性を高めるためのしくみを見てきた。一方,UDPはこれとは正反対で,信頼性を確保するしくみを持っていない。その反面,とても自由度が高いプロトコルである。Part3では,UDPの概要とともに,どんなアプリケーションに向いているのかを見ていく。

 TCP編では,TCPが通信の信頼性を高めるためのしくみを見てきた。一方,UDPはこれとは正反対で,信頼性を確保するしくみを持っていない。だからといって,UDPは不要と決めつけてしまうのは早計である。どんなプロトコルにも長所と短所があり,それぞれにふさわしい用途がある。

“なにもしない”プロトコル

 まずはUDPとはどんな姿をしているのか,UDPのプロトコル・フォーマットから見ていこう(図1)。

図1●UDPのプロトコル・フォーマット<br>UDPのヘッダーはIPパケットにポート番号を追加しただけで,特別なことは何もしない。
図1●UDPのプロトコル・フォーマット
UDPのヘッダーはIPパケットにポート番号を追加しただけで,特別なことは何もしない。
[画像のクリックで拡大表示]

 UDPは,TCPと同じくIPの上位プロトコルである。TCPのデータはセグメントと呼んだが,UDPではそれをデータグラムという。実際には,このUDPデータグラムがIPパケットのデータ部分に入ってやりとりされる。

 図1を見ればすぐわかるように,UDPのヘッダー部分は非常にシンプルだ。(1)送信元ポート番号,(2)あて先ポート番号,(3)UDPデータグラムの大きさ,(4)チェックサム――という4種類のフィールドしかない。TCPヘッダーにはあったシーケンス番号やウインドウ値,制御ビットといった項目が削られている。残った4項目は,UDPがアプリケーションとの間でデータを受け渡すために最低限必要なものだけである。要するに,UDPはポート番号でアプリケーションを区別してデータを受け渡す以外,「なにもしない」プロトコルなのである。

 しかし,なにもしないのは悪いことばかりではない。なにもしなければ,それだけ処理が軽くなり,TCPより高速に処理できる。例えば,UDPのヘッダー・サイズはたったの8バイトである。TCPヘッダーが標準で20バイト,オプションを使うと最大60バイトになるのに対して圧倒的に小さい。余計なヘッダーが付かない分だけアプリケーション・データを送受信できるので,通信効率はUDPの方が高くなる。

 また,信頼性を確保するしくみをアプリケーションが独自に用意したい場合もあるだろう。再送処理だって,TCPに任せずにアプリケーションが独自に処理してもよい。つまり,UDPはとても自由度が高いプロトコルなのだ。

同報通信ができるのはUDPだけ

 では,具体的にUDPがどんなアプリケーションに向いているかというと,大きく三つ考えられる(図2)。

図2●UDPの用途は三つある<br>とくに同報通信はUDPしか使えない。
図2●UDPの用途は三つある
とくに同報通信はUDPしか使えない。
[画像のクリックで拡大表示]

 まず一つ目は,複数の相手へメッセージを一斉同報するアプリケーションだ。これは向いているというよりも,TCPにはできない絶対的な利点である。TCPは1対1でTCPコネクションを張るのが前提だからだ。

 メッセージの同報は,とくにLANでTCP/IPを使うときに必要になる。例えばIPアドレスをクライアント・マシンに自動で割り振るDHCPが,その代表である。そもそもクライアント・マシンはIPアドレスを持っていないから,TCPではまったく役に立たない。また,ネットワーク機器を管理するSNMPや,ルーター同士で経路情報を交換するためのRIPといったプロトコルも同様にUDPを使う。

 二つ目は,ストリーミング・データを扱うアプリケーションだ。インターネット電話などでは,高速でリアルタイムにデータを送受信する必要がある。もし途中のデータが欠落しても,あとから再送してもらっていたのでは間に合わない。つまり,多少のデータ欠落は我慢してでもUDPを使った方がいいのだ。

 三つ目はドメイン名からIPアドレスを調べたりするDNSである。DNSでは,1回の問い合わせに必要なデータ量がIPパケット1個分で済んでしまうくらい小さい。TCPコネクションを確立するために3パケットをやりとりすること自体がムダなのである

 結局,TCPとUDPはどちらも絶対必要なのである。

ミニ解説7
同じポート番号が同時に使える!?
 Webサーバーが80番ポートで動いているのに,DNSサーバーも80番ポートで動く――にわかには信じられないようなことが,実際には起こり得る。TCPとUDPはそれぞれで同じ0~65535番までのポート番号を使うが,この管理が完全に独立している。だから,こんな不可解な現象が起こり得るのだ。ただし,実際にはHTTPはTCPの80番ポートとUDPの80番ポート,DNSもUDPの53番ポートとTCPの53番ポートという具合に両方を予約していることが多く,冒頭のようなことは起こりにくい。