雑多なブログ

音楽や語学、プログラム関連の話題について書いています

WIP: Webを支える技術 第3部 HTTPのまとめ

Webを支える技術 第3部 HTTPのまとめ

第6章 HTTPの基本

HTTPはTCP/IPをベースにしたプロトコル

6.1 HTTPの重要性

HTTPはRFC2616で規定されたプロトコル
多様なデータを転送する用途で利用される、Webの基盤となるプロトコルである。

6.2 TCP/IPとは何か

HTTPはTCP/IPをベースにしている。

  • TCP (Transmission Control Protocol)
  • IP (Internet Protocol)

インターネットのネットワークプロトコルは階層型プロトコル

アプリケーション層 : HTTP, NTP, SSH, SMTP, DNS
トランスポート層   : UDP, TCP
インターネット層            : IP
ネットワークインターフェース層: イーサネット

ネットワーク層

物理的なケーブルやネットワークアダプターに相当

インターネット層

ネットワークでデータをやりとりする部分に相当。TCP/IPのIPの部分。

IP

  • データの通信単位を「パケット」と呼ぶ。
  • 指定したIPアドレスを送り先として、パケット単位でデータをやりとりする。
  • 自分のネットワークインターフェースで、データを送信する事のみ保証している。
    ※送り出したデータが最終的な送り先まで届くかは無保証。

トランスポート層

IPが保証しないデータの転送を保証するのがトランスポート層
TCP/IPTCPに相当。

TCP
接続先にコネクションを張り、コネクションを利用してデータの抜け漏れをチェックしてデータ到達を保証。
TCPで接続したコネクションで転送するデータが、どのアプリケーションに渡るか決定するのがポート番号。

  • ポート番号は1〜65535の数値。
  • サーバ側のよく使われるポート番号にはデフォルトの番号が割り当てられている。
  • HTTPはデフォルトで80番ポートを使用する。

アプリケーション層

メールやDNS、HTTPなどのインターネットアプリケーション

ソケット
ネットワークでのデータのやりとりを抽象化したAPI
HTTPサーバやブラウザはソケットを用いて実装されている。

6.3 HTTPのバージョン

HTTP0.9
ヘッダはなく、HTTPメソッドもGETのみであった。
※研究段階で利用

HTTP1.0
HTTP最初の標準化。IETFで標準化が行われた最初のバージョン。
HTTP1.0の最初のドラフトは1993年に公開され、1996年に最終バージョン(RFC1945)が公開された。
※ブラウザ間の競争が激しい時期に仕様策定が行われていたため、仕様と実装に乖離が生じた。

RFC1945はInternet StandardではなくInformational (インターネット全体に周知が必要な情報)として公開された。

HTTP1.1
HTTPの完成。最初のバージョンは、RFC2068として1997年に策定。 その後改訂が行われ、1999年にRFC2616が策定(現在のHTTP1.1の仕様)。

HTTP1.1で追加された機能

※HTTP1.1の策定以降も、議論は続けられているがHTTPの仕様そのものは変わっていない。
※2008年頃から、HTTP1.1仕様の完成度を高める活動も始まっている(HTTP Bis)。

6.4 クライアントとサーバ

Webはアーキテクチャスタイルに、クライアント/サーバを採用。

6.5 リクエストとレスポンス

HTTPではクライアントが出したリクエストをサーバで処理してレスポンスを返す。
このようなプロトコルを、リクエスト/レスポンス型のプロトコルと呼ぶ。

クライアント側で行われる事

  1. リクエストメッセージを組み立てて、サーバーにリクエストメッセージを送信
  2. サーバーからのレスポンスメッセージを受信・解析
  3. 各種アプリケーションに沿った処理を実行(ブラウザであればhtmlのレンダリングやjsの実行など)。

サーバー側で行われる事

  1. クライアントからのリクエストを受信・解析
  2. 適切なプログラムに処理を移譲
  3. プログラムの処理結果を取得
  4. レスポンスメッセージを組み立てて、クライアントにレスポンスメッセージを送信

6.6 HTTPメッセージ

リクエストメッセージ

https://example.com/test に対する最小限のリクエストは下記のようなものになる。

GET /test HTTP/1.1
Host: example.com

1行目はリクエストラインであり下記要素で構成されている。

リクエストラインには、URIフラグメントを除いたパス以降の文字が入る。
リクエスURIは、パス以降の文字か、URLスキームを含む絶対URIのいずれかが指定される。

ヘッダ
リクエストメッセージの2行目以降はヘッダ。
1つのメッセージの中に、複数のヘッダを持つ事ができる。
ヘッダは「名前: 値」の形式で表される。

ボディ リソースの更新や作成を行う場合など、何らかリソースの情報を送信する場合は
ヘッダの後に、ボディ部分にリソースの情報が入る。

レスポンスメッセージ

http://example.com へのリクエストが成功すると、サーバはレスポンスをクライアントに返す。

HTTP/1.1 200 OK
Content-Type: application/xhtml+xml; charset=utf-8

<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>

ステータスライン
レスポンスメッセージの1行目は、ステータスラインと呼ばれ次の要素から構成される。

ステータスコードは、リクエストの結果をプログラムで処理可能な数値コードで表現する。 例ではリクエストが成功したことを示す 200 となっている。

ヘッダ
レスポンスメッセージ2行目以降は、リクエストメッセージと同様にヘッダである。

ボディ
ヘッダとボディは、空行(ヘッダ最終行末尾のCRLFに連続するCRLFで区切られる)

6.7 HTTPのステートレス性

HTTPはステートレス

第7章 HTTPメソッド

7.1 8つしかないメソッド

HTTPメソッドは8種類

GET ... リソースの取得 (CRUDのRにあたる)
POST ... リソースの作成、リソースへのデータ追加 (CRUDのCにあたる)
PUT ... リソースの更新、リソースの作成 (CRUDのC、もしくはUにあたる)
DELETE ... リソースの削除 (CRUDのDにあたる)
HEAD ... ヘッダ(メタデータ)の取得
OPTIONS ... リソースがサポートしているメソッドの取得
TRACE ... 自分宛にリクエストメッセージを返す(ループバック)試験
CONNECT ... プロキシ動作のトンネル接続への変更

7.9 POSTでPUT/DELETEを代用する方法

HTMLフォームで指定できるHTTPメソッドはGETとPOSTだけ。 PUT/DELETEメソッドを使用するために、hiddenタグやリクエストヘッダが利用される。

_methodパラメーター

<input type="hidden" name="_method" value="PUT"/>

リクエストヘッダにX-HTTP-Method-Overrideを指定

X-HTTP-Method-Override: PUT