「ちょっと待った!」が効率を生む?HTTP/1.1の「Expect: 100-continue」を解き明かす
こんにちは!ネットワークの世界へようこそ。
Webブラウザでページを見たり、アプリで画像をアップロードしたり。私たちは普段何気なくインターネットを使っていますが、その裏側では、まるで手紙や荷物を運ぶようなドラマが繰り広げられています。
今回は、そんな通信のやりとりの中で、「大きな荷物を送る前の『ちょっとした確認』」として活躍する「Expect: 100-continue」という仕組みについて、一緒に紐解いていきましょう。
—
1. なぜ「確認」が必要なの?(郵便配達の例え)
想像してみてください。あなたは、ものすごく巨大な段ボール箱(リクエストボディ)を、遠くの友達(サーバー)に送ろうとしています。
もし、中身を確認せずにいきなりその巨大な荷物を送って、もし友達が不在だったら? あるいは、「その荷物は受け取れないよ」と拒否されたら?
その巨大な荷物を運ぶための時間と労力は、すべて無駄になってしまいますよね。
HTTP通信でも同じことが起きます。特に数メガバイト、時にはギガバイトにもなるような大きなデータを送る際、「そもそもこのサーバーは、このデータを今受け取ってくれるのか?」を事前に確認できれば、無駄な通信を減らせます。
これが「Expect: 100-continue」の役割です。直訳すれば「100(続けていいよ)を期待している」という意思表示ですね。
—
2. 「Expect: 100-continue」の通信フロー
このやりとりは、いわば「手紙による事前予約」です。
1. クライアント(あなた): 「これから大きな荷物を送りたいんだけど、受け取れる?(`Expect: 100-continue` をヘッダーに含めて送信)」
2. サーバー(友達): (内容を確認)「OK!準備万端だよ!(`100 Continue` という返事)」
3. クライアント: 「ありがとう!じゃあ本体の大きな荷物を送るね!(データ本体を送信)」
もしサーバーが「今は忙しいから無理!」という場合、すぐにエラー(417 Expectation Failedなど)を返してくれるため、クライアントは巨大なデータを送信する前にストップをかけられます。非常にスマートだと思いませんか?
—
3. 実務で知っておくべき「待機時間」のワナ
ここまでは完璧な仕組みに聞こえますが、ネットワークの世界には「現実的な問題」もつきものです。
実は、クライアントがこの「100」の返事を待っている間、通信は一時停止しています。もしサーバーの反応が少しでも遅かったら、ユーザーは「あれ?画面が固まった?」と感じてしまうかもしれません。
多くのクライアント実装では、この待ち時間に「タイムアウト」を設定しています。例えば「1秒待っても返事がなければ、待つのをやめてそのままデータを送り出そう」といった挙動です。
開発者が意識すべきポイント
この「待つか、すぐ送るか」のバランスは、アプリケーションの応答速度に直結します。
- 高速なネットワーク環境: サーバーの確認を待ったほうが効率的。
- 不安定な環境: 待たずに送ってしまう方が、結果的にユーザーを待たせない場合もある。
—
4. サンプルコードで挙動を確認しよう
実際に、プログラミングでこの通信を制御する際のイメージを見てみましょう。(※言語によってライブラリは異なりますが、概念は同じです)
// JavaScript (Node.jsのfetch的なイメージ)
const options = {
method: ‘POST’,
headers: {
// ここでサーバーに「100-continue」を要求します
‘Expect’: ‘100-continue’,
‘Content-Type’: ‘application/json’
},
body: giantData // とてつもなく大きなデータ
};
// これにより、サーバーから「100 Continue」が来るまで
// 巨大なbodyの送信が一時保留されます
fetch(‘https://api.example.com/upload’, options)
.then(response => {
// サーバーが受け入れOKなら、ここで処理が進みます
console.log(‘アップロード成功!’);
})
.catch(err => {
// サーバーが拒否した場合や、タイムアウトした場合の処理
console.error(‘通信エラー:’, err);
});
—
最後に:ネットワークを俯瞰する視点を持つ
「Expect: 100-continue」は、ネットワークの帯域を無駄にしないための、先人たちの知恵が詰まった「礼儀正しい仕組み」です。
皆さんが今後、Webアプリケーションを作ったり、APIの通信速度に悩んだりしたときは、ぜひこの「荷物を送る前の会話」を思い出してみてください。「今、通信は効率的に行われているかな?」「どこかで待ちぼうけを食らっていないかな?」と想像するだけで、トラブルシューティングの精度はグンと上がります。
ネットワークの世界は奥が深いですが、こうして一つずつ紐解いていけば、決して難しくはありません。これからも一緒に、パケットたちが旅する様子を楽しく学んでいきましょう!
コメント