若手部員 宇田くん
  Webサーバーにpingコマンドを打つときちんと応答が返ってくるのに,Webブラウザを使ってアクセスするとエラーが表示されるんだ。おかしいな。  

若手部員 貴子さん
  それって,もしかするとWebサーバー・ソフトが停止しているんじゃないかしら。そうだと,pingコマンドの応答は返って来るかも知れないわ。実際は,どうなのか調べてみましょう。  


宇田:おかしいな。どうしたんだろう?

貴子:何を悩んでいるの?

宇田:Webページが表示されないんだ。Webサーバーはきちんと動いていると思うんだけれど,ブラウザでアクセスしてみるとエラーが表示されてしまうんだ。

貴子:ping(ピング)コマンドは試してみた?

宇田:もちろんだよ。pingでは,きちんと応答が返ってきたよ。それなのに,Webページが表示されないんだ。昨日までは大丈夫だったのに・・・。

 宇田君が困っているようである。Webサーバーへpingコマンドを打ったら応答が返ってきたので,Webサーバーは動作していそうだ。しかし,Webブラウザからアクセスするとエラーになる(図1)。どうしてなのだろうか。

図1 Webサーバーはpingコマンドには応答するのに,ブラウザでアクセスするとエラーになるのはなぜ?

Webサーバー・ソフトがダウン

貴子:もしかしたら,Webサーバーのサーバー・ソフトがハングアップしていたり,停止しているんじゃないかしら。調べてみた?

宇田:えっ,大丈夫なはずだけれど。

貴子:もう一度サーバーを確認してみましょう。

宇田:そうだね。えっと,サーバー・ソフトは・・・。あれ,停止しているよ。

貴子:そんなことだと思ったわ。相変わらず,そそっかしいわね。

宇田:どうせ,僕はいい加減だよ。でも,どうしてpingコマンドには応答が返ってきたんだろうか。

貴子:そうね。ちょっと,訳がわからないわね。

 pingコマンドには応答が返ってくるのにWebアクセスでエラーになるのは,Webサーバー内のプロトコル構成を考えるとよい。

 pingコマンドは,IPネットワークのエラーなどを通知するためのプロトコルであるICMPを利用している。このICMPはIPと一体になって動く。したがって,pingコマンドに対してはIPさえきちんと動いていれば応答する。

 一方,Webサーバー・ソフトはIPの上位のTCPのさらに上位で動いている。このため,Webブラウザからのアクセスに応答するためには,TCPやWebサーバー・ソフトもきちんと動いていなければならない(図2)。

図2 pingとWebアクセスの違い

pingパケットはサーバー・マシンのTCP/IPソフトまで届くのに対して,Webアクセスのパケットはサーバー・ソフトまで到達する。

停止時は応答が何もないのか?

宇田:わかったよ。pingコマンドはIP,Webアクセスはそれよりももっと上位のサーバー・ソフトと通信しているんだって。

貴子:あ,そうか。だから,サーバー・ソフトが止まっていても,pingコマンドには応答が返ってきたのね。

宇田:そうだよ。そもそも,メール・サーバーなんかにWebアクセスをしても同じエラーが出ることを考えれば,当たり前のことだったんだよ。

貴子:ところで,Webサーバー・ソフトが停止していたときは,本当に何も応答が返って来なかったのかしら。

宇田:そうだと思うよ。

貴子:何か釈然としないのよ。パケットをキャプチャして調べましょう。

宇田:そうだね。つきあうよ。まずは,Webサーバー・ソフトが稼働していて,きちんとWebページが表示されたケースから調べることにしよう。

 実験は,LAN上にクライアントPC(IPアドレスは192.168.0.1)とWebサーバー(192.168.0.254)をつなぎ,クライアントのWebブラウザでアクセスしてパケットをキャプチャしてみた。その結果が図3である。

図3 Webアクセスが成功したとき,最初にやりとりされたパケット

正常時は最初にコネクションを確立

宇田:Webサーバーへアクセスするとき,クライアントのブラウザのURL欄には「http://192.168.0.254/」と書き込めばいいんだよね。

貴子:そうよ。そうすれば,Webサーバーが待ち受けているポート番号80番にアクセスするはずよ。前回の実験で確認したでしょう。

宇田:ではキャプチャするよ。

貴子:どう?

宇田:うまくキャプチャできたみたいだよ。あれ? SYNって何のことなんだろう。

 WebアクセスはTCPを使う。TCPではデータ通信に先立って,コネクションを確立する。コネクションとは,上りと下りの双方向通信が可能な論理的な通信路のこと。このTCPコネクションを確立するために,図3のように3個のパケットをやりとりする。

 最初はTCPヘッダーに用意されている制御フラグ領域のSYN(シン)という部分が1になったパケットをクライアントが送る。これは,「上り方向の通信路を確立して下さい」という意味だ。

 これを受け取ったWebサーバーは,SYNとACK(アック)の領域が1になったパケットを返信する。これはクライアントからの確立要求に対してACKフラグを1にすることによって許可することを伝えるとともに,サーバーからクライアントへの通信路(下り方向)の確立を要求している。つまり,「OKです。こちらからの通信路も確立して下さい」という意味である。

 そして,最後にクライアントがACKフラグを1にしたパケットをサーバーへ送ることで両方向の仮想通信路が確立する。この三つのパケットのやりとりは,3ウエイ・ハンドシェークと呼ばれる。

貴子:TCPの3ウエイ・ハンドシェークって,礼儀正しいのね。

宇田:どういうこと?

貴子:「つないで下さい。OKです,こちらからもお願いします」なんて具合にきちんとあいさつを交わしているからよ。

宇田:そう言えばそうだね。じゃあ,そのあとのパケットも見てみよう。