HTTP の基礎

HTTP ってなに?http://…..com とかいう感じで URL の前の方についている印象しかないですよね。

ここで Wikipedia で HTTP で検索してみると、

Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロトコル、略称 HTTP)とは、HTML などのコンテンツの送受信に用いられる通信プロトコルである。主として World Wide Web において、Web ブラウザと Web サーバとの間での転送に用いられる。日本標準仕様書ではハイパテキスト転送プロトコルとも呼ばれる。

HTTP/1.1 が RFC 7230 から RFC 7235 で規定されている。かつては RFC 2616 が HTTP/1.1 を規定していたため、こちらもよく参照されている。また、HTTP/2 が RFC 7540 で規定されている。

https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol

って感じて正直専門用語が多くて正直よくわからない。。。

HTTP とは

HTTP(Hypertext Transfer Protocol)とは、ハイパーテキストというリソースを転送(トランスファー)するための方法(プロトコル)です。

これでも、あまりよくわかりませんよね。

もっと噛み砕いて言うと、HTTP とは「Web サーバクライアントがデータをやり取りする通信手段」のことを意味しています。

例えると、JOJOHACK(=Web サーバ)を読者(=クライアント)が見るためのパソコン間のデータのやりとりをするための通信方法です。

http://….com の「http」という方法でデータを転送しますよーということを表していたのです。

他にも FTP などといった通信方法もありますが、Web における通信方法は現在ではこの HTTP が主流となっています。

転送できるデータ

一昔前はハイパーテキストと言われるテキストデータしか通信することができませんでした。

しかし、現在ではこの HTTP を使って送ることができるデータは、

  • ハイパーテキスト
  • 静止画
  • 音声
  • 動画  etc.. などさまざまです。

つまり、データであるのであれば、ほぼなんでも送ることができるのです。

HTTP の特徴

REST という概念に準じでつくられたというのが特徴です。

REST とは、

Representational State Transfer (REST) は、ウェブのような分散ハイパーメディアシステムのためのソフトウェアアーキテクチャのスタイルのひとつである。この語は 2000 年に、HTTP プロトコル規格の主要著者の一人である en:Roy Fielding が、ウェブについて書いた博士論文で初めて現れ、ネットワーキングコミュニティの中ですぐに広く使われることになった。

REST は、初めはアーキテクチャの原則と制約の集まり(後述)を指していたが、次第に、XML や HTTP を使った簡易なウェブベースのインタフェースのうち、Web サービスの SOAP プロトコルのような MEP(Message Exchange Pattern; SOAP ノード相互のメッセージ交換のパターンを確立するための雛型)ベースの特別な抽象化をしないもののことを、大まかに意味する用語として使われるようになった。

https://ja.wikipedia.org/wiki/Representational_State_Transfer

といったようにような小難しいけどめちゃめちゃ大切な Web のアーキテクチャスタイルです。

これについてはまた別記事で詳しく説明しますが、簡単にいると以下にシンプルかつ汎用性の高い仕組みを作るかということを考え抜かれて作られた設計思想です。

今回は、簡単に大切なキーワードだけ挙げておきます。

キーワード内容
クライアント・サーバクライアント側とサーバー側で処理を分離する
ステートレス性サーバー側でアプリケーションの状態を保持しない
キャッシュクライアント側でデータを保持して通信回数を減らす
統一インターフェイスインターフェースを固定する
階層化システムシステムを階層に分離する
コードオンデマンドプログラムをクライアントにダウンロードして実行する

以下ではクライアント・サーバとステートレス性の 2 つ絞って解説します。

HTTPとは

リクエストとレスポンス

クライアントとサーバの間での通信にはこのような流れがあります。

リクエストとレスポンス

HTTP がリクエストメッセージを構築・送信する

まず、どんなことを、どこのサイトへどのような通信形式を使って行うのかということをサーバーへ伝えるためのメッセージをクライアントはつくります。

例えば、Google で「JOJOHACK」と検索するとき、「JOJOHACK」というキーワードやそれを「HTTP」という通信で送るよーという情報が入ったメッセージをつくります。

そして、そのメッセージをクライアントに送ります。

HTTP メッセージの詳しい説明は後で行います。

サーバーがリクエストメッセージを受信・解析する

サーバーはメッセージを受信して、どんな情報が含まれていたのかを解析します。

アプリケーションプログラムへの処理の委託

その後、サーバーは解析結果から、Google のサーバーから「JOJOHACK」という検索結果にふさわしい情報をデータベースや Google のアルゴリズムから導き出すように委託します。

レスポンスメッセージを構築する

そして、正しい検索結果を取得して検索結果画面を HTML や CSS を使って作っていきます。

それらの情報をまとめてレスポンスメッセージに構築します。

レスポンスメッセージを送信する

クライアントがレスポンスメッセージを受信する レスポンスメッセージを解析する

HTTP メッセージ

では、そのリクエストメッセージとレスポンスメッセージにはどのような情報が含まれているのでしょうか。

両メッセージとも構造は、スタートライン・ヘッダ・ボディとなっています。

リクエストメッセージの構造

スタートラインには、メソッド+URI+プロトコルバージョンが記させています。

例えば、

GET https://engineer-traver.hatenablog.com/ HTTP/1.1

といったような感じです。

ヘッダには、データのタイプや文字コーディング方式などを記します。

ボディは補足情報を記し、POST 送信時にクエリを添付したりします。

レスポンスメッセージの構造

スタートラインには、プロトコルバージョン+ステータスコード+テキストフレーズが記させています。

例えば、

HTTP/1.1 200 OK

といったような感じです。

ヘッダには、リクエスト同様データのタイプや文字コーディング方式などを記します。

ボディは取得した全データ、つまり HTML ファイルなどが添付されます。

HTTPメッセージ

HTTP のバージョン

HTTP は現在 ver1.1 が主流です。

HTTPのバージョン1 HTTPのバージョン2