HTTP(HyperText Transfer Protocol)とは、ハイパーテキストを送受信するため、WWWサーバーで使われる通信規約である。
WebブラウザとWebサーバ間で、HTMLファイルなどの文書や動画などのファイルを転送するために用いられている。
概要
HTTPはその名の通り、HTMLやXMLなどのハイパーテキストを送受信とすることを目的としているが、画像や音声、動画などのバイナリデータも送受信することが出来る。
HTTPはリクエスト-レスポンス型のプロトコルである。クライアントがサーバーにリクエストを送信すると、サーバーがクライアントにレスポンスを返す。詳しくはHTTPステータスコードの一覧を参照のこと。
HTTPはTCP/IPプロトコル群の一つである。その歴史は古く、以下の通り、IETFにて規格化されている。
時期 | HTTP/0.9 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
---|---|---|---|---|---|
1991年8月 | 初期定義 | 策定前 | 策定前 | 策定前 | |
1996年5月 | RFC1945 | ||||
1997年1月 | RFC2068 | ||||
1999年7月 | RFC2616 | ||||
2014年6月 | RFC7230 RFC7231 RFC7232 RFC7233 RFC7234 RFC7235 |
RFC7540 | |||
2022年6月 | RFC9110 RFC9111 RFC9112 |
RFC9110 RFC9111 RFC9113 |
RFC9110 RFC9111 RFC9114 |
ただし、HTTP/0.9は規格ではない点に注意。早い話がHTTP/1.0より昔のHTTPという意味でしかないためである。
HTTPのデフォルトのポート番号は80番で、HTTP/1.0・HTTP/1.1・HTTP/2はTCPを用いている。HTTP/3はUDPで、その上にQUICという仕組みを使ってデータのやりとりを用いている。
HTTPにTLS(SSLの後継)によるデータの暗号化機能を付与した物がHTTPS(Hypertext Transfer Protocol Secure)である。
なんで「https://」からHTTPのURLは始まるのか
URLは以下のような構造になっている(必要な部分のみ抜粋)。
- URL = {以下のいずれか}[?クエリー][#フラグメント]
- 特別スキーム = ftp もしくは file もしくは gopher もしくは http もしくは https もしくは ws もしくは wss
- スキーム相対特別URL = //ホスト[:ポート][パス絶対URL]
HTTPと対応する「http」「https」は特別スキームであるため、HTTPのURLは「https://」から始まるのである。
具体的なやりとり
具体的には、以下のようなやりとりがなされることになる。今回は、localhost(自分のコンピュータ)に立っているHTTPサーバに対して、/hogehoge.txtを要求した場合の流れを説明する。
GET /hogehoge.txt HTTP/1.1
Host: localhost
Connection: close
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 8
Connection: close
Fugafuga
なお、リクエストは空行で終わる点に注意せよ。で、この意味は以下の通りである。
- リクエストの1行目で「何のメソッドで」「何を」「どのHTTPのバージョンで」リクエストするかを規定する。今回は「GETメソッドで」「/hogehoge.txtを」「HTTP/1.1で」リクエストしている。
- リクエストの2行目でHostヘッダーを送信している。HTTP/1.1以降では、このHostヘッダーは必須である。これにより、マルチドメインのサーバであっても、各ドメインに応じたコンテンツを提供できる。今回は、localhostというホスト名を指定している。
- リクエストの3行目のConnectionヘッダーは、わかりやすく言えば、この後コネクションをどうしたいかの意思表示である。closeと指定しているので、このリクエストが終わったら、コネクションは終了する。
- リクエストの4行目は空行で、これはリクエストヘッダーの終わりを意味する。GETメソッドではリクエストペイロードを持たないため、これがリクエストの終わりである。
- レスポンスの1行目は「どのHTTPバージョンで」返答するかと、「ステータスはどのようになったか」である。今回は「HTTP/1.1で」「リクエストが正常に受理され、正常に完了した(200 OK)」という意味になる
- レスポンスの2行目はContent-Typeヘッダーを返している。これは「このコンテンツがどのような形式か」を意味し、text/plainはプレーンテキストを意味する
- レスポンスの3行目のContent-Lengthヘッダーは、レスポンス本文の長さである。8ということは8バイトである
- レスポンスの4行目のConnectionヘッダーは、リクエストと同じ意味である。おそらくレスポンスの後にTCPコネクションの終了を行うだろう
- レスポンスの5行目の空行を持って、レスポンスヘッダーが終わる。その後はレスポンス本文である
基本的にHTTPはステートレスであり、そのままでは会員のログインなどの管理ができない。これらを実現するためにCookieという技術を用いる。あと、大昔はこんな感じで1コネクション1リクエスト1レスポンスのやりとりをやっていたが、今はKeep-Aliveなどにより、1コネクションで複数リクエスト複数レスポンス捌けるようになっている。
関連動画
関連項目
親記事
子記事
兄弟記事
- 9
- 0pt