コース目次 / 第1章

HTTPを、覗いて、手で話す

自分のPCにHTTPサーバーを立て、curl -vでリクエスト/レスポンスの生の形を見ます。ncで同じリクエストを手打ちし、HTTPが特別な仕組みではなく、ただのテキストのやり取りだと確認します。

第1章 / 全4章目安 約12分この章のゴール: curl -vとncで、HTTPの生のやり取りを見て・手で再現できるようになる

観察対象を、立てる

mkdir site && echo "hello from server" > site/index.html
cd site && python3 -m http.server 8080 --bind 127.0.0.1

127.0.0.1:8080に、ごく単純なHTTPサーバーが立ちました。

curl -vで、生のやり取りを見る

別のターミナルから。

curl -v http://127.0.0.1:8080/
* Trying 127.0.0.1:8080...
* Connected to 127.0.0.1 (127.0.0.1) port 8080
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.0 200 OK
< Server: SimpleHTTP/0.6 Python/3.11.15
< Content-type: text/html
< Content-Length: 18
<
hello from server

>で始まる行が送ったリクエスト、<で始まる行が受け取ったレスポンスです。-v(verbose)は、curlが裏でやり取りしている生のHTTPメッセージをそのまま見せてくれます。

ncで、同じものを手で打つ

curlがやっていることは、実はただのテキストを送っているだけです。nc(netcat)で、同じリクエストを手で組み立てて送ってみます。

printf 'GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n' | nc 127.0.0.1 8080
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.11.15
Content-type: text/html
Content-Length: 18

hello from server

curlを使わなくても、まったく同じ応答が返ってきました。HTTPは、決まったルールに従って書かれたテキストの手紙です。GET / HTTP/1.1で始まり、ヘッダーの後に空行(\r\n\r\n)を挟む——このルールさえ守れば、どんなツールからでも会話できます。sec-httpで扱った内容が、ここでも同じ形で現れています。

サーバーは、次の章でも使うので止めずに残しておいてください。

こうなっていればOK

卒業まであと2章です。

この章はまだ完了していません。