[TCP/IP とインターネットの仕組み]に戻る
[TCP/IPの概要] [ルーティング] [プロトコル階層] [ポートの概念]

ポートの概念

ポートとは

ネットワークにつながれたコンピュータでは複数の通信プロセスが動く ネットワークのサーバでは、通常、複数のプロセスが動いていて、 それぞれが異なる仕事を行っています。あるプロセスはメールに関する処理、 別のプロセスはファイル転送の処理、また別のものはWWWの処理をしているかも しれません。このようにたくさんの処理を行っているコンピュータでは、 それぞれのプロセスは他のプロセスと、干渉し合うことなく、 それも同時に行うことができればとても便利です。
内線番号のようなもの たとえば、ある建物に入っている組織で複数の人が外部の人と同時に 別の人と通信するためには、複数の電話口があれば便利なのと同じです。 そのような場合、1つの会社内で複数の内線電話をおいて、 別々に使えるようにすると便利です。 TCP/IPにおけるポートもこの内線電話に似ています。 一台のコンピュータの中でネットワークの処理に携わるそれぞれのプロセスが、 それぞれ専用の通信口を持っているのです。この通信口がポートと呼ばれる ものなのです。これを内線電話にたとえると、IPアドレスは代表番号、 ポート番号は内線番号に対応します。 つまりIPアドレスはコンピュータを指定するのに用いますが、 ポート番号はコンピュータ内の通信口を指定します。 このポートは独立して通信でき、 同一のポートを複数のプロセスで利用することはできません。
ポートは番号で識別 それぞれのポートは番号で識別され、他のプロセスで使っている WWWでは80番ポート,ftpは21番ポート、telnetは23番ポートなどのように、 メジャーなアプリケーションについては標準のポート番号が決められています。 これを確認するには、unixマシンでは/etc/servicesを見てください。 そのファイルは次のような形になっています。

ftp-data        20/tcp
ftp             21/tcp
wu-ftp          7000/tcp
telnet          23/tcp
smtp            25/tcp
pop3            110/tcp
nntp            119/tcp

このファイルではメールを送る際に使われる smtpのポートは25番で、 メールを受け取る時に使われるポート pop3のポートは110番ポートで あることが記述されています。

ポート番号はTCPヘッダに納められている 送信者となるアプリケーションはIPアドレス(IPヘッダに含まれる)と ポート番号(TCPヘッダに含まれる)を指定して、 「このマシンのこのポートにこの情報を度どけてくれ」と送信すると、 相手方のTCPの処理をつかさどるモジュールが、該当するポートの データを待っているプロセスにその情報を渡します。 こうして目的のプロセスに情報を届けることができるのです。

ポートをまとめて管理するinetd

ネットワークのサーバはいつクライアントから接続要求があっても 応答できるようにしますが、そのために各ポートごとに、 そのポートに情報が届くのを待つプロセスを動かしておくのでは、 無駄が多すぎます。ほとんどアクセスがないポートが多い上、 アクセスされる頻度の高いポートでも、実際に利用されている 時間は短いものもあります。この間、 プロセス空間を維持し続けるのはコストが高くつきます。
inetdは複数のポートの接続要求を監視する これを解決するには、ポートに接続要求があった時点で、 サーバプロセスを起動する方法があります。一つのプロセスで 複数のポートを監視し、接続要求があった時点で、必要な プロセスを起動して、それと接続するのです。この仕事を 行うプログラムがinetdです。
設定ファイル/etc/inetd.conf unixマシンが近くにあるなら、そのマシンの/etc/inetd.confを 見てください。それには次のような内容が含まれているでしょう。

ftp    stream  tcp nowait  root    /usr/libexec/ftpd       ftpd -l
telnet stream  tcp nowait  root    /usr/libexec/telnetd    telnetd
shell  stream  tcp nowait  root    /usr/libexec/rshd       rshd
pop3   stream  tcp nowait  root    /usr/local/libexec/popper       popper

この2行目は telnetのポート(/etc/servicesに記述されているポート番号: 通常は80番)に接続要求があったら/usr/libexec/telnetdを起動して、それに 接続することを意味しています。

接続待ちプロセス

常時ポートへの接続を 待っているプロセス すべてのポートを inetd が管理しているわけではありません。 利用頻度の高いポートで、inetdを使うとプロセスの起動と終了 のために、かえってコストが高くなるかもしれません。 このような場合はポートへの接続を待つプロセスがバックグラウンドで 実行されます。このようなプロセスはデーモンと呼ばれます
デーモンプロセス ではどのようなデーモンが動いているか確認する方法を示します。 これには ps コマンドを用います。以下にその実行例を示します。

$ps auxw
USER       PID %CPU %MEM   SZ  RSS TT STAT START  TIME COMMAND
root       101  0.0  0.2   60   60 ?  S    Jun 21  2:47 syslogd
nobody   12567  0.0  0.0  344    0 ?  IW   Jul  9  0:00 httpd
root      4353  0.0  0.0   32    0 ?  IW   14:03   0:00 in.telnetd
root      2065  0.0  0.0  256    0 ?  IW   Jul  5  0:15 sendmail
bin      16088  0.0  0.0  800    0 ?  IW   Jul 12  0:02 cannaserver
        :
        :
$

ここで ps auxw というコマンドを実行していますが、これは BSD 系のUNIX の形式です。 System V系の UNIXであれば、ps -eal などと実行してみてください。 (オプションについてはmanを見てください。) ここでは結果を編集して、デーモンであるプロセスだけにしています。 実際には、デーモンでない他のプロセスも表示されます。どのプロセスが デーモンであるかはpsコマンドではわかりませんが、デーモン プロセスの多くはその名前の最後にdの文字が含まれています。


[TCP/IPの概要] [ルーティング] [プロトコル階層] [ポートの概念]
「TCP/IP とインターネットの仕組み」へ戻る