Previous | Next | Trail Map | Custom Networking and Security | ネットワーキングの概説


ネットワーキングの基本

インターネット上で動作しているコンピュータは、TCP および UDP プロトコルを使 用して相互に通信する。これらはどちらも 4 レイヤのプロトコルである。

ネットワーク上で通信する Java プログラムを書くときは、アプリケーションレイヤ でプログラミングすることになる。一般に、TCP と UDP レイヤを気にする必要はな く、その代わりに java.net パッケージのクラスを利用すればよい。 このようなクラスはシステムに依存しないネットワークコミュニケーションを提供す る。 ただし、自分のプログラムがどの Java クラスを使うべきかを判断するために、TCP と UDP の違いについては理解しておく必要がある。

2 つのアプリケーションが信頼性のある状態で相互に通信する必要のある場合、アプ リケーションはコネクションを確立し、そのコネクションを通じてデータを送ったり 受け取ったりする。これは電話をかけることに似ている。たとえば、ケンタッキーに 住むベアトリス叔母さんと話をしたければ、その叔母さんの電話番号をダイアルして 、彼女が応答したときにコネクションが確立される。 電話回線を通じて互いに話すことにより、コネクションを通してデータを送ったり受け取ったりしている。 電話会社と同様、TCP もコネクションの一方の端から送られたデータが送られた順序 どおりにもう一方の端にきちんと到達することを保証している (そうでない場合はエ ラーがレポートされる)。


定義: TCP は、2 つのコンピュータの間で信頼性のあるデータフローを実現するコネクショ ンベースのプロトコルである。

信頼性のある、二地点間のチャネルを通信に必要とするアプリケーションは、TCP を 使用する。ハイパーテキスト転送プロトコル (HTTP)、ファイル転送プロトコル (ftp)、Telnet (telnet) はどれも、信頼性のある通信チャネルを必要とするアプリ ケーションの例である。このようなアプリケーションをうまく実行するには、データ がネットワークを通じて送受信される順序が非常に重要である。 HTTP を使って URL から読み取る場合、データは送信された順序どおりに受信されな ければならなず、そうでなければ、HTML がごちゃごちゃになったり、zip ファイル が破壊されたり、情報が不正になってしまうのである。

多くのアプリケーションでは、このような信頼性の保証が、コネクションの一方の端 からもう一方の端へ情報を正しく転送するときの重要な鍵である。しかし一方では、 さほど厳密さを求めていない通信形式もある。実際、通信形式の中には、余分なオー バーヘッドによりパフォーマンスが悪影響を受けたり、信頼性のあるコネクションが かえってサービスを無効にしてしまうといった理由から、厳密なコミュニケーション が邪魔になるものもあるのである。

たとえば、要求があったときに現在の時刻をクライアントに送る時計サーバを考えて みる。クライアントがパケットを受け取りそこなった場合、そのパケットを再送する ことに意味があるだろうか? 意味はない。というのは、クライアントが再送された パケットを受け取ったときにはその時刻はもう正しくないからである。クライアント が 2 つの要求を作成して、サーバから順序のずれたパケットを受け取るとしても、 クライアントはパケットの順序がずれていることを認識して、別のパケットを要求す ればよいだけのことなので、たいして問題ではない。このような場合には信頼性の高 いチャネルは必要でないだけでなく、パフォーマンスの低下を招き、サービスの有用 性を損ないかねないのである。

高い信頼性のチャネルの保証を必要としないサービスの別の例として、 ping コマンドがある。ping コマンドの目的は、ネット ワーク上の 2 つのプログラムの間の通信をテストすることである。実際、 ping はコネクションがどの程度良好か不良かを判定するために、抜け 落ちたパケットや順序のずれたパケットを認識しなければならない。した がって、信頼性の高いチャネルでは、このようなサービスがまったく無効になってし まうのである。

UDP プロトコルは、ネットワーク上の 2 つのアプリケーション間の保証されない通 信を提供する。UDP は TCP のようなコネクションベースとは異なり、データグ ラム と呼ばれる独立したデータのパケットをあるアプリケーションから別のア プリケーションへ送信するものである。データグラムを送信することは、郵便局を通 じて手紙を送ることとよく似ている。つまり、配達の順序は重要ではなく、保証され てもおらず、各メッセージは互いにまったく無関係なのである。


定義: UDP は、データグラム と呼ばれる独立したデータのパケットを、到着の保 証なしで、あるコンピュータから別のコンピュータに送信するプロトコルである。 UDP は TCP とは異なり、コネクションベースではない。

ポート

一般に、コンピュータはネットワークに対して 1 つの物理的なコネクションをもつ 。特定のコンピュータを宛先とするすべてのデータはこのコネクションを経由して到 達する。 ただし、データは、そのコンピュータで動作している別のアプリケーションを宛先と する場合もある。このため、コンピュータはデータをどのアプリケーションに転送す べきかを認識しなければならなず、この手段としてポート を使用する。

インターネットで伝送されるデータには、その宛先であるコンピュータとポートを特 定するアドレス指定情報が付けられている。コンピュータは 32 ビットの IP アドレ スで特定され、IP はこのアドレスを用いてデータをネットワーク上の正しいコンピ ュータに配信する。ポートは 16 ビットの番号によって特定され、TCP と UDP はこ の番号を用いてデータを正しいアプリケーションに配信する。

コネクションベースの通信では、あるアプリケーションはソケットをポート番号に結 びつけることによって別のアプリケーションとのコネクションを確立する。これには 、そのポートを宛先とするすべてのデータを受け取れるよう、アプリケーションをシ ステムに登録するという作用もある。 複数のアプリケーションを同じポートに結合することはできない。すでに使用されて いるポートに結合しようとしても失敗に終わる。

データグラムベースの通信では、データグラムパケットにその宛先のポート番号が含 まれる。


定義: TCP と UDP プロトコルはポートを使用して、コンピュータ上で動作している特定の プロセスに着信データをマップする。

ポート番号は 0 から 65535 の範囲にある (ポートは 16 ビットの数値で表されるか らである)。0 - 1023 の範囲のポート番号には使用制限があり、それらは HTTP や ftp やその他のシステムサービスのようなよく知られているサービスによって予約さ れている。ユーザのアプリケーションでこのようなポートを結合しようとしてはなら ない。HTTP や ftp のようなよく知られているサービスのために予約されているポー トは、既知のポート と呼ばれる。

java.net のクラスを通して、Java プログラムは TCP または UDP を使用し、インタ ーネット上で通信することができる。URL、URLConnection、Socket、および SocketServer クラスはすべて、ネットワーク上の通信に TCP を使用する。一方、 DatagramPackett と DatagramServer クラスは UDP を使用する。


Previous | Next | Trail Map | Custom Networking and Security | ネットワーキングの概説