SlideShare uma empresa Scribd logo
1 de 26
Baixar para ler offline
HTTP を肌で感じる
2017/09/29 ランチタイム勉強会小原一哉
今日話すこと
HTTP (Hypertext Transfer Protocol)
(HTTP/2 は話しません)
肌で感じるためのデモの方法
2
思い立った経緯
以前、挙動がややこしいBFCache (Back‑Forward Cache) の挙動
確認のための検証用コードをに書いた
検証用コードのためにミニマルにHTTP サーバーとレスポンスヘッ
ダ―を操作できるシステムが必要だった
→ シェルスクリプトとnc コマンドを利用
コレ、教育目的にかなりいいのでは?(要検証)
3
思い至った経緯(本音)
資料作り込む時間無いしデモで乗り切るんや!
4
はいぱーてきすととらんふぁー ぷろとこる
5
HTTP
Hypertext Transfer Protocol とは、HTMLなどのコンテンツの送受
信に用いられる通信プロトコルである。主としてWorld Wide Web
において、WebブラウザとWebサーバとの間での転送に用いられ
る。
‑‑ Wikipedia より
利用用途が拡大して、ブラウザ以外による通信にも利用されることが増
えましたね。
6
では、実際のHTTP はどんなプロトコルなのか
Wikipedia 記載のHTTP/1.0 のリクエスト
GET /index.html HTTP/1.0
これをnc コマンドで投げる
7
(補足: nc コマンドとは)
もしくは netcat 
任意のTCP/UDP コネクションの接続要求、受け付けができる
8
HTTP リクエストしてみる
$ docker container run ‐d ‐‐name http‐nc‐demo 
> ‐p 8080:80 nginx:stable‐alpine  # デモ用 HTTP サーバー
$ nc localhost 8080
localhost のTCP 8080 にHTTP サーバーを立ち上げる(手段不問)
 nc でlocalhost のTCP 8080 に接続
TCP が確立し、ターミナルへの入力が送信内容となる
HTTP はテキストベースのプロトコルなので、手入力で通信を記述で
きる!
9
これを入力してみる
GET /index.html HTTP/1.0
(改行を忘れずに)
レスポンスが端末に表示される
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 26 Sep 2017 23:31:19 GMT
Content‐Type: text/html
Content‐Length: 612
Last‐Modified: Wed, 19 Oct 2016 17:15:39 GMT
Connection: close
ETag: "5807aa3b‐264"
Accept‐Ranges: bytes
<!DOCTYPE html>
(以下略)
10
HTTP リクエストの解説
GET /index.html HTTP/1.0
最後の空行: HTTP は以下の構造となるため
リクエストライン: 先頭行
 GET : メソッド( GET / POST / HEAD など)
 /index.html : リクエストURI
(http://example.com /example.html ← この部分)
 HTTP/1.0 : HTTP バージョン
ヘッダー部(何行でも) : 今回は空
空行
Body 部: 今回は空
11
HTTP レスポンスの解説
HTTP/1.1 200 OK
Server: nginx/1.10.2
(中略)
Accept‐Ranges: bytes
<!DOCTYPE html>
(以下略)
ステータスライン: 先頭行
 HTTP/1.1 : HTTP バージョン
 200 : ステータスコード
 OK : 説明句(任意のテキスト)
ヘッダー部(何行でも) :  Server: ... や Accept‐... など
空行
Body 部:  <!DOCTYPE html>... 
12
HTTP レスポンスしてみる
$ nc ‐l 8081
localhost のTCP 8081 にHTTP サーバーを立ち上げる(by  nc )
Web ブラウザでlocalhost の8081 にアクセス
TCP が確立し、ターミナルへの入力が送信内容となる
ブラウザ側がタイムアウトする前にレスポンスを打ち込む!
13
リクエストが表示される
GET / HTTP/1.1
Host: localhost:8081
Connection: keep‐alive
(以下略)
これを入力してみる
HTTP/1.0 200 Ok
<!doctype html>
<p>Hello</p>
(Ctrl‑D で入力を終端)
ブラウザの画面が表示される
14
素晴らしい!!!
15
ここまで
HTTP とは何かを知った
HTTP レスポンス/リクエストの簡単なフォーマットを知った
自由にHTTP リクエストor レスポンスを作る手段を手に入れた
16
ここから
時間の許す限りデモ
17
(入力と出力を色分けする)
$ nc localhost 8080 | sed ‐E 's/.*/^[[33m&^[[0m/'
18
Connection: Keep‑Alive
TCP 接続を切らずに、後続のHTTP リクエスト/レスポンスを伝送する
HTTP/1.1 ではデフォルトで接続が持続する
切りたいときは Connection: close を指定する
19
$ nc localhost 8080
GET / HTTP/1.1
Host: localhost
(HTTP/1.1 ではHost ヘッダーは必須)
HTTP/1.1 200 OK
Server: nginx/1.10.2
(以下略)
レスポンスが帰ってくるが、 nc は終了しない
→ 再度、リクエスト・レスポンス
( Connection: close を付ける場合も試す)
20
302 リダイレクト
ステータスコード302 を返すと同時に、
Location ヘッダーで指定先にリダイレクトさせることができる
21
以下の内容をresponse1 として保存
HTTP/1.1 302 Found
Connection: close
Location: http://www.google.com
 nc にパイプで流す
(上記内容を手で端末に打ち込んだのと同じこと)
$ cat response1 | nc ‐l 8081
ブラウザからアクセスしてみる
22
Content‑Encoding: gzip
Body 部をデコード方法を示す
23
以下の内容を返すだけのサーバー
HTTP/1.1 200 Ok
Connection: close
<!doctype html>
<p>It's nc server!</p>
response2 として保存
以下を起動して、ブラウザからアクセスしてみる
$ cat response2 | nc ‐l 8081
$ open http://localhost:8081
24
response2 をgzip 圧縮
$ gzip ‐c response2 > response2.gz
gzip 用のヘッダーを作成
HTTP/1.1 200 Ok
Connection: close
Content‐Encoding: gzip
response3 として保存
Body 部(gzip データ) を結合
$ cat response2.gz >> response3
以下を起動して、ブラウザからアクセスしてみる
$ cat response3 | nc ‐l 8081
$ open http://localhost:8081
25
感想
検証/説明用のミニマルな実装として nc は非常にオススメ
教育目的に使うにはシェルの理解が前提となってしまうため微妙
肌で感じると愛着が湧く
26

Mais conteúdo relacionado

Semelhante a HTTP を肌で感じる (9)

HTTP入門
HTTP入門HTTP入門
HTTP入門
 
Rtshell入門
Rtshell入門Rtshell入門
Rtshell入門
 
Status 425 HTTP/Tokyo
Status 425 HTTP/Tokyo Status 425 HTTP/Tokyo
Status 425 HTTP/Tokyo
 
HPKP Supercookies (公開鍵ピンニングによるユーザ追跡)
HPKP Supercookies (公開鍵ピンニングによるユーザ追跡)HPKP Supercookies (公開鍵ピンニングによるユーザ追跡)
HPKP Supercookies (公開鍵ピンニングによるユーザ追跡)
 
Webページが表示されるまで
Webページが表示されるまでWebページが表示されるまで
Webページが表示されるまで
 
Php s1
Php s1Php s1
Php s1
 
System s1
System s1System s1
System s1
 
HHVM on CentOS6 本番運用のうまみとつらみ
HHVM on CentOS6 本番運用のうまみとつらみHHVM on CentOS6 本番運用のうまみとつらみ
HHVM on CentOS6 本番運用のうまみとつらみ
 
Web基礎
Web基礎Web基礎
Web基礎
 

HTTP を肌で感じる