| 前へ << RSA で暗号化してみよう (2) | inetdを利用してechoサーバを作ってみよう >> 次へ |
ここまでで必要な用語は説明しましたので、もう少ししっかりとしたクライアントと サーバの動作を書きます。ちょっと UNIX ユーザ向けの説明なので、 わかる人だけ読んで下さい。いまいち理解できなかった人は読み飛ばして 結構です。クライアントを作る際にはこれらの知識は不要です。サーバとは特定のポートを見張っているプログラムのことです。 クライアントはサーバの動いているホストの(サーバが見張っているはずの) ポートに connect し、データのやりとりをします。 もしサーバがポートを見張っていない場合はクライアントは connect することはできません。
ですから、1つのコンピュータに WWW サーバ、FTP サーバ、SMTP サーバ、POP3 サーバを上げておく場合、 それぞれポート80、ポート21、ポート25、ポート110を見張っておく プロセスを実行しておかなければなりません (UNIX では現在実行中のプログラムのことをプロセスといいます)。
例えば FreeBSD だと標準設定では SMTP サーバ、FTP サーバなどが 自動的にインストールされています。では ps コマンドを使って ポート25(SMTP) を見張っているプロセスはどれなのか調べてみましょう。
% ps axww (Solarisなど、SystemV系UNIXなら ps -ef) 0 ?? DLs 0:00.14 (swapper) 1 ?? Is 0:00.03 /sbin/init -- 2 ?? DL 0:06.41 (pagedaemon) 3 ?? DL 0:00.00 (vmdaemon) 4 ?? DL 0:18.71 (update) 27 ?? Is 0:00.01 adjkerntz -i 55 ?? Is 0:00.82 routed -q 72 ?? Ss 0:00.58 syslogd 80 ?? Is 0:00.02 portmap 104 ?? Is 0:00.13 inetd 107 ?? Ss 0:00.73 cron 111 ?? Is 0:00.13 sendmail: accepting connections on port 25 (sendmail)最後の行のプロセス番号111番の sendmail がそうです (プロセス番号が111なのはたまたまそうだっただけです)。 ご丁寧にも「ポート25番へのアクセスを受け入れます」と書いてありますね。ではポート21を見張っているはずの FTP サーバはどこにあるんでしょう。 psで見る限りではどこにもありませんね。実は inetd というものが FTP サーバの代わりをしているのです。
いろんなサーバがポートを見張るためだけに起動されていると、 メモリは喰うし CPU パワーも必要だし、いいことはありません。 これを避けるために、一つのプロセスでいろんなポートを見張っていて、 クライアントからの通信が来た場合に初めてサーバを実行してくれる 便利な仕組みがあります。この役割を担っているのが inetd です。上の ps の例では、プロセス番号104となっています。 inetd の設定ファイルは /etc/inetd.conf です。以下に ftp の部分を引用します。
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -lこのように inetd がポート25を見張っていて (ポート25だけではありませんが)、 ポート25にクライアントからの接続要求があると、/usr/libexec/ftpd を実行します。あとは ftpd が FTP クライアントと通信するわけです。では実際に確かめてみましょう。まず ftpd が起動していないことを 確認します。
% ps axww | grep ftpd何も出力されませんね? ということは現在 ftpd のプロセスは実行されていない ということです。では ftp を使って localhost の FTP サーバに アクセスしてください。次に、Ctrl-z を押してサスペンド(中断)して、 ps axww | grep ftpd とタイプしてください (あるいは別ウィンドウで ps axww|grep ftpd をタイプしてもいいです)。% ftp localhost Connected to hoge.fuga.com 220 hoge.fuga.com FTP server (Version 6.00) ready. Name (localhost:user): ^Z Suspend % ps ax | grep ftpd 456 ?? Ss 0:00.05 ftpd: hoge.fuga.com: connected (ftpd)FTP クライアントがポート21に接続したら ftpd が出現しました。 では ftp を終了させましょう。fg でフォアグラウンドで再実行させて、 Ctrl-C で終了させてください。% fg ftp localhost ^C再度ftpdを確認してみましょう。% ps ax | grep ftpd何も表示されません。ということは FTP クライアントが 接続要求を出したときだけ ftpd が実行され、コネクションが 切断されると ftpd は終了してしまったということです。ポートの監視を行い、接続要求があったときだけサーバ本体を起動すること。 これが inetd の役割です。これにより、たくさんのポートを監視するためだけに、 多くのプロセスを起動しなくてもすむわけです。
inetd は、その役割からスーパーサーバとも言われます。
さらに inetd の便利な点として、プログラムが簡単に書けることがあげられます。 bind・listen・accept などめんどうな接続作業は全て inetd がやってくれるからです。 さらにクライアントからのデータは標準入力に送られてきますし、 標準出力に書き出したデータは、クライアントに送られます。 次節で、inetd を使った echo サーバを作ってみます。また、簡単なサーバ、例えば後からサンプルとしてでてくる echo サーバなどは inetd の内部に組み込まれています。 /etc/inetd.conf に internal と書いてあるものは inetd の内部のサーバが起動されることを表しています。
何かと便利な inetd を利用せずに、自前でポートの監視をしているサーバソフトウェアも 存在します。sendmail・httpd などがそうです。inetd を使った場合はコネクションが終了すると、サーバプロセスも終了してしまいます。 上の例でも、ftpd はコネクションを切ると終了していましたよね?
ところが頻繁にアクセスがあるサーバの場合、inetd によるサーバの実行/終了に 時間がかかり、反応速度が遅くなってしまいます。「メモリを取るか、実行速度を取るか」 と考えた場合、sendmail や httpd は実行速度を重要視して、 素早く反応できるようにしてあるのです。
- サーバは必ず特定のポートを見張っていなければならない。
- httpd や sendmail のように、常にサーバプロセス自身がポートを見張っていてもいいし、 ftpd のようにポートの見張りは inetd にまかせておいてもいい。 どちらを取るかは、サーバの形態によって決まる。
| 前へ << RSA で暗号化してみよう (2) | inetdを利用してechoサーバを作ってみよう >> 次へ |