情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

サーバサイドウェブ開発基礎 HTTP詳説 HTTPとは

HTTPとは

HTTPとはHypertext Transfer Protocolの略称であり、情報を管理するコンピュータと情報に対する処理を要求するコンピュータが何らかのネットワーク上で通信するためのプロトコルの1つです。

HTTPにおいては情報を管理するコンピュータをサーバと言い、情報に対する処理を要求するコンピュータをクライアントと言います。

また、情報のことをリソースと言い、何らかの形式を使ってリソースを表したものをリプリゼンテーション表現)と言います。

リソースはURIURL)によって識別されます。また、リソースのリプリゼンテーションのデータの種類はメディアタイプMIMEタイプ)によって表されます。

クライアントサーバ間の通信はサーバがクライアントからの接続を待ち受け(サーバのデフォルトのポート番号は80です)、クライアントが通信を開始しようとする際にサーバへの接続を試み、接続を確立することによって行われます。

接続が確立したら、通信により、クライアントはサーバに対してリソースに対する何らかの処理を要求し、サーバはその要求に対して何らかの形で応答します(要求を拒否することもできます)。

リソースに対する処理としては主に取得新規作成変更削除などがあります。

クライアントからサーバへの要求はHTTPリクエストというメッセージで表され、サーバからクライアントへの応答はHTTPレスポンスというメッセージで表されます。

つまり、クライアントがサーバに対してリソースに対する処理を要求する場合にはクライアントサーバ間の接続が確立した後でHTTPリクエストを作成し、サーバに向けて送信します。そして、サーバはHTTPリクエストを受け取るとその内容に従ってリソースに対する処理を行い、HTTPリクエストに対する応答としてHTTPレスポンスを作成し、クライアントに向けて送信します。

1つのHTTPリクエストに対するHTTPレスポンスは1つであることが多いですが、2つ以上となることもあります

また、一旦クライアントサーバ間の接続が確立すれば何回でもHTTPリクエストやHTTPレスポンスのやり取りを行うことができます

なお、クライアントからサーバに向かう方向をインバウンドと言い、サーバからクライアントに向かう方向をアウトバウンドと言います。つまり、HTTPリクエストはインバウンドに向かって流れ、HTTPレスポンスはアウトバウンドに向かって流れます。

また、メッセージの送信が行われる側を上流アップストリーム)と言い、受信が行われる側を下流ダウンストリーム)と言います。つまり、HTTPリクエストやHTTPレスポンスなどのメッセージは上流から下流に向かって流れます。

HTTPの特徴

HTTPには下のような特徴があります。

  • 拡張性・・・HTTPは様々な拡張性を備えており、HTTPプロトコル自体を改訂しなくても様々な新しい機能を追加することができます。
  • プロキシ・・・クライアントサーバ間の通信はプロキシを介して行うこともできます。
  • キャッシュ・・・クライアントやプロキシはHTTPレスポンスをキャッシュしておくことができます。

HTTPのバージョン

HTTPのバージョンはHTTP/の後にメジャーバージョンとマイナーバージョンを.で結合したものを続けることによって表します。HTTPの部分は必ず大文字でなければなりませんので注意してください

現在HTTPには下のようなバージョンがあります。

  • HTTP/1.0
  • HTTP/1.1
  • HTTP/2.0

現在最もよく使われているのはHTTP/1.1です。

この記事もHTTP/1.1の解説を行います

HTTPリクエスト

HTTPリクエストは下のような構成要素から成ります。

  • メソッド
  • リクエストターゲット
  • バージョン
  • ヘッダ
  • ボディ

HTTPリクエストの1行目はメソッドとリクエストターゲットとバージョンを順番に1文字の空白で区切って並べたものであり、2行目以降にヘッダとボディを順番に記述します。ヘッダとボディの間には1つの空行を入れます。

改行はキャリッジリターンとラインフィードで行います(キャリッジリターンとラインフィードを順番に続けることによって行います)。

メソッドとはHTTPリクエストの種類を表すものです。メソッドは大文字と小文字が区別されます。メソッドには主に下のようなものがあります。

  • GET
  • HEAD
  • POST
  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE

メソッドの詳細に関しては下の記事を参照してください。

ヘッダは0個以上のヘッダフィールドから成り、ヘッダフィールドはフィールド名と:とフィールドの値と改行を順番に並べたものです。ただし、:とフィールドの値の間には空白を入れても構いません。

ヘッダフィールドの詳細に関しては下の記事を参照してください。

ボディにはリソースに対する処理に必要なデータを格納します。処理に必要なデータが存在しない場合にはボディは含めません。ボディは全ての種類のHTTPリクエストに含めることができます。

リクエストターゲットはHostヘッダフィールドと併せてリソースのURIを指定するために使用します。

URIの指定方法には下のようなものがあります。

  • オリジン形式
  • 絶対形式

クライアントがプロキシを通さないでHTTPリクエストを送信する場合にはオリジン形式を使用します。オリジン形式ではリクエストターゲットにリソースのURIのパス部分とクエリ部分を指定し、Hostヘッダフィールドの値にホスト部分とポート部分を指定します。

クライアントがプロキシを通してHTTPリクエストを送信する場合には絶対形式を使用します。絶対形式ではリクエストターゲットにリソースのURI全体を指定し、Hostヘッダフィールドの値にホスト部分とポート部分を指定します。

なお、HostヘッダフィールドはリソースのURIを表す重要なヘッダフィールドであるためHTTPリクエストにおける最初のヘッダフィールドとすべきです

なお、HTTPリクエストの1行目をリクエスト行と言います。

HTTPレスポンス

HTTPレスポンスは下のような構成要素から成ります。

  • バージョン
  • ステータスコード
  • 説明句
  • ヘッダ
  • ボディ

HTTPレスポンスの1行目はバージョンとステータスコードと説明句を順番に1文字の空白で区切って並べたものであり、2行目以降にヘッダとボディを順番に記述します。ヘッダとボディの間には1つの空行を入れます。

改行はキャリッジリターンとラインフィードで行います。

ステータスコードとはHTTPレスポンスの種類を表す3桁の数値です。

説明句とはステータスコードに対する説明です。

ステータスコードと説明句には下のようなものがあります。

  • 100・・・Continue
  • 101・・・Switching Protocols
  • 200・・・OK
  • 201・・・Created
  • 202・・・Accepted
  • 203・・・Non-Authoritative Information
  • 204・・・No Content
  • 205・・・Reset Content
  • 206・・・Partial Content
  • 300・・・Multiple Choices
  • 301・・・Moved Permanently
  • 302・・・Found
  • 303・・・See Other
  • 304・・・Not Modified
  • 305・・・Use Proxy
  • 307・・・Temporary Redirect
  • 400・・・Bad Request
  • 401・・・Unauthorized
  • 402・・・Payment Required
  • 403・・・Forbidden
  • 404・・・Not Found
  • 405・・・Method Not Allowed
  • 406・・・Not Acceptable
  • 407・・・Proxy Authentication Required
  • 408・・・Request Timeout
  • 409・・・Conflict
  • 410・・・Gone
  • 411・・・Length Required
  • 412・・・Precondition Failed
  • 413・・・Payload Too Large
  • 414・・・URI Too Long
  • 415・・・Unsupported Media Type
  • 416・・・Range Not Satisfiable
  • 417・・・Expectation Failed
  • 426・・・Upgrade Required
  • 500・・・Internal Server Error
  • 501・・・Not Implemented
  • 502・・・Bad Gateway
  • 503・・・Service Unavailable
  • 504・・・Gateway Timeout
  • 505・・・HTTP Version Not Supported

ステータスコードの詳細に関しては下の記事を参照してください。

ヘッダは0個以上のヘッダフィールドから成り、ヘッダフィールドはフィールド名と:とフィールドの値と改行を順番に並べたものです。ただし、:とフィールドの値の間には空白を入れても構いません。

ヘッダフィールドの詳細に関しては下の記事を参照してください。

ボディにはリソースに対する処理の結果を表すデータを格納します。ただし、ボディは全ての種類のHTTPレスポンスに含めることができる訳ではありません

具体的には、下のような種類のHTTPレスポンスにはボディを含めることができません。

  • メソッドがHEADのHTTPリクエストに対するHTTPレスポンス
  • ステータスコードが1から始まるHTTPレスポンス
  • ステータスコードが204No Content)のHTTPレスポンス
  • ステータスコードが304Not Modified)のHTTPレスポンス
  • メソッドがCONNECTのHTTPリクエストに対するステータスコードが2から始まるHTTPレスポンス

なお、HTTPレスポンスの1行目をステータス行と言います。

使用できる文字

ヘッダフィールドの名称に使用できるのは英数字と下の文字のみです。

  • !
  • #
  • $
  • %
  • &
  • '
  • *
  • +
  • -
  • .
  • ^
  • _
  • ```
  • |
  • ~

ヘッダフィールドの値に使用できるのは英数字と下の文字のみです。

  • !
  • #
  • $
  • %
  • &
  • '
  • *
  • +
  • -
  • .
  • ^
  • _
  • ```
  • |
  • ~

ただし、空白と水平タブと下の文字に関しては値全体を"で囲むことによって使用することができます。

  • (
  • )
  • ,
  • /
  • :
  • ;
  • <
  • =
  • >
  • ?
  • @
  • [
  • ]
  • {
  • }
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-http, web