HTTPって結局なんなのか
HTTPとは
プロトコルです。っていう答えが返ってくると思うのですが、、
リクエスト、レスポンスがあって、ヘッダがあって、ボディがあって、、まー、そういうのは知ってるんだけど通信的にどういうものなのかっていうところ。
答え
ただのTCPの電文です。
通信相手(HTTPサーバ)と接続した後にやりとりするTCPの電文を特定のフォーマット(HTTP)で送信(HTTPリクエスト)すると、相手がその内容に対応した応答(HTTPレスポンス)の電文を返している、っていうだけの話。
試してみる
試してみましょう。qiita.comの80番ポートに接続して手動で電文を送ってみます。
TCP通信するクライアントとして、teratermを使います。
※linux使ってる人はncコマンドで良いと思います。
※teratermをTCPクライアントとして使うのは↓の解説が分かりやすいです。
http://docs.olab.org/resource/teraterm.pdf
接続完了してもteraterm側で特に反応はないので、繋がっていると信じてそのまま↓の電文を手打ちで入力(=HTTPリクエスト)します。
GET / HTTP/1.1
Host: qiita.com
[空改行]
https://qiita.com へリダイレクトさせるための応答電文(=HTTPレスポンス)が返ってくるはず。
ここまでの一連の操作で、http://qiita.com:80 にGETのリクエストを投げてる、のとイコールになります。
ちなみにHTTPを無視した適当な電文を送信すると、400 BadRequest が返ってきます。
80ポートで接続待ちしているのはHTTPサーバなわけで、HTTPに従ってない電文が来ても処理できないって事ですね。
つまり
GETだろうがPOSTだろうが、ファイルのアップロードだろうが、何なんだろうが、TCPの電文のやりとりをしているだけなのですね。
ということで、以上でした。
余談
考えを広げてみると、自分で独自に電文のフォーマットを規定して、その電文が来た時にパースして何かするようなものを作れば、独自プロトコルも自由に作れるってことですね。