この用語をシェア
HTTP/1.1とは
HTTP/1.1(Hypertext Transfer Protocol version 1.1)は、1997年にRFC 2068として標準化され、1999年にRFC 2616で改訂されたWebの通信プロトコルです。HTTP/1.0の後継として開発され、Webブラウザとサーバー間でHTML文書、画像、動画などのリソースを転送するための規約を定義しています。その後2014年にRFC 7230〜7235として整理され、さらに2022年にはIETFのHTTPbisワーキンググループによってRFC 9110(HTTP Semantics)・RFC 9111(HTTP Caching)・RFC 9112(HTTP/1.1)という3分冊構成に再編されました。現行の正式な仕様書はこのRFC 9110/9112であり、旧RFC 2616は既に廃止(Obsolete)扱いですが、実務上は今も「HTTP/1.1」という名称と挙動そのものが変わらず使われ続けています。
HTTP/1.1はテキストベース(人が読める形式)のプロトコルという特徴を持ちます。リクエスト行・ヘッダー・空行・ボディという単純な構造のため、telnetやncコマンドで手打ちしても会話が成立するほど平易です。この「シンプルで読みやすい」という性質は、後述するHTTP/2・HTTP/3のバイナリプロトコルとの最も大きな違いであり、デバッグのしやすさという点で今なお評価されています。
HTTP/1.1の主な機能
HTTP/1.1は、HTTP/1.0から大幅な改良が加えられています。最も重要な機能として、持続的接続(Persistent Connection、Keep-Alive)があります。HTTP/1.0では原則としてリクエストごとにTCPコネクションを確立し、レスポンス後に切断していましたが、HTTP/1.1ではConnectionヘッダーを明示しない限り接続を維持するのがデフォルトの挙動になりました。これにより、1枚のHTMLページに付随する複数の画像・CSS・JavaScriptを取得する際も、TCPの3ウェイハンドシェイクとスロースタートを毎回やり直す必要がなくなり、体感速度が大きく向上しました。
持続的接続には実務上の細かな設定項目もあります。ApacheのKeepAliveTimeoutやnginxのkeepalive_timeoutのように、接続を何秒間維持するか、1接続あたり何リクエストまで許容するかはサーバー側の設定でチューニング可能です。タイムアウトを長く取りすぎるとサーバーの同時接続数(ワーカー数やファイルディスクリプタ)を圧迫し、短すぎると接続の再確立が頻発してレイテンシが悪化するため、アクセスパターンに応じたバランス調整が実務では重要になります。
パイプライン化
HTTP/1.1では、パイプライン化(HTTP Pipelining)が導入されました。これは、前のリクエストのレスポンスを待たずに次のリクエストを送信できる機能です。理論上は複数のリクエストを連続送信し、サーバー側は受信順にレスポンスを返す(FIFO)ことで待ち時間を削減できるはずでした。
しかし実際には、先頭のレスポンス生成が遅延すると後続のレスポンスもすべて待たされる「HTTPレベルのヘッドオブラインブロッキング」が発生しやすく、加えて透過型プロキシやロードバランサーの一部がパイプライン化に正しく対応していなかったため、実装上のバグや表示崩れの原因になりました。この結果、Google ChromeやSafariはパイプライン化を標準では有効化せず、Firefoxもnetwork.http.pipeliningという隠しオプションで実験的に提供するに留まりました。最終的にパイプライン化は主要ブラウザで広く使われることなく、この課題を根本的に解決するために設計されたのがHTTP/2の多重化(Multiplexing)です。
ホストヘッダー
HTTP/1.1では、Hostヘッダーが必須となりました。これにより、1つのIPアドレスで複数のドメインをホストする名前ベースの仮想ホスティング(Name-based Virtual Hosting)が可能になり、IPv4アドレスの枯渇が懸念される中でIPアドレスの効率的な活用が実現しました。例えば以下のようなリクエストでは、同じIPアドレス宛でもHostヘッダーの値によってWebサーバー(Apache・nginxなど)がバーチャルホスト設定を参照し、返すコンテンツを振り分けます。
GET /index.html HTTP/1.1
Host: shinichi.noguchi.jp.net
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
HTTPS通信においては、TLSハンドシェイクの段階で暗号化前にサーバー証明書を選択する必要があるため、Hostヘッダーだけでは不十分で、SNI(Server Name Indication)というTLS拡張が別途必要になります。「HostヘッダーがあればSNIは不要」という誤解も見られますが、両者はレイヤーが異なる(SNIはTLS層、HostヘッダーはHTTP層)別の仕組みである点に注意が必要です。
チャンク転送エンコーディング
チャンク転送エンコーディング(Chunked Transfer Encoding)により、コンテンツの全体サイズが事前にわからない場合でも、データを分割して送信できるようになりました。HTTP/1.0までは、レスポンスボディの長さをContent-Lengthヘッダーで事前に通知するのが基本でしたが、動的に生成されるコンテンツ(サーバーサイドで逐次生成されるログ出力やストリーミングレスポンスなど)では全体サイズが送信開始時点でわからないケースが多くあります。チャンク転送では、ボディを任意サイズの「チャンク」に分割し、各チャンクの先頭に16進数でそのチャンクのバイト数を書き、最後に0バイトのチャンクを送って終端を示します。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
0\r\n
\r\n
なお、Content-LengthとTransfer-Encoding: chunkedは本来同時に指定すべきではないヘッダーであり、この2つの解釈の食い違いを悪用する「HTTPリクエストスミグリング(HTTP Request Smuggling)」という攻撃手法が知られています。リバースプロキシとオリジンサーバーで解釈がずれると、フロント側とバック側で「どこまでが1つのリクエストか」の認識が食い違い、意図しないリクエストの混入を許してしまう問題です。プロキシ・ロードバランサーを挟む構成では、この点を意識した設定・監視が実務上のポイントになります。
キャッシュ制御
HTTP/1.1では、より洗練されたキャッシュ制御メカニズムが導入されました。代表的なヘッダーとその役割は次の通りです。
| ヘッダー | 役割 |
|---|---|
| Cache-Control | max-age(有効期限秒数)、no-cache(再検証必須)、no-store(保存禁止)、must-revalidate(期限切れ後は必ずサーバーに確認)など、キャッシュ方針を細かく指定 |
| ETag / If-None-Match | リソースのバージョンを表す識別子。次回リクエスト時にIf-None-Matchで送り、一致すれば304 Not Modifiedで本文転送を省略 |
| Last-Modified / If-Modified-Since | 更新日時ベースの簡易的な再検証。ETagより粒度が粗いが実装が軽量 |
| Expires | HTTP/1.0由来の絶対日時指定。Cache-Controlのmax-ageが優先されるため現在は補助的な位置づけ |
これらを組み合わせることで、CDNやブラウザキャッシュが「いつまで再取得せずに使ってよいか」「再取得時に本文を丸ごと送るべきか304で済ませるべきか」を判断できるようになり、帯域とレイテンシの両面で効率化が図られています。
具体例・ユースケース
HTTP/1.1は非常に基本的なプロトコルであるため、実は特別なツールがなくてもその通信を体感できます。例えば、以下のようにncコマンド(またはtelnet)でTCP接続を張り、手動でリクエスト行とHostヘッダーを入力するだけで、Webサーバーから生のHTTP/1.1レスポンスを受け取ることができます。
$ nc example.com 80
GET / HTTP/1.1
Host: example.com
Connection: close
実務でHTTP/1.1が主役として登場する代表的な場面は次の通りです。
- CDNとオリジンサーバー間の通信:Cloudflare、Amazon CloudFront、Fastlyなどの多くのCDNは、ブラウザとの間ではHTTP/2やHTTP/3で通信していても、背後のオリジンサーバー(実際にコンテンツを生成するアプリケーションサーバー)との接続はシンプルさと安定性を優先してHTTP/1.1のままというケースが多く見られます。
- 内部マイクロサービス間のREST API通信:社内システムやマイクロサービス間の通信では、gRPCのようなHTTP/2ベースの技術を使わず、あえてシンプルなJSON over HTTP/1.1のREST APIを採用するチームも少なくありません。curlでの疎通確認やWiresharkでのパケット解析が容易という「デバッグのしやすさ」が理由に挙げられます。
- 組み込み機器・IoTデバイス:メモリやCPUリソースが限られた組み込み機器では、HTTP/2のバイナリフレーミングやHPACK圧縮を実装するコストが見合わず、軽量なHTTP/1.1クライアントのみを搭載するケースが一般的です。
- 企業プロキシ・古いロードバランサー配下の環境:一部の企業ネットワークでは、プロキシやセキュリティ機器がHTTP/2のバイナリフレームを正しく解釈できず、通信がHTTP/1.1にフォールバックされることがあります。curlで
curl --http1.1 https://example.comのように明示的にバージョンを固定して検証するのは、こうした環境依存の問題を切り分ける定石の一つです。 - APIデバッグ・障害調査:HTTP/2やHTTP/3はバイナリ形式のため、Wiresharkなどでキャプチャしても人間がそのまま読むことはできません。障害調査でクライアントとサーバーのやり取りを目視確認したい場合、あえてHTTP/1.1に固定して通信させるのは今でも有効なデバッグ手法です。
HTTP/1.1の制限と課題
HTTP/1.1は長年にわたり活躍してきましたが、いくつかの構造的な制限があります。
- ヘッドオブラインブロッキング(Head-of-Line Blocking):1本のTCP接続では、あるリクエストへのレスポンス生成に時間がかかると、その後ろに並ぶリクエストの処理もすべて待たされます。パイプライン化が普及しなかったこともあり、ブラウザは代わりに「1オリジンあたり複数のTCP接続を並行して張る」という回避策を採りました。ただしRFC 2616では推奨上限が2接続とされていたため、現在の主要ブラウザは実装上おおむね6本前後の同時接続を1オリジンに対して張ることで並列度を稼いでいます。
- ヘッダーの非圧縮によるオーバーヘッド:Cookieや認証トークンなどでヘッダーサイズが大きくなりがちな昨今のWebアプリケーションでは、リクエストのたびに同じような冗長なヘッダー情報をテキストのまま送信することになり、特にモバイル回線など帯域が限られる環境で無視できないオーバーヘッドになります。
- サーバープッシュの不在:クライアントが要求していないリソース(CSSに付随する画像など)をサーバー側から能動的に送ることができず、必要なリソースはクライアントが1つずつ発見・要求する必要があります。
- ドメインシャーディングという副作用:接続数制限を回避するために、画像配信用に別サブドメインを用意する「ドメインシャーディング」という最適化テクニックが広まりましたが、これはDNS解決やTLSハンドシェイクの追加コストを生むトレードオフでもありました。
これらの課題を解決するために設計されたのがHTTP/2(多重化とヘッダー圧縮HPACK)であり、さらにTCP自体のヘッドオブラインブロッキングまで解消したのがQUICを使うHTTP/3です。
混同されやすい用語・類似技術との違い
HTTP/1.1は名前が似ているバージョンや後継プロトコルと混同されがちです。主な違いを整理します。
| 技術 | HTTP/1.1との違い |
|---|---|
| HTTP/1.0 | 接続はリクエストごとに切断されるのが基本。Hostヘッダーも必須ではなく仮想ホスティングが困難。HTTP/1.1はこれを持続的接続とHostヘッダー必須化で改善した後継 |
| HTTP/2 | テキストベースではなくバイナリフレーミングを採用し、1本のTCP接続上で複数リクエストを真に並行処理する多重化を実現。HPACKによるヘッダー圧縮も持つ。詳細はHTTP/2の用語ページを参照 |
| HTTP/3 | トランスポート層をTCPからUDPベースのQUICに変更し、TCPレベルのヘッドオブラインブロッキングまで解消。詳細はHTTP/3の用語ページを参照 |
| WebSocket | HTTP/1.1のリクエストをきっかけに101 Switching Protocolsでプロトコルを切り替え、以後は双方向・全二重の常時接続に移行する別プロトコル。1回のリクエスト・レスポンスで完結するHTTP/1.1とは通信モデルが根本的に異なる |
| パイプライン化 と 多重化(Multiplexing) | パイプライン化はリクエストを連続送信するだけでレスポンス順序はFIFOのまま(先頭がブロックされると全体が止まる)。HTTP/2以降の多重化はストリームIDでレスポンスを識別し、順不同で返せる点が本質的に異なる |
実務導入・運用のポイント
- サーバー設定の確認:nginxでは
listen 443 ssl;のみだとHTTP/1.1で待ち受け、http2 on;を追加するとHTTP/2が有効になります。意図せずHTTP/1.1のままになっていないか、設定ファイルを確認するのは基本的な棚卸し項目です。 - ロードバランサー配下でのプロトコル不一致:AWSのApplication Load BalancerなどではクライアントとのフロントエンドはHTTP/2で受け付けつつ、バックエンド(ターゲットグループ)との通信はHTTP/1.1で行う構成が一般的です。フロントとバックでプロトコルが異なることを前提に、ヘッダーサイズやKeep-Aliveのタイムアウト設定を両者で整合させる必要があります。
- Connectionヘッダーとhop-by-hopヘッダーの扱い:Connection、Keep-Alive、Transfer-Encodingなどは中継するプロキシごとに解釈・除去されるべきhop-by-hopヘッダーです。自前でリバースプロキシやAPIゲートウェイを実装する場合、これらのヘッダーをそのまま転送してしまうと予期しない挙動やスミグリングの原因になるため注意が必要です。
- デバッグ・切り分け手順:障害調査では、まず
curl -v --http1.1で生のヘッダーとステータスコードを確認し、次にブラウザの開発者ツールのNetworkタブでプロトコル列(http/1.1・h2・h3)を確認する、という順序が定石です。CDN経由の場合はCDNのエッジとオリジンで別々にプロトコルを確認する必要がある点も見落としがちです。 - セキュリティ上の考慮:Hostヘッダーインジェクション(アプリケーションがHostヘッダーの値を無条件に信頼してURL生成やキャッシュキーに使うことで起きる不正操作)やリクエストスミグリングは、HTTP/1.1のテキストベース・行区切りという仕様の緩さに起因する典型的な脆弱性クラスです。WAFやリバースプロキシの設定・アップデートを継続的に見直すことが実務上のポイントです。
2025〜2026年の最新動向
プロトコルとしてのHTTP/1.1自体は2022年のRFC 9110/9112への再編以降、大きな仕様変更は行われておらず、安定期に入っています。一方で利用のされ方には変化が続いています。公開Webサイトのフロントエンド(ブラウザとの通信)は、主要ブラウザとCDNの対応が進んだことでHTTP/2・HTTP/3への移行がさらに進んでおり、新規に構築されるサイトではHTTP/1.1がクライアント向けの既定プロトコルに選ばれる場面は少なくなりつつあります。
一方で、CDNやロードバランサーからオリジンサーバーまでの区間、社内向けAPI、レガシーな業務システム、組み込み機器・IoT向けの通信では、実装のシンプルさとデバッグのしやすさから、HTTP/1.1が今も現役の選択肢であり続けています。クラウドベンダー各社のマネージドロードバランサーやAPIゲートウェイでも、バックエンドとの接続プロトコルとしてHTTP/1.1がデフォルトまたは選択可能な設定として残されているのが一般的です。今後もHTTP/1.1が完全に姿を消すことは考えにくく、「フロントはHTTP/2・HTTP/3、内部はHTTP/1.1」という多層的な使い分けが実務上の標準的な構成として定着しつつあると言えます。
よくある質問(FAQ)
Q. HTTP/1.1とは何ですか
HTTP/1.1は、1997年にRFC 2068として標準化され、1999年にRFC 2616で改訂されたWeb通信の基盤プロトコルです。持続的接続・Hostヘッダー必須化・チャンク転送エンコーディングなどを導入し、2022年にはRFC 9110/9112として仕様が再編されました。テキストベースで人が読める構造のため、HTTP/2・HTTP/3以降のバイナリプロトコルと異なり、デバッグのしやすさが今も評価されています。
Q. HTTP/1.1とHTTP/2はどちらを使うべきですか
公開Webサイトのフロントエンド(ブラウザとの通信)では、多重化とヘッダー圧縮によりページ表示が高速になるHTTP/2(またはHTTP/3)を選ぶのが基本です。一方、CDNからオリジンサーバーまでの区間、社内API、組み込み機器などシンプルさやデバッグ容易性を優先したい場面では、あえてHTTP/1.1を使い続ける判断も実務では珍しくありません。
Q. HTTP/1.1はまだ安全に使えますか
プロトコル自体に致命的な欠陥があるわけではありませんが、リクエストスミグリングやHostヘッダーインジェクションなど、テキストベースゆえの解釈の曖昧さに起因する脆弱性クラスが知られています。TLS(HTTPS)で通信を暗号化すること、リバースプロキシ・WAF・Webサーバーを最新版に保つことが安全に運用する上での前提になります。
Q. なぜHTTP/1.1のパイプライン化は普及しなかったのですか
先頭のレスポンスが遅れると後続もすべて待たされるヘッドオブラインブロッキング問題を解消できず、加えて一部のプロキシがパイプライン化に正しく対応していなかったため、Chrome・Safariなど主要ブラウザは標準で有効化しませんでした。この課題を根本から解決する技術として設計されたのがHTTP/2の多重化です。
Q. 2025〜2026年のHTTP/1.1の位置づけはどう変わっていますか
プロトコル仕様自体は2022年のRFC 9110/9112以降大きな変更はなく安定しています。公開サイトのフロントエンドではHTTP/2・HTTP/3への移行がさらに進む一方、CDN・オリジン間通信や社内システム、組み込み機器の世界ではシンプルさを理由にHTTP/1.1が引き続き広く使われており、「フロントは新しいプロトコル、内部はHTTP/1.1」という使い分けが実務上の標準構成として定着しています。
Q. Keep-AliveとPersistent Connectionは同じものですか
HTTP/1.0時代の非標準拡張として登場した「Keep-Alive」という名称が、HTTP/1.1で標準化された持続的接続(Persistent Connection)を指す通称として今も広く使われています。仕組みとしてはほぼ同じ目的(TCP接続の再利用)を持ちますが、HTTP/1.1では持続的接続がデフォルトの挙動であり、明示的なKeep-Aliveヘッダーがなくても有効になる点がHTTP/1.0との違いです。
関連用語
HTTP/1.1と合わせて理解しておきたいネットワーク技術関連の用語です。
- HTTP/2 - 多重化とヘッダー圧縮でHTTP/1.1の課題を解決した後継プロトコル
- HTTP/3 - QUICを基盤としTCPのヘッドオブラインブロッキングまで解消した最新プロトコル
- QUIC - HTTP/3が採用するUDPベースのトランスポートプロトコル
- TCP/IP - HTTP/1.1が通信の土台として利用するトランスポート層プロトコル
- DNS - Hostヘッダーで指定されるドメイン名をIPアドレスに変換する仕組み
- WebSocket - HTTP/1.1のリクエストを起点にプロトコルを切り替える双方向通信技術
- REST - HTTP/1.1のメソッドやステータスコードを活用するAPI設計の代表的なスタイル
- API - HTTP/1.1を輸送プロトコルとして利用することが多いシステム間連携の窓口
- gRPC - HTTP/2を前提として設計された高速なRPCフレームワーク
外部リンク・参考資料
- RFC 9110 - HTTP Semantics(IETF) - HTTPのバージョンに依存しない意味論を定義する現行の基本仕様
- RFC 9112 - HTTP/1.1(IETF) - HTTP/1.1のメッセージ構文と接続管理を定義する現行の正式仕様
- RFC 2616(旧仕様・Obsolete) - 1999年に策定された旧版のHTTP/1.1仕様。歴史的経緯の参照用
- MDN Web Docs - HTTPの概要 - Mozillaが提供するHTTP全般のリファレンスドキュメント
