🦔

HTTPとは何なのでしょうか?

2023/07/01に公開

はじめに

現在見てるこの記事はクライアントからサーバにHTTP通信をした結果です。
このHTTPは何なのでしょうか?

HTTP

HTTPについていつも通りWikipediaに検索してみました。
https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol

Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロトコル、HTTP)はアプリ間コネクション上のリクエスト/レスポンス型・ステートレス・メッセージ指向通信プロトコルである

HTTP(Hyper Text Transfer Protocol)としてHyperText文書間のリンクを通じて連結できるHTMLを転送するプロトコルです。HTTPを利用してWEBブラウザはWEBサーバからWEBページを検索できるし、データを転送することができます。
HTTPメッセージにHTMLTEXTImageJSONXMLAPIなど 大体のデータを入れて転送することができます。

ちなみに、開発者ツールのネットワークタブを開いてプロトコルを確認することができます。
見れない場合は右クリックをしてProtocolをクリックしてください。

HTTPの歴史

  • HTTP/0.9(1991年)
    • インターネットで原始データを転送するための簡単なプロトコルでした。GETメソッドだけ支援してHTTPヘッダはありませんでした。
  • HTTP/1.0(1996年)
    • プロトコルを機能を拡張して、メソッドとヘッダが追加されました。
  • HTTP/1.1(1997年)
    • 一番多く使われてるので、重要なバージョンです。
    • RFC2068(1997年)で最初に定義されて、RFC2616(1999年)に明確化されました。後年RFC7230 ~ 7235(2014年)に具体化されました。
  • HTTP/2(2015年)
    • 待機時間を減らして、性能が改善されました。
  • HTTP/3(2019年)
    • TCPを代わりにUDPを使用する転送階層プロトコルになるQUICを使って性能を改善させました。

HTTPの特徴

HTTPの特徴は下記になります。

  • クライアントとサーバ構造
  • ステートレスプロトコル
  • コネクションレス

クライアントとサーバ構造

HTTPはクライアントとサーバモデルを採用してます。クライアントとサーバモデルはサーバというリソースまたはサービスを提供する方とクライアントというサービスを要請する方を意味します。
クライアントは一般的にブラウザやWEBアプリケーションになって、リクエストという要請をサーバに送ります。
サーバは一般的にインターネットに繋がってるコンピューターになって、クライアントが送ったリクエストに対するレスポンスを応答します。

ここで重要なことは、サーバはクライアントのリクエストにレスポンスを送信したら、クライアントの情報をこれ以上保存しないことです。つまり、各リクエストは以前のリクエストと独立的に処理されることです。
このようにサーバがクライアントの情報、状態を保存しないことをステートレスだと言います。

ステートレスとステートフル

HTTPはステートレスという特徴があります。
ステートレスはクライアントの状態を保存しないこととステートフルはクライアントの状態を保存します。
例えば、カフェでコーヒーを注文するとしましょう。であれば、下記の順番になります。

  1. コーヒーを注文する。
  2. オプションでアイスを選ぶ。
  3. テイクアウトをお願いする。

ステートフル

ステートフルはサーバがクライアントの状態を保存するモデルです。
例えば、以下の画像を参考してください。

これは店員さん(サーバ)がお客さん(クライアント)の注文(状態)を覚えてくれた(保存)ので問題なく注文できました。
なので、クライアントは自分の状態をいちいち伝わなくても良いメリットがありました。
でも、注文途中、店員さんが変わったとしたら、どうなると思いますか?

注文途中店員さんが他の方に変更されたら、次の方はお客さんの注文を覚えてないため、注文ができないと思います。なぜなら、お客さんの詳細な注文内容は以前の店員さんが覚えてるからです。

ステートレス

ステートレスはサーバがクライアントの情報を保存しなくて、クライアントが毎リクエストに自分の状態を伝えるモデルです。
同じく以下の画像を参考してください。

これは店員さんがお客さんの注文を覚えてないため、お客さんが自分の状態を伝わないといけないです。なので、お客さんから伝える情報の量が増えますが、注文自体では問題ありません。
この時も同じく、注文途中店員さんが変わったとしましょう。

この場合は注文途中店員さんが他の方に変更されても、注文は問題なくできます。そもそも、お客さんが毎リクエストに自分の注文詳細を伝えてるからです。

ステートフルとステートレス整理

ステートフルの場合は注文途中店員さんが変わったら、注文情報を変わった店員に教えてあげないと注文ができませんでした。
ステートレスは注文途中店員さんが変わっても、そもそもお客さんから注文情報を毎回伝えるので、注文ができました。
お客さんをクライアント、店員さんをサーバだと考えて見ましょう。

例えば、クライアントとサーバが通信中元のサーバが動作できない場合ステートフルはサーバがクライアントの情報を保存してるため、他のサーバが代わりに処理することができません。これを解決するためにはサーバ間クライアントの情報を同期や共有する別の処理が必要です。

ステートレスの場合はどうでしょうか?
ステートレスの場合はクライアントから自分の詳細を伝えてくれるので、元のサーバが動作不可になっても処理を続くことができます。それと、サーバ間の同期や共有する処理もいらないです。

ステートレスの限界

このように話すとステートフルは良くないみたいです。でも、ステートフルはサーバが前の状態を保存するので、より効率的に使用者向けに設計することができます。それと、過去のやり取りを基板を持ってるため、個人化することができます。

ステートレスは独立するので、以前の情報がないです。なので個人化することが難しいです。そもそも、状態を一緒に送らないといけないため、転送するデータの量がステートフルより多いです。
それと全ての設計をステートレスに設計することも難しいです。

コネクションレス

コネクションレスを話す前にコネクションについて話したいと思います。
まずは、クライアントがリクエストを送るために、TCP/IPを使用してコネクションを構築します。TCP/IPに関しては下記の記事を参考してください。
https://zenn.dev/bellstone/articles/e5030014949425#tcp%2Fipパケットの情報
コネクションが構築されたらクライアントはリクエストを送ってサーバからのレスポンスを待ちます。
サーバからレスポンスをもらったら、コネクションを切ることをコネクションレス型、コネクションを維持することをコネクション型だと言います。

コネクション型

コネクション型の場合はTCP/IP連結後レスポンスが帰って来ても連結を維持します。なので、同一な連結を再使用すると、再連結するためリソース的にメリットがあったため性能的にも良いです。しかし、使用しない場合も連結を維持するため、サーバのリソースを占めてリソース不足や浪費が発生します。

コネクションレス型

コネクションレス型の場合はTCP/IP連結後レスポンスが帰って来ても連結を切ります。なので、連結の管理やモニタリングしなくても良いため、実装が簡単です。それとサーバのリソースを占めないため、リソース使用率としては良いです。しかし、毎連結に設定を改めて構築しないといけないので時間が掛かります。

HTTPの初期モデルと現在のモデル

HTTPの初期のバージョン(1.0)では基本的にコネクションを維持しないコネクションレス型でした。
なので、クライアントがサーバにHTMLをリクエストしてレスポンスが来たら、コネクションを切りました。
以降、HTMLに必要なCSSやJavaScriptファイルがあれば、またコネクションを開いてリクエストを送った後レスポンスが来たらコネクションを切りました。
上記ようにリソースを取得するために、毎回連結を構築するなら、にリソースが掛かって性能が良くないです。HTMLはイメージ、JavaScript、CSSなど数多いことで構成されてるからです。
なので、現在は連結を一時維持するモデルを採用して各ページに対するリソース(HTML、CSS、JavaScriptなど)を取得するまでに連結を維持します。最初バージョンより連結を維持するためより多いサーバリソースを取得できます。
HTTP/2とHTTP/3ではもっと性能が改善されました。

HTTPメッセージ

HTTPメッセージが今まで話したリクエストとレスポンスになります。HTTPメッセージの構造はスタートライン、ヘッダー、Emptyライン、メッセージボディに構成されてます。
HTTPのリクエストメッセージはHTTPメソッド、パス、クエリパラメータ、HTTPバージョン、HOSTなどで構成されてます。
HTTPのレスポンスメッセージはHTTPバージョン、HTTP応答ステータス、ヘッダー、メッセージボディなどで構成されてます。

HTTPメソッドの種類

HTTPメソッドとしてはGETPOSTPUTPATCHDELETEなどがあります。
クライアントとサーバがやり取りする時にクライアントから求めるサーバの動作を指定する役割です。
例えば、GETの場合はリソースを照会する時に使うし、POSTの場合リクエストの内容を処理するために、DELTEの場合はリソースを削除する場合良く使います。
各メソッドの情報は下記のページを参考してください。
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods

HTTPヘッダー

HTTPヘッダーを使用してリクエストやレスポンスでクライアントやサーバが追加情報を転送することができます。
ヘッダーは、大文字小文字を区別しないヘッダー名とそれに続くコロン (:)、 値で構成されます。
ヘッダーは<html>以外のメタデータが含めて、メッセージボディの形式、メッセージボディのサイズ、圧縮、認証、クライアントの情報、サーバの情報、キャッシュ管理情報などが入ってます。
標準ヘッダーは下記のページを参考してください。
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers

まとめ

HTTPはクライアントーサーバーモデルを採用します。それとリクエストとレスポンスにHTTPメッセージを入れてやり取りして基本的に状態を維持しないステータレスです。
コネクションレスから始まったHTTPはコレクションレスの限界を解決するために、一時連結を維持するモデルに進化しました。やり取りする際に使うHTTPメッセージではヘッダー、メソッド、ステータスコード、ボディ、など色んな情報が入ってます。

次回はWEBを構成する重要なHTMLに関して勉強したいと思います。
今までの説明が皆さんにも分かりやすく説明できていればと嬉しいです。

Discussion