【入門編】Expect: 100-continueヘッダーの挙動と最適化 – HTTPプロトコル・通信規格実践ガイド

巨大な荷物を送る前の「ちょっと待って!」:Expect: 100-continueの賢い使い方

こんにちは!ネットワークの世界へようこそ。今日は、HTTP通信の中でも少しだけ「お行儀が良い」仕組み、`Expect: 100-continue`についてお話しします。

Web開発をしていると、画像や動画のような「巨大なファイル」をサーバーにアップロードする機会がありますよね。でも、もしサーバーが「ごめん、そのファイル受け取れないよ」と言いたいとき、すでに巨大なデータを送信し終えていたらどうなるでしょう?

通信帯域は無駄になり、時間も電気も浪費してしまいます。そんな悲劇を防ぐための「事前の確認」という知恵を、一緒に紐解いていきましょう。

—

郵便配達でイメージしてみよう

突然ですが、あなたが「重さ30kgの荷物」を遠くの友人に送ろうとしていると想像してください。

1. 普通の方法:とりあえず30kgの荷物を抱えて全力疾走で郵便局へ行き、「これ送ってください!」と頼む。→ 郵便局員:「あ、すいません。今日はもう受付終了です」 → 絶望。
2. 賢い方法:まず受付の窓口で「今から30kgの荷物を持ってきたいんだけど、受け付けてくれる?」と聞く。→ 郵便局員:「はい、大丈夫ですよ。お持ちください」 → 安心して荷物を運ぶ。

この「2」のステップこそが、`Expect: 100-continue`の役割です。

—

内部で起きている「ハンドシェイク」の仕組み

クライアント(ブラウザやアプリ)がリクエストを送るとき、ヘッダーに`Expect: 100-continue`という魔法の言葉を添えます。

通信の流れ(フロー)

1. クライアントからの「打診」:
「今から大きなデータを送ります。受け取れる準備はできていますか?」というメッセージをヘッダーに乗せて送信します。
2. サーバーからの「OKサイン」:
サーバーは「OK、準備万端です!」という意味で、ステータスコード`100 Continue`を返します。
3. 本番データの送信:
このサインを受け取って初めて、クライアントは巨大なデータの中身を送り始めます。

もしサーバー側でエラー(認証失敗や容量オーバーなど)が起きるなら、2の段階で`417 Expectation Failed`などが返ってくるため、無駄なデータ転送を未然に防げるというわけです。

—

実践:コードで見てみよう

例えば、Node.jsの`http`モジュールを使って、この仕組みを意識したリクエストを送るイメージはこんな感じです。

const http = require(‘http’);

const options = {
hostname: ‘example.com’,
port: 80,
path: ‘/upload’,
method: ‘POST’,
headers: {
// ここが今回の主役!
// サーバーに「送ってもいい?」と事前に確認を入れます
‘Expect’: ‘100-continue’,
‘Content-Type’: ‘application/octet-stream’
}
};

const req = http.request(options, (res) => {
// サーバーからのレスポンスを処理
res.on(‘data’, (chunk) => {
console.log(`サーバーからの返事: ${chunk}`);
});
});

// サーバーが「100 Continue」を返した時に発生するイベント
req.on(‘continue’, () => {
console.log(‘サーバーからOKが出たので、データを送り始めます!’);
req.write(‘…巨大なデータの中身…’);
req.end();
});

req.end();

—

ちょっと待って!注意点もあるんです

「じゃあ、全部のリクエストに付ければいいじゃん!」と思うかもしれませんが、ここには「待ち時間」というトレードオフが存在します。

  • レイテンシ(待ち時間)の増加:

確認と応答の往復が増える分、通信を開始するまでに少しだけタイムラグが発生します。

  • サーバーの実装依存:

すべてのサーバーがこの`100-continue`を完璧にサポートしているわけではありません。古いシステムだと、このヘッダーを無視したり、適切に処理できなかったりすることもあります。

使い分けの基準

  • 数KBの小さなデータ:わざわざ確認する時間がもったいないので、そのまま送ってしまいましょう。
  • 数MB〜数GBの巨大なデータ:アップロード失敗時のコストが大きいため、`Expect: 100-continue`の出番です。

—

まとめ:ネットワークは「思いやり」から

ネットワーク通信は、ただデータを送るだけではなく、お互いの状況を察し合う「会話」のようなものです。

`Expect: 100-continue`を使うことは、サーバーに対して「あなたの準備ができるまで、無理にデータを押し付けたりしませんよ」という優しさでもあります。

インフラエンジニアとして、こうしたプロトコルの機微を理解していると、トラブルシューティングの際に「なぜここでパケットが止まっているのか?」という勘所が鋭くなります。これからも一歩ずつ、パケットの旅路を楽しんでいきましょうね!

コメント

タイトルとURLをコピーしました