【図解&実践】HTTP入門 HTTPの仕組み・シーケンスを自宅PC(telnet)で確認・理解する

IP通信の代表格、Webサーバのサイト閲覧に関するHTTP通信の流れを見ていきます。

DNSによる名前解決

PCはまずDNSによる名前解決を行います。例えばwww.yahoo.co.jpへアクセスしたいとき、PCに設定されているDNSサーバに対してwww.yahoo.co.jpのIPアドレスを問い合わせます。DNSサーバは社内限定のものもあれば、インターネット上で公開されているものもあります。8.8.8.8というのはGoogleが無償で提供している有名なDNSサーバです。DNSについてはこちらを参照下さい。

TCPコネクション確立

次に、www.yahoo.co.jpのIPアドレスに対して、TCPコネクションを確立します。まずはTCP synパケットをPCからWebサーバへ送り、WebサーバからはTCP syn/ackパケットを返します。そしてPCからTCP ackパケットを送ります。これでコネクション成立となります。このやり取りをスリーウェイハンドシェイクと呼びます。

http GETメソッドによるhtmlファイル要求

PCはTCP ackを送ったら相手の反応を待たず、PCからサーバへhttp GETメソッドの通信を行います。GETメソッドはサーバからファイルをダウンロードする命令です。

例えばTCPのペイロードの最初にASCII文字で

GET / HTTP/1.0

という文字列から始まる、http規格に則った文章を送ります。

/の後には本来/index.htmlなどの要求するファイル名が入るのですが、たいていのサイトは/だけ要求すれば、サーバ側でデフォルト設定されているファイルを返すようになっています。

HTTP/1.0 は HTTPのバージョン1.0 による要求という意味です。

なお、見出しでは「htmlファイル要求」としていますが、実際にはtxtでもpdfでもzipでもwmvでも、ファイルの種類は何であっても要求可能ですし、何でもダウンロード可能です。

HTTPステータスコードと要求したファイルの送信

上記要求をするとサーバからPCへ

HTTP/1.1 200 OK

という文字列と共に、要求したファイルが送られてきます(『HTTP/1.0 200 OK』と返ってくる場合もありますが、サーバ側の環境に依ります。つまりHTTPのバージョンは行きと帰りで、別のバージョンでも構いません)。

この時、ファイルサイズが例えば1460Byte以上のMSS値に収まりきらない量の通信が必要な場合は、サーバのOSがTCPセグメンテーションにより分割して複数パケットにして送ります。(IPのフラグメンテーションではなく、TCPセグメンテーション

200 は HTTP の GET メソッドが成功したことを意味する、ステータスコードです。

telnetでパケットの流れを把握する

http通信は通常はブラウザを使って行いますが、telnet を使って行うこともできます。例えば windows7/8/10にtelnetクライアントを追加し(30秒でできる、telnetクライアント機能を追加する方法はこちら)、コマンドプロンプトで以下を打つと分かり易いです。(TeraTermで同様の手順を試してもOKです)

telnet milestone-of-se.nesuke.com 80

で接続した後(milestone-of-se.nesuke.com を DNS で名前解決し、そのIPアドレスへ TCP 80番ポートで接続する、という意味)、

GET /http.txt HTTP/1.0
Host: milestone-of-se.nesuke.com

と打ち、(大文字小文字の区別をつけること。コピペでもOKです。)Enterを3回打つと、やはりASCII文字列で以下の画面が返ってくるはずです。

これは、Webサーバ上に「http.txt」というファイルを配置してあり、GETメソッドによりこのファイルをダウンロードしてきているのです。このファイルの具体的中身は最後のに2行のみです。それまでの『HTTP/1.1 200 OK ~ Accept-Ranges: bytes』の行は、HTTPヘッダです。

ブラウザで https://milestone-of-se.nesuke.com/http.txt にアクセスすると http.txtのファイルの実態が分かります。

また、この例で分かる通り、httpのバージョンは、クライアントとサーバで必ずしも合っている必要はありません。なお、入力する文字列を間違えると、milestone-of-se.nesuke.com のサイトは400 Bad Requestを返します。これは他のサイトでも大抵同じです。telnetが文字入力するたびに通信を送っているためです。つまり、1文字だけをTCPセグメントに乗せて送る、ということを繰り返し行っているのです。

このように、httpではASCII文字列で人間に理解しやすい形式で通信がなされています。このような通信は他にもSMTPFTPSIPなどがあります。

一方、DNSではパケットだけを見てもASCII文字列(人が理解しやすい形式)は無く、いわゆるバイナリ形式(人が理解しづらく、機械が処理しやすい形式)で通信を行います。何番目のbitがどのような意味か、というのがあらかじめ規格で決められているのです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする