学習日記

学習記録

HTTPって何なのさ?

HTTP(Hyper Text Transfer Protocol)とはプロトコルである

今日はHTTPとは何なのかについて纏めてみたいと思います。

結論からいうとHTTPっていうのは表題にもある通り、プロトコルです。

プロトコルとは何なのでしょうか?

Webページ(例えば今貴方が見ているこのページも)を開くときにブラウザがWebサーバーに対してコンテンツを要求します、それに対してWebサーバーは要求されたコンテンツをブラウザに対して送信します。

これを人間対人間のやりとりとして考えてみて欲しいのですが、面識のないA君とB君が会話をすることになりました、事前の取り決めは何もありません。

これではA君とB君がしゃべる言語が違った場合、話したい話題が違った場合に話が通じませんよね?

人間同士であればよしなに会話をすることも出来るかもしれませんが、コンピューター同士だと会話が通じなくてエラーを起こしてしまう訳です。

そこでこの言語を使って会話しようねー、会話する順番はこうしようねーっていう取り決めを作ることにしました、このように通信の際の約束事を決めたものがプロトコルと呼ばれます。

HTTPもプロトコルの1種であり、ハイパーテキストの通信をする際の約束事をまとめたものです。

URLの意味

実際のHTTP通信の話に入る前に少しURLの話をしようと思います。

HTTP通信で利用者の私たちがサーバー側に対してコンテンツを要求する際にはURLを利用して、このコンテンツをくれと要求を出すわけです。

http://example.com/test.html を例にとって話を進めていきます。

httpの部分でプロトコルexample.comの部分でサーバーを test.htmlの部分でファイルを指定しています。

httpというプロトコルexample.comというサーバーからtest.htmlというファイル(コンテンツ)をくださいー!という要求が http://example.com/test.html の正体なんですね。

HTTPによる通信

ここからは実際にHTTP通信を行ってみて、どのような通信が行われているのかを見ていきたいと思います。

今回はtelnetを使って通信してみたいと思います

telnet example.com 80で接続を確立したあと、リクエストを送ります

まずは接続を確立させます。

ちなみにこのコマンドの意味は telnetexample.comサーバーの80番ポートに接続しますよ という意味です。

それではサーバーに接続できたところでコンテンツを要求しましょう

この要求作業こそがHTTPプロトコルを利用する部分です。

要求する際はプロトコルに従い、HTTPリクエストを送信します。

このHTTPリクエストはリクエスト行, メッセージヘッダー, 空白行, メッセージボディの4種で構成されます。

メッセージボディはサーバーにデータを送るために使われますが、今回は使用しません。

まずはリクエスト行を書いていきます

GET /test.html HTTP/1.1 今回書くリクエスト行は以上になります

このリクエスト行が何を意味しているかですが GETは要求する処理 /test.htmlは要求するファイル HTTP/1.1は使用するバージョンになります

GETは情報を取り出す要求なので、このリクエスト行では test.htmlってファイルをhttp1.1を使用してこっちにちょうだいー! という事を先ほど接続したexample.comサーバーに伝えています。

それでは次にメッセージヘッダーを書いていきます

Host: example.com 以上になります

ブラウザからリクエストを送る場合はもっと詳細な情報を送ってあげる必要があるのですが、telnet等を使用してCUI環境からリクエストを送る場合はメッセージヘッダーに書くべき情報も少ないことが多いです。

特に今回は1回限りのファイルを取得する要求ですので、なおさらですね。

さてこのメッセージヘッダーの意味ですが、

このリクエストはexample.comあてですよー、という意味になります。

あれ?最初にexample.comに接続したんだからその情報必要?と思うかもしれません。

これは1つのWebサーバーが複数のドメインをホストできるので、どのドメインに対して接続しているのかを明確にするために必要とされます。

ということで以上二つと、これでHTTPリクエストは終わりということを示すための空白行を送ってみます

とするとexample.comから返事が返ってきます

HTTP/1.1 404 Not Found
Age: 155613
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 03 Apr 2024 09:50:28 GMT
Expires: Wed, 10 Apr 2024 09:50:28 GMT
Last-Modified: Mon, 01 Apr 2024 14:36:55 GMT
Server: ECS (sac/251D)
Vary: Accept-Encoding
X-Cache: 404-HIT
Content-Length: 1256

<!doctype html>

省略

この返事がHTTPレスポンスとなります

ではどのようなことが書いてあるのか見ていきたいと思います

HTTPレスポンスも、HTTPリクエストと同じ4つの要素に分かれています

まず1行目のHTTP/1.1 404 Not Foundからいきましょう

この1行目はステータス行と呼ばれる処理の結果を伝える部分です

今回の結果で言えば HTTP1.1を使ったよ要求したコンテンツはなかったよ

という意味になります。

実はexample.com/test.htmlというファイルは存在しない、ということですね。

実際にやってみたらhtmlファイルが返ってきますが、これはドメイン側で404エラーだった場合に表示するhtmlを設定しているというだけです。

では次に2行目からのメッセージヘッダーをみていきます、ちなみに2行目以降の要素はリクエストの時と同じ名前です。

行ごとに全て説明していると長くなってしまうので、どんな情報が渡されているのかを全体的にお伝えしたいと思います。

このメッセージが作られた日付、ファイルのエンコード方法、キャッシュの有効期限、ファイルの容量等が格納されています

そしてリクエストの時と同じ空白行があり、メッセージボディとなります。

当然サーバーは要求したファイルがあれば返してくれるので、返ってきたデータはメッセージボディに格納されています。

以上がHTTP通信の中身になります。

終わりに

いかがだったでしょうか?

別にtelnetなんて使わないし、こんなの知ったところでどうするんだよーと思われたかもしれません。

ですが皆さんが普段よく使っているブラウザでも、実はこのやりとりをしてその結果をブラウザが解釈して画面に表示してくれているんですね。

普段使っている物の中身を知るというのも、それはそれで面白かったのではないでしょうか?

それではこの辺で終わりにしたいと思います、ありがとうございました。