HTTPプロトコルの喋り方

こまつ みつのり(Mitsunori Komatsu) 2007-09-06 16:01:42

このご時世、Web上のコンテンツから情報を得たり、Webサービスを利用することが日常生活の一部になっている人が多いかと思います。このblogを読んでくださっている方々の場合、Webアプリの開発に携わっている人も結構多いのではないかなぁ、と勝手に想像しております。

私もこれまでの経験上、Webアプリ開発者の方と一緒にお仕事をしたりしてきたのですが、実はちょっと気になっていたことがあります。それは「どうやってWebクライアントとサーバーがお話しているか判らない」、具体的には「HTTPプロトコルの通信がイメージできていない」人が意外と多いなぁ、ということです。

#もちろん、ほとんどの方は判っていると思います。「意外と」です…

Webアプリのフレームワークの知識があるけれど、具体的に「どんな情報をやりとりしているか?」について、イメージが曖昧な状態、とでも言いますか…

私はそんな時いつも、「面白いのにもったいないなぁ」って思ってしまいます。

そう。通信のやりとりに触れるのは面白いんです。Webブラウザー/サーバーのブラックボックスにしておくのはもったいないです。

ということで初歩的な実験ですが、手書きHTTPプロトコル。やってみましょう。

今回は手元のFreeBSDから試してみます。手元にWindowsマシンしかない場合は、コマンドプロンプトから試せると思います(文字化けがあるかもしれませんが)。

使用するのはtelnetコマンドです。「あれ?HTTPプロトコルの話なのに何でtelnet?」と思われるかも知れませんが、簡単に言ってしまうと、telnetコマンドはTCPの電文を送信してその応答を受信するプログラムです。telnetサーバープログラム用標準の23番ポートがデフォルトのポートとなっていますが、ポート番号は引数で指定できますので今回80番を指定します。

$ telnet yahoo.co.jp 80

Trying 203.216.227.176...

Connected to yahoo.co.jp.

Escape character is '^]'

ここで、必要最小限のHTTPリクエストをたたきます(最後の行は改行のみ)。ちなみにHTTPプロトコルはRFC2616に定められていますので、詳細が知りたくなったら、そちらを参照してみると良いでしょう(どこかに日本語訳もあると思います)。

GET / HTTP/1.1

Host: yahoo.co.jp

すると、HTTPレスポンスヘッダーが返ってきて…

HTTP/1.1 200 OK

Date: Thu, 06 Sep 2007 07:22:39 GMT

P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"

Expires: -1

Pragma: no-cache

Cache-Control: no-cache

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html; charset=euc-jp

続いて、HTTPレスポンスが大量に返ってきます。

何だかYahooのWebサーバーと会話しているような気になってきて楽しいですねぇ(私だけ?)。FirefoxやIEなどのWebブラウザーは、上記のようにHTTPリクエストをWebサーバーに送信し、返ってきたHTTPレスポンスを整形してウィンドウに表示しているんですね。

今度はGoogleさんとお話してみましょう。

$ telnet google.co.jp 80

Trying 72.14.235.104...

Connected to google.co.jp.

Escape character is '^]'.

GET / HTTP/1.1

Host: google.co.jp

HTTP/1.1 301 Moved Permanently

Location: http://www.google.co.jp/

Set-Cookie: PREF=ID=356b93a852cb3782:TM=1189064373:LM=1189064373:S=S19u1e90joV8B1V9; expires=Sat, 05-Sep-2009 07:39:33 GMT; path=/; domain=.google.com

Content-Type: text/html

Server: GWS/2.1

Content-Length: 221

Date: Thu, 06 Sep 2007 07:39:33 GMT

あれ?ステータスコードが200ではなく、301ですねぇ。

「Location: http://www.google.co.jp/」からするとwww.google.co.jpへのリダイレクトを促しているようです。ということで、今度はwww.google.co.jpに向けてHTTPリクエストを送ってみると…

$ telnet www.google.co.jp 80

Trying 66.249.89.147...

Connected to www.l.google.com.

Escape character is '^]'.

GET / HTTP/1.1

Host: www.google.co.jp

HTTP/1.1 200 OK

Cache-Control: private

Content-Type: text/html; charset=Shift_JIS

Set-Cookie: PREF=ID=3ddc3769f6dd6f95:TM=1189064588:LM=1189064588:S=BMvnG2w8ReZBBp7W; expires=Sat, 05-Sep-2009 07:43:08 GMT; path=/; domain=.google.co.jp

Server: GWS/2.1

Transfer-Encoding: chunked

Date: Thu, 06 Sep 2007 07:43:08 GMT

うまくいきました。Webブラウザーはこっそりリダイレクトを行ってくれているので普段はなかなか気がつかないですね。Firefoxをお使いの場合は、Live HTTP Headers等のアドオンを入れておくと気軽に観察できますのでお勧めです。HTTPヘッダー観察中毒になってください。

こんな感じで今回は、普段目に見えないHTTPプロトコルさん(もう妖精さん扱い)を手書きしてみましたが、その他にも、SMTPプロトコルさん、POP3プロトコルさんなどたくさんのプロトコルさん達が目に見えないところで頑張っています(/etc/servicesに名簿が載っています)。他のプロトコルさんについても、今後ちょくちょく紹介していけたらなぁ、って思います。

追 記

元タイトルは「Webコンテンツへのアクセス」となっていましたが、変更しました。

※このエントリはZDNetブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet編集部の見解・意向を示すものではありません。

SpecialPR