HTTPを知る
文 :
佐久間 浩彰
Write :
Hiroaki Sakuma
概要
現在,コンピュータといえばネットワークに繋がっており,相互に通信を行っています.この通信の要となるのが,TCP/IPという仕組みです.
TCP/IPでは,アドレス(IPアドレス)とポートという2つの情報を使って,接続先と通信します.IPアドレスは,マシン毎に割り振られており,これを参照する事で接続先のマシンを特定します.ポートは,そのマシン上で動作する様々なアプリケーションの中で,接続先のアプリケーションを特定します.
IPアドレスは,IPv4であれば,
192.168.1.2 のような8ビット掛ける4の32ビットで表されます.このマシン上では,メールの送受信を行うSMTPサービスやIMAPサービスを提供するメールデーモン,管理のためのSSHデーモン,Webサイトを配信するHTTPデーモンなどが動作しています.自分が使いたいサービスが動作するポートを指定することで,異なるデーモンが同時に動作していても正常にサービスを受けられるようになっています.
ポートとサービス
通常,どのポートでどんなサービスが動いているかは,マシン管理者の設定によるので,マシン管理者に尋ねるしかありません.しかし,広く一般に使われるサービスでは,予め取り決めを行うことで,わざわざマシン管理者に聞く必要が無いようになっています.
特に,1~1023ポートはwell-knownポート(ウェルノウン・ポート)と呼ばれ,基本的にほとんどのマシンで同じになっています.ポートとサービスの関係のヒントは,/etc/servicesに記載されています.
代表的なwell-knownポートを使うサービスに以下のものがあります.
21 : ftp(ファイルの送受信)
22 : ssh(マシン管理)
23 : telnet(マシン管理)
25 : smtp(メール)
43 : nicname(whois)
53 : domain(DNS)
80 : http(www)
110 : pop3(メールの取得)
123 : ntp(時刻あわせ)
143 : imap(メールアクセス)
194 : irc(IRC)
443 : https(HTTP over SSL)
465 : smtps(SMTP over SSL)
993 : imaps(IMAP over SSL)
995 : pop3s(POP3 over SSL
もちろん,これ以外にもサービスはありますし,well-knownポート以外でも,慣習的に決まっているポートがあります.
HTTPとは
HTTPはHyper Text Transfer Protocolの略で,訳するとハイパーテキスト転送プロトコルとなります.ハイパーテキストとは,ハイパーリンクを用いたテキストの事です.ハイパーリンクとは,クリックすることで他のページへ切り替わる仕組み(リンクする)のことです.
現在では,ハイパーテキストとしてHTMLが広く使われています.
プロトコル名ではハイパーテキストの転送用となっていますが,実際にはハイパーテキストを用いた仕組みであるwww(World Wide Web)を実現するためのプロトコルとなっており,Webページの要素である画像なども転送しています.
ブラウザの動作
普段,我々はwwwにアクセスする手段として,ブラウザを用います.一種のwwwクライアントです.
Webサイトにアクセスする際,ブラウザはどのように動いているのでしょうか?
まず,ユーザがアドレスバーにアクセスしたいサイトのURLを入力します.例えば,
http://www.bitcoffee.com/jp/ とします.
ブラウザは,まずこのURLの構造を解析します.URLの先頭(
:(コロン) まで)が,
http となっているので,プロトコルはHTTPと分かります.接続先のホスト名(
//(ダブルスラッシュ) から始まる文字列)は,
www.bitcoffee.com ということが分かります.パス(取得,閲覧したいファイル.
/(スラッシュ) から始まる文字列)は
/jp/ と分かります.
次にブラウザは,resolver(リゾルバ)というライブラリを用いて,接続先のホスト名のIPアドレスを求めます.ここでは詳細を割愛しますが,
210.167.148.200 ということが分かります.
接続先はIPアドレスが
210.167.148.200 であり,ポートが
80 と分かるため,ブラウザは,
210.167.148.200 の
80 ポートに対して接続します.
接続に成功すると,接続先のマシンで動作しているHTTPデーモンと通信ができるので,リクエストを送ります.今回は,パスが
/jp/ となっていますので,これをリクエストとして送ります.
リクエストを送ると,HTTPデーモンからレスポンスが返ってくるので,これをユーザが読みやすい形で描画(レンダリング)します.
ブラウザになりましょう
自分がブラウザになったつもりで,実際に通信してみましょう.ここでは,リゾルバとしてdigコマンド(nslookupなどでも代用できます),通信クライアントとしてtelnetを用います.
telnetクライアントは本来,telnetというプロトコルのためのクライアントですが,とてもシンプルなプロトコルのため,TCP/IPの低レベルなプロトコルを手動でシミュレートする際によく用いられます.
太字で示したところは実際に入力するアドレスです.[CRLF]は改行のことで,リターンキーを押すことを示しています.
まず,ホスト名からIPアドレスを求めます.
kakuo@TOJO /home/kakuo% dig A www.bitcoffee.com[CRLF]
; <<>> DiG 9.3.1 <<>> A www.bitcoffee.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9018
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;www.bitcoffee.com. IN A
;; ANSWER SECTION:
www.bitcoffee.com. 10 IN A 210.167.148.200
;; AUTHORITY SECTION:
bitcoffee.com. 9719 IN NS ns2.bitcoffee.net.
bitcoffee.com. 9719 IN NS ns1.bitcoffee.net.
;; Query time: 13 msec
;; SERVER: 203.141.128.34#53(203.141.128.34)
;; WHEN: Tue Feb 21 19:06:51 2006
;; MSG SIZE rcvd: 100
次に,telnetで接続してみます.
kakuo@TOJO /home/kakuo% telnet[CRLF]
telnet> open 210.167.148.200 80[CRLF]
Trying 210.167.148.200...
Connected to 210.167.148.200.
Escape character is '^]'.
GET /jp/ HTTP/1.1[CRLF]
Host: www.bitcoffee.com[CRLF]
[CRLF]
HTTP/1.1 200 OK
Date: Tue, 21 Feb 2006 19:09:04 GMT
Server: Apache/2.0.55 (FreeBSD)
Last-Modified: Sat, 18 Feb 2006 09:48:23 GMT
ETag: "6050d4-14fa-8ff8e7c0"
Accept-Ranges: bytes
Content-Length: 5370
Content-Type: text/html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/T
R/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
GETから続く3行がリクエストです.これは
GET というリクエストで,リクエストしたい内容は,パスが
/jp/ で,バージョンとして
HTTP/1.1 を使うことを意味しています.
次に,送っている
Host は
HTTP/1.1 で必須となり,リクエスト先のホスト名を送ります.
空行を送る事で,リクエストの終わりを示します.
その後に続く行がレスポンスで,接続先ホストのHTTPデーモンが返してくる内容です.
HTTP/1.1から始まる8行がHTTPヘッダと呼ばれ,多くのブラウザはユーザに見せませんが,このHTTPヘッダの内容を見てファイルの種類を識別したり,その他Cookieの設定などHTTPデーモンとのやり取りの情報として使います.
空行の後が実際のファイル内容で,多くのブラウザではページのソースとして見れるようになっている事があります.ブラウザはこの内容を解釈してレンダリングを行います.
レスポンスは長くなるので省略してあります.