若手部員 宇田くん |
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です,こちらからもお願いします」なんて具合にきちんとあいさつを交わしているからよ。
宇田:そう言えばそうだね。じゃあ,そのあとのパケットも見てみよう。