よしかわーるど

プログラミングで世界を変える

HTTPについて学ぶ

この記事は、VOYAGE GROUPのサマーインターン、Treasure2018の修了生による

Treasure Advent Calendar 2018 25日目の記事です。


どうも、よしかわです。

今回はHTTPの歴史について少し触れていきたいと思います。

HTTPが出来てから30年近く経った現代に、どうWebを学習していくかを模索している僕のような若いエンジニアに読んでもらえるように必死に書きます。

どうぞ、最後までお付き合いいただければ光栄です。

対象読者

  • HTTPの理解をしたい人
  • Web サービスを開発している人
  • これからWebサービスを開発していきたい人

目次

はじめに

HTTPの歴史を話していく上で、いくつか便利なツールを紹介していきましょう。

curlという便利なツールを使うことにより、HTTPのメソッドを試すことが出来るので、この機会に導入してみましょう。

また、JSONを整形して表示したり集計したり、値を抜き取ったり出来るJSON用のgrepみたいなツールであるjqを導入しましょう。

詳しくは、以下のURLからどうぞ。

curlについて学ぶ

HTTPの歴史

HTTP/0.9 HTTP/1.0、HTTP/1.1、HTTP/2が存在します。

発表年 バージョン
1991年 HTTP/0.9
1996年 HTTP/1.0
1997年 HTTP/1.1
2015年 HTTP/2

余談ですがHTTP/3のドラフトが発表されましたので、興味のある方は見てみると良いかもしれません。

HTTP/0.9

最初のバージョンであるHTTP/0.9は、 GETメソッドしか 存在しませんでした。

HTTPヘッダーは存在しません。

HTTPステータスコードも存在しません。

応答は原則HTMLのみ。

とてもシンプルな設計です。

HTTP/1.0の設計を読めば、シンプルさが一目瞭然ですね。

それでは、HTTP/0.9がどんなものか試してみましょう。

ターミナルで以下のコマンドを実行します。

livedoorにアクセスしてみましょう。

echo -e "GET /\r\n" | nc livedoor.com 80

<html>
<body>
<h1>It lives!</h1>
</body>
</html>

Amazonにもアクセスしてみましょうか。

echo -e "GET /\r\n" | nc amazon.com 80

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>Server</center>
</body>
</html>

HTMLのみしか返ってきません。これがHTTP/0.9です。

それでは、HTTP/1.0では、どんな機能が追加されていくのでしょうか。

予測してみましょう。僕ならドキュメントを1つではなく複数個送る機能がほしいです。

あとは、ドキュメントの更新などもしたいし、クライアント側からのリクエストを明確に知りたいですね。

HTTP/1.0

上記の僕の欲しい機能がHTTP/1.0には搭載しています。

HTTP/1.0で、GET以外に POSTやHEADメソッド が利用できるようになりました。

リクエスト時にHTTPバージョンが追加されました。

ヘッダーが表示されるようになりました。

例えを以下に記述しましたので、見てみましょう。

curlコマンドに、-v(もしくは --verbose)というオプションを追加して実行してみましょう。詳細な情報が表示されます。

HTTPSならTLS handshakeの様子等が出力されますが、今回は省略します。

curl -v https://yoshikawa.dev

~~~~~~~~
認証まわり
~~~~~~~~

> GET / HTTP/1.1
> Host: yoshikawataiki.net
> User-Agent: curl/7.63.0
> Accept: */*
>
< HTTP/1.1 200 OK

GETメソッドでHTTPのバージョンはHTTP1.1。(今回はバージョンが1.0ではないの大目に見てほしい)

ヘッダーはHost、User-Agent、Accept。

レスポンスの先頭にHTTPバージョンと3桁のステータスコードが含まれるようになりました。

HTTP/1.1

HTTP/1.0で目覚ましい進化をしましたが、欠点があります。それは、TCP/IPの1回のコネクションで1回のやり取りしか行なえませんでした。

HTTP/1.1では通信の高速化を図るために追加されたKeep-Aliveという機能。

また、TLSによる暗号化通信のサポート。

PUTやDELETE、PATCHなどのメソッドの追加。

ただ、HTTP/1.1だと1つのコネクションで何回もやり取りが出来るものの、その中では1つのリクエストが完了するまで次のリクエストが送れません。

例えば、1枚目の画像をダウンロードし終わったら、2枚目の画像のダウンロードが再開し、ダウンロードし終わったら、3枚目の画像のダウンロードが始まる。100枚あれば、どれくらい待たなければならないのか考えるだけで苦ですね。

HTTP/2

HTTP/1.1でネックだった、バイナリデータを多重に送受信する仕組みに変更。

また、HTTP/2では ヘッダーが圧縮される ようになりました。

僕のようなサイトでは、バイナリデータがあまりないので、HTTP/2の恩恵を受けれないので、画像まとめサイトとかだと重要な技術になってくるわけですね。

かなり多機能になったHTTPの歴史はまだまだ続きますが、一旦メソッドの紹介をしたいと思います。

メソッド

メソッド名 説明
GET リソースの取得
POST リソースの新規登録
PUT 既存のリソースの更新
DELETE リソースの削除
PATCH リソースの一部変更
HEAD リソースのメタ情報の取得

ヘッダー

curlコマンドを使ってヘッダーを送ってみましょう。

curlについて学ぶにも書いてありますが、こちらにも記載します。

まず以下のURLからリポジトリをクローンしてください。

Golangで書かれているため、配置ディレクトリに気をつけてください。

https://github.com/yoshikawataiki/simple-api

git clone git@github.com:yoshikawataiki/simple-api.git

それではワークディレクトリをsimple-apiにして、以下のコマンドを実行します。

Dockerが起動していることが前提ですので、ご了承を。

  1. make docker/start
  2. make api/init
  3. make migrate/init
  4. make migrate/up
  5. make run

ではcurlコマンドでPOSTしてみましょう。

JSONを見やすくするために、| jqをつけています。

curl -X POST -H "Content-Type:application/json" -d '{"name":"yoshikawa","email":"yoshikawa@hoge.com"}' localhost:8080/users | jq

上記の-H "Content-Type:application/json"について説明します。

curlコマンドのオプションである-H--headerの省略でヘッダーを指定出来ます。

今回は、Content-Typeでjsonを指定しています。

ボディ

ヘッダーとの間に空行を挟んで、それ以降がすべてボディになります。

curl -I https://yoshikawa.dev
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Date: Mon, 24 Dec 2018 18:19:38 GMT
Content-Length: 16247

Content-Length: 16247が実際のボディの長さです。

ステータスコード

Treasure Advent Calendar 2018 24日目の記事でりょーたろーが書いてくれましたので、端折ります。

Status Codeを下ネタで返すサーバーを書きました。

そういえば、今年の夏のインターンで分かりやすく紹介されていました。

さいごに

僕より何年も人生の先輩であるHTTPについてまとめました。

ここに書いたのはあくまでも一部であって、とても奥深いです。

参考文献はとてもタメになるので、僕みたいなエンジニア志望の学生にはおすすめです!

それでは、良いクリスマスを!!

そして、VOYAGE GROUPのサマーインターン、Treasure2018の修了生でアドベントカレンダー記事を書いたみんな、お疲れ様でした!

Treasure Advent Calendar 2018はマジで面白い記事ばかりなので、必見!

本当に最高のインターンだった(余韻)

参考文献

渋川よしき著『Real World HTTP』(オライリー・ジャパン発行)

山本陽平著『Webを支える技術―― HTTP,URI,HTML,そしてREST』(技術評論社発行)