HTTPを知る

文 :
Write :

概要

現在,コンピュータといえばネットワークに繋がっており,相互に通信を行っています.この通信の要となるのが,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.20080ポートに対して接続します.
接続に成功すると,接続先のマシンで動作している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を使うことを意味しています.
次に,送っているHostHTTP/1.1で必須となり,リクエスト先のホスト名を送ります.
空行を送る事で,リクエストの終わりを示します.
その後に続く行がレスポンスで,接続先ホストのHTTPデーモンが返してくる内容です.
HTTP/1.1から始まる8行がHTTPヘッダと呼ばれ,多くのブラウザはユーザに見せませんが,このHTTPヘッダの内容を見てファイルの種類を識別したり,その他Cookieの設定などHTTPデーモンとのやり取りの情報として使います.
空行の後が実際のファイル内容で,多くのブラウザではページのソースとして見れるようになっている事があります.ブラウザはこの内容を解釈してレンダリングを行います.
レスポンスは長くなるので省略してあります.
Welcome spammers. If you are spammer, please mail to honeypot@bitcoffee.com. Thanks your spam!!