UDP入門

  1. 前号までのあらすじ

    一応経路制御まで終わったので、とりあえず目的のマシンまでパケットが届く(少なくとも届く努力をする(^_^)v)ところまではたどりつきました。

  2. IPより上位のプロトコル

    実際にアプリケーション間で通信を行う場合、IPのレベルをそのまま使うことはまずなく、IPにかぶさっている、より上位レベルのプロトコルを使用します。なぜなら、IPレベルでは「目的のマシンまで(正確にはそのマシンのOSまで)」届くように努力しますが、パケット中のデータを必要としているのは一般的にはアプリケーション(プログラム)だからです。アプリケーションは、(DOSのようなシングルタスクのOSを除けば)1つのOS上で複数が平行して動いているのが普通です。IPパケットには「受信すべきアプリケーションの識別情報」、言い換えれば「受け取ったデータをどのアプリケーションに渡せばよいか」という情報がありません。IPで欠落している情報は、より上位の層で補完してやる必要があります。TCP/IPの世界では、IPレベルのすぐ上位に位置するものとして、TCP(Transmission Contorl Protocol --- 転送制御プロトコル)とUDP(User Datagram Protocol)の2つがあります。UDPからまずご紹介します。

  3. UDPの意義

    UDPは基本的に、IPプロトコルに相手先アプリケーションに関する情報を乗っけただけのもので、信頼性はありません。プロトコル・レベルでは応答を返さないので、通信相手に届いたかどうかはわかりませんし、エラーが起これば単にそのパケットを捨てるだけです。エラー制御などはアプリケーション(または、UDPのさらに上位のプロトコル)で行ってやらなければなりません。UDPを使って実装されているアプリケーションはあまり多くありませんが、TCPを使うアプリケーションに補助的に使われている場合もあります。代表的なものとして、DNS(Domain Name System)、NFS(Network File System --- ファイル共有)があります。Windows の世界ではIP MessengerというフリーソフトウェアがUDPを使用して実装されています。あれ、今サイトを覗いてみたら、Mac版、X版、Java版などといろいろあるみたいですね。

  4. UDPヘッダ

    UDPプロトコルではIPパケットをUDPパケットで包みこみますが、これを見てもわかるように、ヘッダにはポート番号以外はたいした情報は持っていません。つまり、UDPプロトコルはIPプロトコルとほとんど同じ物だといえます。

  5. ポート番号の役割

    一般的に、1つの計算機内部では複数のプログラムが同時に通信を行っています。このため、IPプロトコルだけではパケットが宛先の計算機(=その計算機内部で動いているOS)までたどりつけるだけで、OSがそのパケットを待っているアプリケーションに渡すためには付加的な情報が必要です。このアプリケーションを識別するための情報として、UDPプロトコルではUDPポート番号を使用しています。図示すると以下のようになります。

    UDPの役割
    送信元ノード途中経路宛先ノード
    送信元
    アプリケーション

    (UDP
    レベル)
    TCP/IPスタック
    +インターフェース

    (IPレベル)
    TCP/IPスタック
    +インターフェース

    (UDP
    レベル)
    宛先
    アプリケーション
    IPアドレスのみで到達可能 ポート番号のみで到達可能

    ここで、注意することを以下に述べますが、これらのうち最初の2つは、次節で述べるTCPでも共通です。

    • ポート番号の一意性(UDP/TCP)

      宛先ノード中の宛先アプリケーションを特定するこのため、ポート番号は宛先ノード(マシン)内で基本的には一意である必要があります。

      一般的には、クライアントはサーバマシン上にいる(はずの)サーバ・アプリケーションを特定する場合、前もってそのサーバAPが期待しているポート番号を知る必要があります。このうち特によく使われるポート番号については、「良く知られているポート --- Well Known Port」として /etc/services(Linuxの場合)や %SYSTEMROOT%system32\drivers\etc\services(Win 95/NTの場合)に記述されています。

    • 宛先ノードは送信元ノードと同一であってもよい(UDP/TCP)

      宛先ノードは、通常送信元ノードと異なったマシンであることが多いですが、送信元ノードと同一マシンであっても構いません。この場合、1つのマシン上でサーバAPとクライアントAPが通信し合うことになります。この時はそのマシンのインターフェースに割り当てられたIPアドレスは使われず、ループバック・デバイス(ホスト名は一般的に localhost)という仮想的なインターフェースで内部的に折り返します。このインターフェースのIPアドレスは127.0.0.1と決まっています。これを利用すれば、全く外部とつながっていないマシンにおいても TCP/IP プロトコルが使えるということになります。

    • 宛先ノードは複数あってもよい(UDPのみ)

      宛先としてブロードキャスト・アドレスを指定した場合は、宛先ノードは不特定多数となります。この場合の動作は、届いたノード上に指定したポート番号を期待するアプリケーションが動作していればそのパケットが届けられ、動作していなければ、そのノードでは単に受信したパケットを破棄します。なお、ブロードキャスト・アドレスはUDPでしかサポートされません。